Author: avg
Date: Wed Dec 26 07:57:21 2018
New Revision: 342469
URL: https://svnweb.freebsd.org/changeset/base/342469

Log:
  9630 add lzc_rename and lzc_destroy to libzfs_core
  
  illumos/illumos-gate@049ba636fa37a2892809192fc671bff9158a01cd
  
https://github.com/illumos/illumos-gate/commit/049ba636fa37a2892809192fc671bff9158a01cd
  
  https://www.illumos.org/issues/9630
    Rename and destroy are very useful operations that deserve to be in
    libzfs_core.  And they are not hard to implement too.
  
  Reviewed by: Andy Stormont <astorm...@racktopsystems.com>
  Reviewed by: Matt Ahrens <m...@delphix.com>
  Reviewed by: Serapheim Dimitropoulos <serapheim.dimi...@delphix.com>
  Approved by: Dan McDonald <dan...@joyent.com>
  Author: Andriy Gapon <a...@freebsd.org>

Modified:
  vendor/illumos/dist/lib/libzfs/common/libzfs_dataset.c
  vendor/illumos/dist/lib/libzfs/common/libzfs_sendrecv.c
  vendor/illumos/dist/lib/libzfs_core/common/libzfs_core.c
  vendor/illumos/dist/lib/libzfs_core/common/libzfs_core.h

Changes in other areas also in this revision:
Modified:
  vendor-sys/illumos/dist/uts/common/fs/zfs/zfs_ioctl.c

