Print this page
3745 zpool create should treat -O mountpoint and -m the same
Submitted by:   Will Andrews <willa@spectralogic.com>
Submitted by:   Alan Somers <alans@spectralogic.com>
Reviewed by:    Matthew Ahrens <mahrens@delphix.com>

@@ -675,10 +675,11 @@
                         if (add_prop_list(zpool_prop_to_name(
                             ZPOOL_PROP_CACHEFILE), "none", &props, B_TRUE))
                                 goto errout;
                         break;
                 case 'm':
+                        /* Equivalent to -O mountpoint=optarg */
                         mountpoint = optarg;
                         break;
                 case 'o':
                         if ((propval = strchr(optarg, '=')) == NULL) {
                                 (void) fprintf(stderr, gettext("missing "

@@ -713,10 +714,18 @@
                                 goto errout;
                         }
                         *propval = '\0';
                         propval++;
 
+                        /*
+                         * Mountpoints are checked and then added later.
+                         * Uniquely among properties, they can be specified
+                         * more than once, to avoid conflict with -m.
+                         */
+                        if (!strcmp(optarg,
+                            zfs_prop_to_name(ZFS_PROP_MOUNTPOINT)))
+                                mountpoint = propval;
                         if (add_prop_list(optarg, propval, &fsprops, B_FALSE))
                                 goto errout;
                         break;
                 case ':':
                         (void) fprintf(stderr, gettext("missing argument for "

@@ -831,10 +840,22 @@
                                 goto errout;
                         }
                 }
         }
 
+        /*
+         * Now that the mountpoint's validity has been checked, ensure that
+         * the property is set appropriately prior to creating the pool.
+         */
+        if (mountpoint != NULL) {
+                ret = add_prop_list(zfs_prop_to_name(ZFS_PROP_MOUNTPOINT),
+                    mountpoint, &fsprops, B_FALSE);
+                if (ret != 0)
+                        goto errout;
+        }
+
+        ret = 1;
         if (dryrun) {
                 /*
                  * For a dry run invocation, print out a basic message and run
                  * through all the vdevs in the list and print out in an
                  * appropriate hierarchy.

@@ -865,25 +886,21 @@
                                  * on the command line.
                                  */
                                 if (nvlist_exists(props, propname))
                                         continue;
 
-                                if (add_prop_list(propname, ZFS_FEATURE_ENABLED,
-                                    &props, B_TRUE) != 0)
+                                ret = add_prop_list(propname,
+                                    ZFS_FEATURE_ENABLED, &props, B_TRUE);
+                                if (ret != 0)
                                         goto errout;
                         }
                 }
                 if (zpool_create(g_zfs, poolname,
                     nvroot, props, fsprops) == 0) {
                         zfs_handle_t *pool = zfs_open(g_zfs, poolname,
                             ZFS_TYPE_FILESYSTEM);
                         if (pool != NULL) {
-                                if (mountpoint != NULL)
-                                        verify(zfs_prop_set(pool,
-                                            zfs_prop_to_name(
-                                            ZFS_PROP_MOUNTPOINT),
-                                            mountpoint) == 0);
                                 if (zfs_mount(pool, NULL, 0) == 0)
                                         ret = zfs_shareall(pool);
                                 zfs_close(pool);
                         }
                 } else if (libzfs_errno(g_zfs) == EZFS_INVALIDNAME) {