3491 (void) zvol_remove_minor(zc->zc_name); |
3491 (void) zvol_remove_minor(zc->zc_name); |
3492 return (err); |
3492 return (err); |
3493 } |
3493 } |
3494 |
3494 |
3495 /* |
3495 /* |
3496 * inputs: |
3496 * fsname is name of dataset to rollback (to most recent snapshot) |
3497 * zc_name name of dataset to rollback (to most recent snapshot) |
3497 * |
3498 * |
3498 * innvl is not used. |
3499 * outputs: none |
3499 * |
3500 */ |
3500 * outnvl: "target" -> name of most recent snapshot |
3501 static int |
3501 * } |
3502 zfs_ioc_rollback(zfs_cmd_t *zc) |
3502 */ |
|
3503 /* ARGSUSED */ |
|
3504 static int |
|
3505 zfs_ioc_rollback(const char *fsname, nvlist_t *args, nvlist_t *outnvl) |
3503 { |
3506 { |
3504 zfsvfs_t *zfsvfs; |
3507 zfsvfs_t *zfsvfs; |
3505 int error; |
3508 int error; |
3506 |
3509 |
3507 if (getzfsvfs(zc->zc_name, &zfsvfs) == 0) { |
3510 if (getzfsvfs(fsname, &zfsvfs) == 0) { |
3508 error = zfs_suspend_fs(zfsvfs); |
3511 error = zfs_suspend_fs(zfsvfs); |
3509 if (error == 0) { |
3512 if (error == 0) { |
3510 int resume_err; |
3513 int resume_err; |
3511 |
3514 |
3512 error = dsl_dataset_rollback(zc->zc_name, zfsvfs); |
3515 error = dsl_dataset_rollback(fsname, zfsvfs, outnvl); |
3513 resume_err = zfs_resume_fs(zfsvfs, zc->zc_name); |
3516 resume_err = zfs_resume_fs(zfsvfs, fsname); |
3514 error = error ? error : resume_err; |
3517 error = error ? error : resume_err; |
3515 } |
3518 } |
3516 VFS_RELE(zfsvfs->z_vfs); |
3519 VFS_RELE(zfsvfs->z_vfs); |
3517 } else { |
3520 } else { |
3518 error = dsl_dataset_rollback(zc->zc_name, NULL); |
3521 error = dsl_dataset_rollback(fsname, NULL, outnvl); |
3519 } |
3522 } |
3520 return (error); |
3523 return (error); |
3521 } |
3524 } |
3522 |
3525 |
3523 static int |
3526 static int |
5324 POOL_CHECK_SUSPENDED | POOL_CHECK_READONLY, B_TRUE, B_TRUE); |
5327 POOL_CHECK_SUSPENDED | POOL_CHECK_READONLY, B_TRUE, B_TRUE); |
5325 |
5328 |
5326 zfs_ioctl_register("get_holds", ZFS_IOC_GET_HOLDS, |
5329 zfs_ioctl_register("get_holds", ZFS_IOC_GET_HOLDS, |
5327 zfs_ioc_get_holds, zfs_secpolicy_read, DATASET_NAME, |
5330 zfs_ioc_get_holds, zfs_secpolicy_read, DATASET_NAME, |
5328 POOL_CHECK_SUSPENDED, B_FALSE, B_FALSE); |
5331 POOL_CHECK_SUSPENDED, B_FALSE, B_FALSE); |
|
5332 |
|
5333 zfs_ioctl_register("rollback", ZFS_IOC_ROLLBACK, |
|
5334 zfs_ioc_rollback, zfs_secpolicy_rollback, DATASET_NAME, |
|
5335 POOL_CHECK_SUSPENDED | POOL_CHECK_READONLY, B_FALSE, B_TRUE); |
5329 |
5336 |
5330 /* IOCTLS that use the legacy function signature */ |
5337 /* IOCTLS that use the legacy function signature */ |
5331 |
5338 |
5332 zfs_ioctl_register_legacy(ZFS_IOC_POOL_FREEZE, zfs_ioc_pool_freeze, |
5339 zfs_ioctl_register_legacy(ZFS_IOC_POOL_FREEZE, zfs_ioc_pool_freeze, |
5333 zfs_secpolicy_config, NO_NAME, B_FALSE, POOL_CHECK_READONLY); |
5340 zfs_secpolicy_config, NO_NAME, B_FALSE, POOL_CHECK_READONLY); |
5436 |
5443 |
5437 zfs_ioctl_register_dataset_modify(ZFS_IOC_SET_PROP, zfs_ioc_set_prop, |
5444 zfs_ioctl_register_dataset_modify(ZFS_IOC_SET_PROP, zfs_ioc_set_prop, |
5438 zfs_secpolicy_none); |
5445 zfs_secpolicy_none); |
5439 zfs_ioctl_register_dataset_modify(ZFS_IOC_DESTROY, zfs_ioc_destroy, |
5446 zfs_ioctl_register_dataset_modify(ZFS_IOC_DESTROY, zfs_ioc_destroy, |
5440 zfs_secpolicy_destroy); |
5447 zfs_secpolicy_destroy); |
5441 zfs_ioctl_register_dataset_modify(ZFS_IOC_ROLLBACK, zfs_ioc_rollback, |
|
5442 zfs_secpolicy_rollback); |
|
5443 zfs_ioctl_register_dataset_modify(ZFS_IOC_RENAME, zfs_ioc_rename, |
5448 zfs_ioctl_register_dataset_modify(ZFS_IOC_RENAME, zfs_ioc_rename, |
5444 zfs_secpolicy_rename); |
5449 zfs_secpolicy_rename); |
5445 zfs_ioctl_register_dataset_modify(ZFS_IOC_RECV, zfs_ioc_recv, |
5450 zfs_ioctl_register_dataset_modify(ZFS_IOC_RECV, zfs_ioc_recv, |
5446 zfs_secpolicy_recv); |
5451 zfs_secpolicy_recv); |
5447 zfs_ioctl_register_dataset_modify(ZFS_IOC_PROMOTE, zfs_ioc_promote, |
5452 zfs_ioctl_register_dataset_modify(ZFS_IOC_PROMOTE, zfs_ioc_promote, |