Modified: vendor/illumos/dist/lib/libzfs/common/libzfs_dataset.c
==============================================================================
--- vendor/illumos/dist/lib/libzfs/common/libzfs_dataset.c      Wed Dec 26 
04:06:16 2018        (r342468)
+++ vendor/illumos/dist/lib/libzfs/common/libzfs_dataset.c      Wed Dec 26 
07:57:21 2018        (r342469)
@@ -3609,32 +3609,34 @@ zfs_create(libzfs_handle_t *hdl, const char *path, zfs
 int
 zfs_destroy(zfs_handle_t *zhp, boolean_t defer)
 {
-       zfs_cmd_t zc = { 0 };
+       int error;
 
+       if (zhp->zfs_type != ZFS_TYPE_SNAPSHOT && defer)
+               return (EINVAL);
+
        if (zhp->zfs_type == ZFS_TYPE_BOOKMARK) {
                nvlist_t *nv = fnvlist_alloc();
                fnvlist_add_boolean(nv, zhp->zfs_name);
-               int error = lzc_destroy_bookmarks(nv, NULL);
+               error = lzc_destroy_bookmarks(nv, NULL);
                fnvlist_free(nv);
                if (error != 0) {
-                       return (zfs_standard_error_fmt(zhp->zfs_hdl, errno,
+                       return (zfs_standard_error_fmt(zhp->zfs_hdl, error,
                            dgettext(TEXT_DOMAIN, "cannot destroy '%s'"),
                            zhp->zfs_name));
                }
                return (0);
        }
 
-       (void) strlcpy(zc.zc_name, zhp->zfs_name, sizeof (zc.zc_name));
-
-       if (ZFS_IS_VOLUME(zhp)) {
-               zc.zc_objset_type = DMU_OST_ZVOL;
+       if (zhp->zfs_type == ZFS_TYPE_SNAPSHOT) {
+               nvlist_t *nv = fnvlist_alloc();
+               fnvlist_add_boolean(nv, zhp->zfs_name);
+               error = lzc_destroy_snaps(nv, defer, NULL);
+               fnvlist_free(nv);
        } else {
-               zc.zc_objset_type = DMU_OST_ZFS;
+               error = lzc_destroy(zhp->zfs_name);
        }
 
-       zc.zc_defer_destroy = defer;
-       if (zfs_ioctl(zhp->zfs_hdl, ZFS_IOC_DESTROY, &zc) != 0 &&
-           errno != ENOENT) {
+       if (error != 0 && error != ENOENT) {
                return (zfs_standard_error_fmt(zhp->zfs_hdl, errno,
                    dgettext(TEXT_DOMAIN, "cannot destroy '%s'"),
                    zhp->zfs_name));

Modified: vendor/illumos/dist/lib/libzfs/common/libzfs_sendrecv.c
==============================================================================
--- vendor/illumos/dist/lib/libzfs/common/libzfs_sendrecv.c     Wed Dec 26 
04:06:16 2018        (r342468)
+++ vendor/illumos/dist/lib/libzfs/common/libzfs_sendrecv.c     Wed Dec 26 
07:57:21 2018        (r342469)
@@ -2133,7 +2133,6 @@ recv_rename(libzfs_handle_t *hdl, const char *name, co
     int baselen, char *newname, recvflags_t *flags)
 {
        static int seq;
-       zfs_cmd_t zc = { 0 };
        int err;
        prop_changelist_t *clp;
        zfs_handle_t *zhp;
@@ -2150,19 +2149,13 @@ recv_rename(libzfs_handle_t *hdl, const char *name, co
        if (err)
                return (err);
 
-       zc.zc_objset_type = DMU_OST_ZFS;
-       (void) strlcpy(zc.zc_name, name, sizeof (zc.zc_name));
-
        if (tryname) {
                (void) strcpy(newname, tryname);
-
-               (void) strlcpy(zc.zc_value, tryname, sizeof (zc.zc_value));
-
                if (flags->verbose) {
                        (void) printf("attempting rename %s to %s\n",
-                           zc.zc_name, zc.zc_value);
+                           name, newname);
                }
-               err = ioctl(hdl->libzfs_fd, ZFS_IOC_RENAME, &zc);
+               err = lzc_rename(name, newname);
                if (err == 0)
                        changelist_rename(clp, name, tryname);
        } else {
@@ -2174,13 +2167,11 @@ recv_rename(libzfs_handle_t *hdl, const char *name, co
 
                (void) snprintf(newname, ZFS_MAX_DATASET_NAME_LEN,
                    "%.*srecv-%u-%u", baselen, name, getpid(), seq);
-               (void) strlcpy(zc.zc_value, newname, sizeof (zc.zc_value));
-
                if (flags->verbose) {
                        (void) printf("failed - trying rename %s to %s\n",
-                           zc.zc_name, zc.zc_value);
+                           name, newname);
                }
-               err = ioctl(hdl->libzfs_fd, ZFS_IOC_RENAME, &zc);
+               err = lzc_rename(name, newname);
                if (err == 0)
                        changelist_rename(clp, name, newname);
                if (err && flags->verbose) {
@@ -2205,7 +2196,6 @@ static int
 recv_destroy(libzfs_handle_t *hdl, const char *name, int baselen,
     char *newname, recvflags_t *flags)
 {
-       zfs_cmd_t zc = { 0 };
        int err = 0;
        prop_changelist_t *clp;
        zfs_handle_t *zhp;
@@ -2228,17 +2218,20 @@ recv_destroy(libzfs_handle_t *hdl, const char *name, i
        if (err)
                return (err);
 
-       zc.zc_objset_type = DMU_OST_ZFS;
-       zc.zc_defer_destroy = defer;
-       (void) strlcpy(zc.zc_name, name, sizeof (zc.zc_name));
-
        if (flags->verbose)
-               (void) printf("attempting destroy %s\n", zc.zc_name);
-       err = ioctl(hdl->libzfs_fd, ZFS_IOC_DESTROY, &zc);
+               (void) printf("attempting destroy %s\n", name);
+       if (zhp->zfs_type == ZFS_TYPE_SNAPSHOT) {
+               nvlist_t *nv = fnvlist_alloc();
+               fnvlist_add_boolean(nv, name);
+               err = lzc_destroy_snaps(nv, defer, NULL);
+               fnvlist_free(nv);
+       } else {
+               err = lzc_destroy(name);
+       }
        if (err == 0) {
                if (flags->verbose)
                        (void) printf("success\n");
-               changelist_remove(clp, zc.zc_name);
+               changelist_remove(clp, name);
        }
 
        (void) changelist_postfix(clp);

Modified: vendor/illumos/dist/lib/libzfs_core/common/libzfs_core.c
==============================================================================
--- vendor/illumos/dist/lib/libzfs_core/common/libzfs_core.c    Wed Dec 26 
04:06:16 2018        (r342468)
+++ vendor/illumos/dist/lib/libzfs_core/common/libzfs_core.c    Wed Dec 26 
07:57:21 2018        (r342469)
@@ -249,6 +249,34 @@ lzc_remap(const char *fsname)
        return (error);
 }
 
+int
+lzc_rename(const char *source, const char *target)
+{
+       zfs_cmd_t zc = { 0 };
+       int error;
+
+       ASSERT3S(g_refcount, >, 0);
+       VERIFY3S(g_fd, !=, -1);
+
+       (void) strlcpy(zc.zc_name, source, sizeof (zc.zc_name));
+       (void) strlcpy(zc.zc_value, target, sizeof (zc.zc_value));
+       error = ioctl(g_fd, ZFS_IOC_RENAME, &zc);
+       if (error != 0)
+               error = errno;
+       return (error);
+}
+
+int
+lzc_destroy(const char *fsname)
+{
+       int error;
+
+       nvlist_t *args = fnvlist_alloc();
+       error = lzc_ioctl(ZFS_IOC_DESTROY, fsname, args, NULL);
+       nvlist_free(args);
+       return (error);
+}
+
 /*
  * Creates snapshots.
  *

Modified: vendor/illumos/dist/lib/libzfs_core/common/libzfs_core.h
==============================================================================
--- vendor/illumos/dist/lib/libzfs_core/common/libzfs_core.h    Wed Dec 26 
04:06:16 2018        (r342468)
+++ vendor/illumos/dist/lib/libzfs_core/common/libzfs_core.h    Wed Dec 26 
07:57:21 2018        (r342469)
@@ -91,6 +91,9 @@ boolean_t lzc_exists(const char *);
 int lzc_rollback(const char *, char *, int);
 int lzc_rollback_to(const char *, const char *);
 
+int lzc_rename(const char *, const char *);
+int lzc_destroy(const char *);
+
 int lzc_channel_program(const char *, const char *, uint64_t,
     uint64_t, nvlist_t *, nvlist_t **);
 int lzc_channel_program_nosync(const char *, const char *, uint64_t,
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to