usr/src/uts/common/fs/zfs/zfs_ioctl.c
changeset 14220 f7523d207d74
parent 14199 b0233279e3fc
child 14255 98413c8cf54d
equal deleted inserted replaced
14219:9178198c46b5 14220:f7523d207d74
  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,