Print this page
3996 want a libzfs_core API to rollback to latest snapshot
Reviewed by: Christopher Siden <christopher.siden@delphix.com>
Reviewed by: Adam Leventhal <ahl@delphix.com>
Reviewed by: George Wilson <george.wilson@delphix.com>
        
*** 3491,3523 ****
                  (void) zvol_remove_minor(zc->zc_name);
          return (err);
  }
  
  /*
!  * inputs:
!  * zc_name      name of dataset to rollback (to most recent snapshot)
   *
!  * outputs:     none
   */
  static int
! zfs_ioc_rollback(zfs_cmd_t *zc)
  {
          zfsvfs_t *zfsvfs;
          int error;
  
!         if (getzfsvfs(zc->zc_name, &zfsvfs) == 0) {
                  error = zfs_suspend_fs(zfsvfs);
                  if (error == 0) {
                          int resume_err;
  
!                         error = dsl_dataset_rollback(zc->zc_name, zfsvfs);
!                         resume_err = zfs_resume_fs(zfsvfs, zc->zc_name);
                          error = error ? error : resume_err;
                  }
                  VFS_RELE(zfsvfs->z_vfs);
          } else {
!                 error = dsl_dataset_rollback(zc->zc_name, NULL);
          }
          return (error);
  }
  
  static int
--- 3491,3526 ----
                  (void) zvol_remove_minor(zc->zc_name);
          return (err);
  }
  
  /*
!  * fsname is name of dataset to rollback (to most recent snapshot)
   *
!  * innvl is not used.
!  *
!  * outnvl: "target" -> name of most recent snapshot
!  * }
   */
+ /* ARGSUSED */
  static int
! zfs_ioc_rollback(const char *fsname, nvlist_t *args, nvlist_t *outnvl)
  {
          zfsvfs_t *zfsvfs;
          int error;
  
!         if (getzfsvfs(fsname, &zfsvfs) == 0) {
                  error = zfs_suspend_fs(zfsvfs);
                  if (error == 0) {
                          int resume_err;
  
!                         error = dsl_dataset_rollback(fsname, zfsvfs, outnvl);
!                         resume_err = zfs_resume_fs(zfsvfs, fsname);
                          error = error ? error : resume_err;
                  }
                  VFS_RELE(zfsvfs->z_vfs);
          } else {
!                 error = dsl_dataset_rollback(fsname, NULL, outnvl);
          }
          return (error);
  }
  
  static int
*** 5325,5334 ****
--- 5328,5341 ----
  
          zfs_ioctl_register("get_holds", ZFS_IOC_GET_HOLDS,
              zfs_ioc_get_holds, zfs_secpolicy_read, DATASET_NAME,
              POOL_CHECK_SUSPENDED, B_FALSE, B_FALSE);
  
+         zfs_ioctl_register("rollback", ZFS_IOC_ROLLBACK,
+             zfs_ioc_rollback, zfs_secpolicy_rollback, DATASET_NAME,
+             POOL_CHECK_SUSPENDED | POOL_CHECK_READONLY, B_FALSE, B_TRUE);
+ 
          /* IOCTLS that use the legacy function signature */
  
          zfs_ioctl_register_legacy(ZFS_IOC_POOL_FREEZE, zfs_ioc_pool_freeze,
              zfs_secpolicy_config, NO_NAME, B_FALSE, POOL_CHECK_READONLY);
  
*** 5436,5447 ****
  
          zfs_ioctl_register_dataset_modify(ZFS_IOC_SET_PROP, zfs_ioc_set_prop,
              zfs_secpolicy_none);
          zfs_ioctl_register_dataset_modify(ZFS_IOC_DESTROY, zfs_ioc_destroy,
              zfs_secpolicy_destroy);
-         zfs_ioctl_register_dataset_modify(ZFS_IOC_ROLLBACK, zfs_ioc_rollback,
-             zfs_secpolicy_rollback);
          zfs_ioctl_register_dataset_modify(ZFS_IOC_RENAME, zfs_ioc_rename,
              zfs_secpolicy_rename);
          zfs_ioctl_register_dataset_modify(ZFS_IOC_RECV, zfs_ioc_recv,
              zfs_secpolicy_recv);
          zfs_ioctl_register_dataset_modify(ZFS_IOC_PROMOTE, zfs_ioc_promote,
--- 5443,5452 ----