]> granicus.if.org Git - zfs/commitdiff
Illumos 4953, 4954, 4955
authorMatthew Ahrens <mahrens@delphix.com>
Thu, 14 Jan 2016 00:10:38 +0000 (16:10 -0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 15 Jan 2016 23:38:36 +0000 (15:38 -0800)
4953 zfs rename <snapshot> need not involve libshare
4954 "zfs create" need not involve libshare if we are not sharing
4955 libshare's get_zfs_dataset need not sort the datasets
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed by: Sebastien Roy <sebastien.roy@delphix.com>
Reviewed by: Dan McDonald <danmcd@omniti.com>
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
Approved by: Garrett D'Amore <garrett@damore.org>

References:
  https://www.illumos.org/issues/4953
  https://www.illumos.org/issues/4954
  https://www.illumos.org/issues/4955
  https://github.com/illumos/illumos-gate/commit/33cde0d

Porting notes:
- Dropped qsort libshare_zfs.c hunk, no equivalent ZoL code.

Ported-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #4219

lib/libzfs/libzfs_dataset.c
lib/libzfs/libzfs_mount.c

index 7518a3bcae40499a19ae91f79fee19f3b34d9ba6..d2489c11a44522c781d1021f336b36176d0f6710 100644 (file)
@@ -3992,7 +3992,6 @@ zfs_rename(zfs_handle_t *zhp, const char *target, boolean_t recursive,
        }
 
        if (recursive) {
-
                parentname = zfs_strdup(zhp->zfs_hdl, zhp->zfs_name);
                if (parentname == NULL) {
                        ret = -1;
@@ -4005,8 +4004,7 @@ zfs_rename(zfs_handle_t *zhp, const char *target, boolean_t recursive,
                        ret = -1;
                        goto error;
                }
-
-       } else {
+       } else if (zhp->zfs_type != ZFS_TYPE_SNAPSHOT) {
                if ((cl = changelist_gather(zhp, ZFS_PROP_NAME, 0,
                    force_unmount ? MS_FORCE : 0)) == NULL)
                        return (-1);
@@ -4055,23 +4053,23 @@ zfs_rename(zfs_handle_t *zhp, const char *target, boolean_t recursive,
                 * On failure, we still want to remount any filesystems that
                 * were previously mounted, so we don't alter the system state.
                 */
-               if (!recursive)
+               if (cl != NULL)
                        (void) changelist_postfix(cl);
        } else {
-               if (!recursive) {
+               if (cl != NULL) {
                        changelist_rename(cl, zfs_get_name(zhp), target);
                        ret = changelist_postfix(cl);
                }
        }
 
 error:
-       if (parentname) {
+       if (parentname != NULL) {
                free(parentname);
        }
-       if (zhrp) {
+       if (zhrp != NULL) {
                zfs_close(zhrp);
        }
-       if (cl) {
+       if (cl != NULL) {
                changelist_free(cl);
        }
        return (ret);
index 41ab861314378ef23a9b6989553c10896e46c299..b6c47a25daba39e590230999194746d594147f68 100644 (file)
@@ -22,6 +22,7 @@
 /*
  * Copyright 2015 Nexenta Systems, Inc.  All rights reserved.
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014 by Delphix. All rights reserved.
  */
 
 /*
@@ -745,13 +746,6 @@ zfs_share_proto(zfs_handle_t *zhp, zfs_share_proto_t *proto)
        if (!zfs_is_mountable(zhp, mountpoint, sizeof (mountpoint), NULL))
                return (0);
 
-       if ((ret = zfs_init_libshare(hdl, SA_INIT_SHARE_API)) != SA_OK) {
-               (void) zfs_error_fmt(hdl, EZFS_SHARENFSFAILED,
-                   dgettext(TEXT_DOMAIN, "cannot share '%s': %s"),
-                   zfs_get_name(zhp), sa_errorstr(ret));
-               return (-1);
-       }
-
        for (curr_proto = proto; *curr_proto != PROTO_END; curr_proto++) {
                /*
                 * Return success if there are no share options.
@@ -762,6 +756,14 @@ zfs_share_proto(zfs_handle_t *zhp, zfs_share_proto_t *proto)
                    strcmp(shareopts, "off") == 0)
                        continue;
 
+               ret = zfs_init_libshare(hdl, SA_INIT_SHARE_API);
+               if (ret != SA_OK) {
+                       (void) zfs_error_fmt(hdl, EZFS_SHARENFSFAILED,
+                           dgettext(TEXT_DOMAIN, "cannot share '%s': %s"),
+                           zfs_get_name(zhp), sa_errorstr(ret));
+                       return (-1);
+               }
+
                /*
                 * If the 'zoned' property is set, then zfs_is_mountable()
                 * will have already bailed out if we are in the global zone.