3745 zpool create should treat -O mountpoint and -m the same
3811 zpool create -o altroot=/xyz -O mountpoint=/mnt ignores
     the mountpoint option
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Approved by: Christopher Siden <christopher.siden@delphix.com>

References:
  https://www.illumos.org/issues/3745
  https://www.illumos.org/issues/3811
  illumos/illumos-gate@8b71377531

Ported-by: Richard Yao <ryao@gentoo.org>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Issue #1775
This commit is contained in:
Will Andrews 2013-06-11 09:13:47 -08:00 committed by Brian Behlendorf
parent d09f25dc66
commit 7bc7f25040
2 changed files with 29 additions and 24 deletions

View File

@ -831,6 +831,7 @@ zpool_do_create(int argc, char **argv)
goto errout; goto errout;
break; break;
case 'm': case 'm':
/* Equivalent to -O mountpoint=optarg */
mountpoint = optarg; mountpoint = optarg;
break; break;
case 'o': case 'o':
@ -869,8 +870,18 @@ zpool_do_create(int argc, char **argv)
*propval = '\0'; *propval = '\0';
propval++; propval++;
if (add_prop_list(optarg, propval, &fsprops, B_FALSE)) /*
* Mountpoints are checked and then added later.
* Uniquely among properties, they can be specified
* more than once, to avoid conflict with -m.
*/
if (0 == strcmp(optarg,
zfs_prop_to_name(ZFS_PROP_MOUNTPOINT))) {
mountpoint = propval;
} else if (add_prop_list(optarg, propval, &fsprops,
B_FALSE)) {
goto errout; goto errout;
}
break; break;
case ':': case ':':
(void) fprintf(stderr, gettext("missing argument for " (void) fprintf(stderr, gettext("missing argument for "
@ -987,6 +998,18 @@ zpool_do_create(int argc, char **argv)
} }
} }
/*
* 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) { if (dryrun) {
/* /*
* For a dry run invocation, print out a basic message and run * For a dry run invocation, print out a basic message and run
@ -1021,21 +1044,19 @@ zpool_do_create(int argc, char **argv)
if (nvlist_exists(props, propname)) if (nvlist_exists(props, propname))
continue; continue;
if (add_prop_list(propname, ZFS_FEATURE_ENABLED, ret = add_prop_list(propname,
&props, B_TRUE) != 0) ZFS_FEATURE_ENABLED, &props, B_TRUE);
if (ret != 0)
goto errout; goto errout;
} }
} }
ret = 1;
if (zpool_create(g_zfs, poolname, if (zpool_create(g_zfs, poolname,
nvroot, props, fsprops) == 0) { nvroot, props, fsprops) == 0) {
zfs_handle_t *pool = zfs_open(g_zfs, poolname, zfs_handle_t *pool = zfs_open(g_zfs, poolname,
ZFS_TYPE_FILESYSTEM); ZFS_TYPE_FILESYSTEM);
if (pool != NULL) { 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) if (zfs_mount(pool, NULL, 0) == 0)
ret = zfs_shareall(pool); ret = zfs_shareall(pool);
zfs_close(pool); zfs_close(pool);

View File

@ -1159,7 +1159,6 @@ zpool_create(libzfs_handle_t *hdl, const char *pool, nvlist_t *nvroot,
nvlist_t *zc_fsprops = NULL; nvlist_t *zc_fsprops = NULL;
nvlist_t *zc_props = NULL; nvlist_t *zc_props = NULL;
char msg[1024]; char msg[1024];
char *altroot;
int ret = -1; int ret = -1;
(void) snprintf(msg, sizeof (msg), dgettext(TEXT_DOMAIN, (void) snprintf(msg, sizeof (msg), dgettext(TEXT_DOMAIN,
@ -1260,21 +1259,6 @@ zpool_create(libzfs_handle_t *hdl, const char *pool, nvlist_t *nvroot,
} }
} }
/*
* If this is an alternate root pool, then we automatically set the
* mountpoint of the root dataset to be '/'.
*/
if (nvlist_lookup_string(props, zpool_prop_to_name(ZPOOL_PROP_ALTROOT),
&altroot) == 0) {
zfs_handle_t *zhp;
verify((zhp = zfs_open(hdl, pool, ZFS_TYPE_DATASET)) != NULL);
verify(zfs_prop_set(zhp, zfs_prop_to_name(ZFS_PROP_MOUNTPOINT),
"/") == 0);
zfs_close(zhp);
}
create_failed: create_failed:
zcmd_free_nvlists(&zc); zcmd_free_nvlists(&zc);
nvlist_free(zc_props); nvlist_free(zc_props);