mirror of
https://git.FreeBSD.org/src.git
synced 2025-01-16 15:11:52 +00:00
5882 Temporary pool names
illumos/illumos-gate@04e563565204e5635652
https://www.illumos.org/issues/5882 This is an import of the temporary pool names functionality from ZoL: https://github.com/zfsonlinux/zfs/commit/e2282ef57e
https://github.com/zfsonlinux/zfs/commit/26b42f3f9d
https://github.com/zfsonlinux/zfs/commit/2f3ec90061
https://github.com/zfsonlinux/zfs/commit/00d2a8c92f
https://github.com/zfsonlinux/zfs/commit/83e9986f6e
https://github.com/zfsonlinux/zfs/commit/023bbe6f01
It is intended to assist the creation and management of virtual machines that have their rootfs on ZFS on hosts that also have their rootfs on ZFS. These situations cause SPA namespace collisions when the standard name rpool is used in both cases. The solution is either to give each guest pool a name unique to the host, which is not always desireable, or boot a VM environment containing an ISO image to install it, which is cumbersome. As a side note, this commit includes the removal of `zpool import -r`, which previously did nothing. patch [Magnifier] (14.3 KB) Richard Yao, 2015-04-30 04:33 PM Reviewed by: Matt Ahrens <matt@delphix.com> Reviewed by: Igor Kozhukhov <igor@dilos.org> Reviewed by: John Kennedy <john.kennedy@delphix.com> Approved by: Dan McDonald <danmcd@joyent.com> Author: Andriy Gapon <agapon@panzura.com>
This commit is contained in:
parent
48114cb5be
commit
207bd3fed6
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/vendor-sys/illumos/dist/; revision=342532
@ -220,8 +220,9 @@ get_usage(zpool_help_t idx)
|
||||
case HELP_CREATE:
|
||||
return (gettext("\tcreate [-fnd] [-B] "
|
||||
"[-o property=value] ... \n"
|
||||
"\t [-O file-system-property=value] ... \n"
|
||||
"\t [-m mountpoint] [-R root] <pool> <vdev> ...\n"));
|
||||
"\t [-O file-system-property=value] ...\n"
|
||||
"\t [-m mountpoint] [-R root] [-t tempname] "
|
||||
"<pool> <vdev> ...\n"));
|
||||
case HELP_CHECKPOINT:
|
||||
return (gettext("\tcheckpoint [--discard] <pool> ...\n"));
|
||||
case HELP_DESTROY:
|
||||
@ -239,7 +240,7 @@ get_usage(zpool_help_t idx)
|
||||
"[-R root] [-F [-n]] -a\n"
|
||||
"\timport [-o mntopts] [-o property=value] ... \n"
|
||||
"\t [-d dir | -c cachefile] [-D] [-f] [-m] [-N] "
|
||||
"[-R root] [-F [-n]]\n"
|
||||
"[-R root] [-F [-n]] [-t]\n"
|
||||
"\t [--rewind-to-checkpoint] <pool | id> [newpool]\n"));
|
||||
case HELP_IOSTAT:
|
||||
return (gettext("\tiostat [-v] [-T d|u] [pool] ... [interval "
|
||||
@ -491,6 +492,21 @@ add_prop_list(const char *propname, char *propval, nvlist_t **props,
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Set a default property pair (name, string-value) in a property nvlist
|
||||
*/
|
||||
static int
|
||||
add_prop_list_default(const char *propname, char *propval, nvlist_t **props,
|
||||
boolean_t poolprop)
|
||||
{
|
||||
char *pval;
|
||||
|
||||
if (nvlist_lookup_string(*props, propname, &pval) == 0)
|
||||
return (0);
|
||||
|
||||
return (add_prop_list(propname, propval, props, poolprop));
|
||||
}
|
||||
|
||||
/*
|
||||
* zpool add [-fn] <pool> <vdev> ...
|
||||
*
|
||||
@ -849,15 +865,16 @@ zpool_do_labelclear(int argc, char **argv)
|
||||
/*
|
||||
* zpool create [-fnd] [-B] [-o property=value] ...
|
||||
* [-O file-system-property=value] ...
|
||||
* [-R root] [-m mountpoint] <pool> <dev> ...
|
||||
* [-R root] [-m mountpoint] [-t tempname] <pool> <dev> ...
|
||||
*
|
||||
* -B Create boot partition.
|
||||
* -f Force creation, even if devices appear in use
|
||||
* -n Do not create the pool, but display the resulting layout if it
|
||||
* were to be created.
|
||||
* -R Create a pool under an alternate root
|
||||
* -m Set default mountpoint for the root dataset. By default it's
|
||||
* -R Create a pool under an alternate root
|
||||
* -m Set default mountpoint for the root dataset. By default it's
|
||||
* '/<pool>'
|
||||
* -t Use the temporary name until the pool is exported.
|
||||
* -o Set property=value.
|
||||
* -d Don't automatically enable all supported pool features
|
||||
* (individual features can be enabled with -o).
|
||||
@ -881,6 +898,7 @@ zpool_do_create(int argc, char **argv)
|
||||
int c;
|
||||
nvlist_t *nvroot = NULL;
|
||||
char *poolname;
|
||||
char *tname = NULL;
|
||||
int ret = 1;
|
||||
char *altroot = NULL;
|
||||
char *mountpoint = NULL;
|
||||
@ -889,7 +907,7 @@ zpool_do_create(int argc, char **argv)
|
||||
char *propval;
|
||||
|
||||
/* check options */
|
||||
while ((c = getopt(argc, argv, ":fndBR:m:o:O:")) != -1) {
|
||||
while ((c = getopt(argc, argv, ":fndBR:m:o:O:t:")) != -1) {
|
||||
switch (c) {
|
||||
case 'f':
|
||||
force = B_TRUE;
|
||||
@ -914,11 +932,7 @@ zpool_do_create(int argc, char **argv)
|
||||
if (add_prop_list(zpool_prop_to_name(
|
||||
ZPOOL_PROP_ALTROOT), optarg, &props, B_TRUE))
|
||||
goto errout;
|
||||
if (nvlist_lookup_string(props,
|
||||
zpool_prop_to_name(ZPOOL_PROP_CACHEFILE),
|
||||
&propval) == 0)
|
||||
break;
|
||||
if (add_prop_list(zpool_prop_to_name(
|
||||
if (add_prop_list_default(zpool_prop_to_name(
|
||||
ZPOOL_PROP_CACHEFILE), "none", &props, B_TRUE))
|
||||
goto errout;
|
||||
break;
|
||||
@ -991,6 +1005,27 @@ zpool_do_create(int argc, char **argv)
|
||||
goto errout;
|
||||
}
|
||||
break;
|
||||
case 't':
|
||||
/*
|
||||
* Sanity check temporary pool name.
|
||||
*/
|
||||
if (strchr(optarg, '/') != NULL) {
|
||||
(void) fprintf(stderr, gettext("cannot create "
|
||||
"'%s': invalid character '/' in temporary "
|
||||
"name\n"), optarg);
|
||||
(void) fprintf(stderr, gettext("use 'zfs "
|
||||
"create' to create a dataset\n"));
|
||||
goto errout;
|
||||
}
|
||||
|
||||
if (add_prop_list(zpool_prop_to_name(
|
||||
ZPOOL_PROP_TNAME), optarg, &props, B_TRUE))
|
||||
goto errout;
|
||||
if (add_prop_list_default(zpool_prop_to_name(
|
||||
ZPOOL_PROP_CACHEFILE), "none", &props, B_TRUE))
|
||||
goto errout;
|
||||
tname = optarg;
|
||||
break;
|
||||
case ':':
|
||||
(void) fprintf(stderr, gettext("missing argument for "
|
||||
"'%c' option\n"), optopt);
|
||||
@ -1196,8 +1231,8 @@ zpool_do_create(int argc, char **argv)
|
||||
ret = 1;
|
||||
if (zpool_create(g_zfs, poolname,
|
||||
nvroot, props, fsprops) == 0) {
|
||||
zfs_handle_t *pool = zfs_open(g_zfs, poolname,
|
||||
ZFS_TYPE_FILESYSTEM);
|
||||
zfs_handle_t *pool = zfs_open(g_zfs,
|
||||
tname ? tname : poolname, ZFS_TYPE_FILESYSTEM);
|
||||
if (pool != NULL) {
|
||||
if (zfs_mount(pool, NULL, 0) == 0)
|
||||
ret = zfs_shareall(pool);
|
||||
@ -1224,7 +1259,7 @@ zpool_do_create(int argc, char **argv)
|
||||
/*
|
||||
* zpool destroy <pool>
|
||||
*
|
||||
* -f Forcefully unmount any datasets
|
||||
* -f Forcefully unmount any datasets
|
||||
*
|
||||
* Destroy the given pool. Automatically unmounts any datasets in the pool.
|
||||
*/
|
||||
@ -2098,8 +2133,8 @@ do_import(nvlist_t *config, const char *newname, const char *mntopts,
|
||||
* zpool checkpoint <pool>
|
||||
* checkpoint --discard <pool>
|
||||
*
|
||||
* -d Discard the checkpoint from a checkpointed
|
||||
* --discard pool.
|
||||
* -d Discard the checkpoint from a checkpointed
|
||||
* --discard pool.
|
||||
*
|
||||
* Checkpoints the specified pool, by taking a "snapshot" of its
|
||||
* current state. A pool can only have one checkpoint at a time.
|
||||
@ -2172,44 +2207,48 @@ zpool_do_checkpoint(int argc, char **argv)
|
||||
* import [-o mntopts] [-o prop=value] ... [-R root] [-D]
|
||||
* [-d dir | -c cachefile] [-f] -a
|
||||
* import [-o mntopts] [-o prop=value] ... [-R root] [-D]
|
||||
* [-d dir | -c cachefile] [-f] [-n] [-F] <pool | id> [newpool]
|
||||
* [-d dir | -c cachefile] [-f] [-n] [-F] [-t]
|
||||
* <pool | id> [newpool]
|
||||
*
|
||||
* -c Read pool information from a cachefile instead of searching
|
||||
* -c Read pool information from a cachefile instead of searching
|
||||
* devices.
|
||||
*
|
||||
* -d Scan in a specific directory, other than /dev/dsk. More than
|
||||
* -d Scan in a specific directory, other than /dev/dsk. More than
|
||||
* one directory can be specified using multiple '-d' options.
|
||||
*
|
||||
* -D Scan for previously destroyed pools or import all or only
|
||||
* specified destroyed pools.
|
||||
* -D Scan for previously destroyed pools or import all or only
|
||||
* specified destroyed pools.
|
||||
*
|
||||
* -R Temporarily import the pool, with all mountpoints relative to
|
||||
* -R Temporarily import the pool, with all mountpoints relative to
|
||||
* the given root. The pool will remain exported when the machine
|
||||
* is rebooted.
|
||||
*
|
||||
* -V Import even in the presence of faulted vdevs. This is an
|
||||
* intentionally undocumented option for testing purposes, and
|
||||
* treats the pool configuration as complete, leaving any bad
|
||||
* -V Import even in the presence of faulted vdevs. This is an
|
||||
* intentionally undocumented option for testing purposes, and
|
||||
* treats the pool configuration as complete, leaving any bad
|
||||
* vdevs in the FAULTED state. In other words, it does verbatim
|
||||
* import.
|
||||
*
|
||||
* -f Force import, even if it appears that the pool is active.
|
||||
* -f Force import, even if it appears that the pool is active.
|
||||
*
|
||||
* -F Attempt rewind if necessary.
|
||||
* -F Attempt rewind if necessary.
|
||||
*
|
||||
* -n See if rewind would work, but don't actually rewind.
|
||||
* -n See if rewind would work, but don't actually rewind.
|
||||
*
|
||||
* -N Import the pool but don't mount datasets.
|
||||
* -N Import the pool but don't mount datasets.
|
||||
*
|
||||
* -T Specify a starting txg to use for import. This option is
|
||||
* intentionally undocumented option for testing purposes.
|
||||
* -t Use newpool as a temporary pool name instead of renaming
|
||||
* the pool.
|
||||
*
|
||||
* -a Import all pools found.
|
||||
* -T Specify a starting txg to use for import. This option is
|
||||
* intentionally undocumented option for testing purposes.
|
||||
*
|
||||
* -o Set property=value and/or temporary mount options (without '=').
|
||||
* -a Import all pools found.
|
||||
*
|
||||
* --rewind-to-checkpoint
|
||||
* Import the pool and revert back to the checkpoint.
|
||||
* -o Set property=value and/or temporary mount options (without '=').
|
||||
*
|
||||
* --rewind-to-checkpoint
|
||||
* Import the pool and revert back to the checkpoint.
|
||||
*
|
||||
* The import command scans for pools to import, and import pools based on pool
|
||||
* name and GUID. The pool can also be renamed as part of the import process.
|
||||
@ -2251,7 +2290,7 @@ zpool_do_import(int argc, char **argv)
|
||||
};
|
||||
|
||||
/* check options */
|
||||
while ((c = getopt_long(argc, argv, ":aCc:d:DEfFmnNo:rR:T:VX",
|
||||
while ((c = getopt_long(argc, argv, ":aCc:d:DEfFmnNo:rR:tT:VX",
|
||||
long_options, NULL)) != -1) {
|
||||
switch (c) {
|
||||
case 'a':
|
||||
@ -2306,11 +2345,13 @@ zpool_do_import(int argc, char **argv)
|
||||
if (add_prop_list(zpool_prop_to_name(
|
||||
ZPOOL_PROP_ALTROOT), optarg, &props, B_TRUE))
|
||||
goto error;
|
||||
if (nvlist_lookup_string(props,
|
||||
zpool_prop_to_name(ZPOOL_PROP_CACHEFILE),
|
||||
&propval) == 0)
|
||||
break;
|
||||
if (add_prop_list(zpool_prop_to_name(
|
||||
if (add_prop_list_default(zpool_prop_to_name(
|
||||
ZPOOL_PROP_CACHEFILE), "none", &props, B_TRUE))
|
||||
goto error;
|
||||
break;
|
||||
case 't':
|
||||
flags |= ZFS_IMPORT_TEMP_NAME;
|
||||
if (add_prop_list_default(zpool_prop_to_name(
|
||||
ZPOOL_PROP_CACHEFILE), "none", &props, B_TRUE))
|
||||
goto error;
|
||||
break;
|
||||
@ -2449,9 +2490,9 @@ zpool_do_import(int argc, char **argv)
|
||||
(void) fprintf(stderr, gettext("cannot import '%s': "
|
||||
"a pool with that name already exists\n"),
|
||||
argv[0]);
|
||||
(void) fprintf(stderr, gettext("use the form '%s "
|
||||
"<pool | id> <newpool>' to give it a new name\n"),
|
||||
"zpool import");
|
||||
(void) fprintf(stderr, gettext("use the form 'zpool import "
|
||||
"[-t] <pool | id> <newpool>' to give it a new temporary "
|
||||
"or permanent name\n"));
|
||||
err = 1;
|
||||
} else if (pools == NULL && idata.exists) {
|
||||
(void) fprintf(stderr, gettext("cannot import '%s': "
|
||||
@ -3367,7 +3408,7 @@ list_callback(zpool_handle_t *zhp, void *data)
|
||||
* -o List of properties to display. Defaults to
|
||||
* "name,size,allocated,free,expandsize,fragmentation,capacity,"
|
||||
* "dedupratio,health,altroot"
|
||||
* -p Diplay values in parsable (exact) format.
|
||||
* -p Diplay values in parsable (exact) format.
|
||||
* -T Display a timestamp in date(1) or Unix format
|
||||
*
|
||||
* List all pools in the system, whether or not they're healthy. Output space
|
||||
@ -5839,7 +5880,7 @@ get_callback(zpool_handle_t *zhp, void *data)
|
||||
* by a single tab.
|
||||
* -o List of columns to display. Defaults to
|
||||
* "name,property,value,source".
|
||||
* -p Diplay values in parsable (exact) format.
|
||||
* -p Diplay values in parsable (exact) format.
|
||||
*
|
||||
* Get properties of pools in the system. Output space statistics
|
||||
* for each one as well as other attributes.
|
||||
|
@ -136,6 +136,8 @@ zpool_prop_init(void)
|
||||
PROP_READONLY, ZFS_TYPE_POOL, "NAME");
|
||||
zprop_register_hidden(ZPOOL_PROP_MAXBLOCKSIZE, "maxblocksize",
|
||||
PROP_TYPE_NUMBER, PROP_READONLY, ZFS_TYPE_POOL, "MAXBLOCKSIZE");
|
||||
zprop_register_hidden(ZPOOL_PROP_TNAME, "tname", PROP_TYPE_STRING,
|
||||
PROP_ONETIME, ZFS_TYPE_POOL, "TNAME");
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -643,6 +643,7 @@ zpool_valid_proplist(libzfs_handle_t *hdl, const char *poolname,
|
||||
goto error;
|
||||
}
|
||||
break;
|
||||
|
||||
case ZPOOL_PROP_READONLY:
|
||||
if (!flags.import) {
|
||||
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
|
||||
@ -653,6 +654,16 @@ zpool_valid_proplist(libzfs_handle_t *hdl, const char *poolname,
|
||||
}
|
||||
break;
|
||||
|
||||
case ZPOOL_PROP_TNAME:
|
||||
if (!flags.create) {
|
||||
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
|
||||
"property '%s' can only be set at "
|
||||
"creation time"), propname);
|
||||
(void) zfs_error(hdl, EZFS_BADPROP, errbuf);
|
||||
goto error;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
|
||||
"property '%s'(%d) not defined"), propname, prop);
|
||||
|
@ -58,6 +58,7 @@
|
||||
.Oo Fl o Ar property Ns = Ns Ar value Oc Ns ...
|
||||
.Oo Fl O Ar file-system-property Ns = Ns Ar value Oc Ns ...
|
||||
.Op Fl R Ar root
|
||||
.Op Fl t Ar tempname
|
||||
.Ar pool vdev Ns ...
|
||||
.Nm
|
||||
.Cm destroy
|
||||
@ -95,7 +96,7 @@
|
||||
.Op Fl R Ar root
|
||||
.Nm
|
||||
.Cm import
|
||||
.Op Fl Dfm
|
||||
.Op Fl Dfmt
|
||||
.Op Fl F Op Fl n
|
||||
.Op Fl -rewind-to-checkpoint
|
||||
.Op Fl c Ar cachefile Ns | Ns Fl d Ar dir
|
||||
@ -871,6 +872,7 @@ specified device or devices are cleared.
|
||||
.Oo Fl o Ar property Ns = Ns Ar value Oc Ns ...
|
||||
.Oo Fl O Ar file-system-property Ns = Ns Ar value Oc Ns ...
|
||||
.Op Fl R Ar root
|
||||
.Op Fl t Ar tempname
|
||||
.Ar pool vdev Ns ...
|
||||
.Xc
|
||||
Creates a new storage pool containing the virtual devices specified on the
|
||||
@ -992,6 +994,16 @@ for a list of valid properties that can be set.
|
||||
.It Fl R Ar root
|
||||
Equivalent to
|
||||
.Fl o Sy cachefile Ns = Ns Sy none Fl o Sy altroot Ns = Ns Ar root
|
||||
.It Fl t Ar tempname
|
||||
Sets the in-core pool name to
|
||||
.Pa tempname
|
||||
while the on-disk name will be the name specified as the pool name
|
||||
.Pa pool .
|
||||
This will set the default cachefile property to
|
||||
.Sy none.
|
||||
This is intended to handle name space collisions when creating pools
|
||||
for other systems, such as virtual machines or physical machines
|
||||
whose pools live on network block devices.
|
||||
.El
|
||||
.It Xo
|
||||
.Nm
|
||||
@ -1237,7 +1249,7 @@ property to
|
||||
.It Xo
|
||||
.Nm
|
||||
.Cm import
|
||||
.Op Fl Dfm
|
||||
.Op Fl Dfmt
|
||||
.Op Fl F Op Fl n
|
||||
.Op Fl -rewind-to-checkpoint
|
||||
.Op Fl c Ar cachefile Ns | Ns Fl d Ar dir
|
||||
@ -1328,6 +1340,20 @@ and the
|
||||
.Sy altroot
|
||||
property to
|
||||
.Ar root .
|
||||
.It Fl t
|
||||
Used with
|
||||
.Ar newpool .
|
||||
Specifies that
|
||||
.Ar newpool
|
||||
is temporary.
|
||||
Temporary pool names last until export.
|
||||
Ensures that the original pool name will be used in all label updates and
|
||||
therefore is retained upon export.
|
||||
Will also set
|
||||
.Sy cachefile
|
||||
property to
|
||||
.Sy none
|
||||
when not explicitly specified.
|
||||
.It Fl -rewind-to-checkpoint
|
||||
Rewinds pool to the checkpointed state.
|
||||
Once the pool is imported with this flag there is no way to undo the rewind.
|
||||
|
@ -4578,12 +4578,18 @@ spa_create(const char *pool, nvlist_t *nvroot, nvlist_t *props,
|
||||
uint_t nspares, nl2cache;
|
||||
uint64_t version, obj;
|
||||
boolean_t has_features;
|
||||
char *poolname;
|
||||
nvlist_t *nvl;
|
||||
|
||||
if (nvlist_lookup_string(props,
|
||||
zpool_prop_to_name(ZPOOL_PROP_TNAME), &poolname) != 0)
|
||||
poolname = (char *)pool;
|
||||
|
||||
/*
|
||||
* If this pool already exists, return failure.
|
||||
*/
|
||||
mutex_enter(&spa_namespace_lock);
|
||||
if (spa_lookup(pool) != NULL) {
|
||||
if (spa_lookup(poolname) != NULL) {
|
||||
mutex_exit(&spa_namespace_lock);
|
||||
return (SET_ERROR(EEXIST));
|
||||
}
|
||||
@ -4591,9 +4597,12 @@ spa_create(const char *pool, nvlist_t *nvroot, nvlist_t *props,
|
||||
/*
|
||||
* Allocate a new spa_t structure.
|
||||
*/
|
||||
nvl = fnvlist_alloc();
|
||||
fnvlist_add_string(nvl, ZPOOL_CONFIG_POOL_NAME, pool);
|
||||
(void) nvlist_lookup_string(props,
|
||||
zpool_prop_to_name(ZPOOL_PROP_ALTROOT), &altroot);
|
||||
spa = spa_add(pool, NULL, altroot);
|
||||
spa = spa_add(poolname, nvl, altroot);
|
||||
fnvlist_free(nvl);
|
||||
spa_activate(spa, spa_mode_global);
|
||||
|
||||
if (props && (error = spa_prop_validate(spa, props))) {
|
||||
@ -4603,6 +4612,12 @@ spa_create(const char *pool, nvlist_t *nvroot, nvlist_t *props,
|
||||
return (error);
|
||||
}
|
||||
|
||||
/*
|
||||
* Temporary pool names should never be written to disk.
|
||||
*/
|
||||
if (poolname != pool)
|
||||
spa->spa_import_flags |= ZFS_IMPORT_TEMP_NAME;
|
||||
|
||||
has_features = B_FALSE;
|
||||
for (nvpair_t *elem = nvlist_next_nvpair(props, NULL);
|
||||
elem != NULL; elem = nvlist_next_nvpair(props, elem)) {
|
||||
|
@ -208,6 +208,7 @@ spa_write_cachefile(spa_t *target, boolean_t removing, boolean_t postsysevent)
|
||||
nvlist_t *nvl;
|
||||
boolean_t ccw_failure;
|
||||
int error;
|
||||
char *pool_name;
|
||||
|
||||
ASSERT(MUTEX_HELD(&spa_namespace_lock));
|
||||
|
||||
@ -254,7 +255,14 @@ spa_write_cachefile(spa_t *target, boolean_t removing, boolean_t postsysevent)
|
||||
if (nvl == NULL)
|
||||
nvl = fnvlist_alloc();
|
||||
|
||||
fnvlist_add_nvlist(nvl, spa->spa_name,
|
||||
if (spa->spa_import_flags & ZFS_IMPORT_TEMP_NAME) {
|
||||
pool_name = fnvlist_lookup_string(
|
||||
spa->spa_config, ZPOOL_CONFIG_POOL_NAME);
|
||||
} else {
|
||||
pool_name = spa_name(spa);
|
||||
}
|
||||
|
||||
fnvlist_add_nvlist(nvl, pool_name,
|
||||
spa->spa_config);
|
||||
mutex_exit(&spa->spa_props_lock);
|
||||
}
|
||||
@ -359,6 +367,7 @@ spa_config_generate(spa_t *spa, vdev_t *vd, uint64_t txg, int getstats)
|
||||
unsigned long hostid = 0;
|
||||
boolean_t locked = B_FALSE;
|
||||
uint64_t split_guid;
|
||||
char *pool_name;
|
||||
|
||||
if (vd == NULL) {
|
||||
vd = rvd;
|
||||
@ -375,10 +384,27 @@ spa_config_generate(spa_t *spa, vdev_t *vd, uint64_t txg, int getstats)
|
||||
if (txg == -1ULL)
|
||||
txg = spa->spa_config_txg;
|
||||
|
||||
/*
|
||||
* Originally, users had to handle spa namespace collisions by either
|
||||
* exporting the already imported pool or by specifying a new name for
|
||||
* the pool with a conflicting name. In the case of root pools from
|
||||
* virtual guests, neither approach to collision resolution is
|
||||
* reasonable. This is addressed by extending the new name syntax with
|
||||
* an option to specify that the new name is temporary. When specified,
|
||||
* ZFS_IMPORT_TEMP_NAME will be set in spa->spa_import_flags to tell us
|
||||
* to use the previous name, which we do below.
|
||||
*/
|
||||
if (spa->spa_import_flags & ZFS_IMPORT_TEMP_NAME) {
|
||||
pool_name = fnvlist_lookup_string(spa->spa_config,
|
||||
ZPOOL_CONFIG_POOL_NAME);
|
||||
} else {
|
||||
pool_name = spa_name(spa);
|
||||
}
|
||||
|
||||
config = fnvlist_alloc();
|
||||
|
||||
fnvlist_add_uint64(config, ZPOOL_CONFIG_VERSION, spa_version(spa));
|
||||
fnvlist_add_string(config, ZPOOL_CONFIG_POOL_NAME, spa_name(spa));
|
||||
fnvlist_add_string(config, ZPOOL_CONFIG_POOL_NAME, pool_name);
|
||||
fnvlist_add_uint64(config, ZPOOL_CONFIG_POOL_STATE, spa_state(spa));
|
||||
fnvlist_add_uint64(config, ZPOOL_CONFIG_POOL_TXG, txg);
|
||||
fnvlist_add_uint64(config, ZPOOL_CONFIG_POOL_GUID, spa_guid(spa));
|
||||
|
@ -1492,6 +1492,7 @@ zfs_ioc_pool_create(zfs_cmd_t *zc)
|
||||
nvlist_t *config, *props = NULL;
|
||||
nvlist_t *rootprops = NULL;
|
||||
nvlist_t *zplprops = NULL;
|
||||
char *spa_name = zc->zc_name;
|
||||
|
||||
if (error = get_nvlist(zc->zc_nvlist_conf, zc->zc_nvlist_conf_size,
|
||||
zc->zc_iflags, &config))
|
||||
@ -1507,6 +1508,7 @@ zfs_ioc_pool_create(zfs_cmd_t *zc)
|
||||
if (props) {
|
||||
nvlist_t *nvl = NULL;
|
||||
uint64_t version = SPA_VERSION;
|
||||
char *tname;
|
||||
|
||||
(void) nvlist_lookup_uint64(props,
|
||||
zpool_prop_to_name(ZPOOL_PROP_VERSION), &version);
|
||||
@ -1529,6 +1531,10 @@ zfs_ioc_pool_create(zfs_cmd_t *zc)
|
||||
zplprops, NULL);
|
||||
if (error != 0)
|
||||
goto pool_props_bad;
|
||||
|
||||
if (nvlist_lookup_string(props,
|
||||
zpool_prop_to_name(ZPOOL_PROP_TNAME), &tname) == 0)
|
||||
spa_name = tname;
|
||||
}
|
||||
|
||||
error = spa_create(zc->zc_name, config, props, zplprops);
|
||||
@ -1536,9 +1542,9 @@ zfs_ioc_pool_create(zfs_cmd_t *zc)
|
||||
/*
|
||||
* Set the remaining root properties
|
||||
*/
|
||||
if (!error && (error = zfs_set_prop_nvlist(zc->zc_name,
|
||||
if (!error && (error = zfs_set_prop_nvlist(spa_name,
|
||||
ZPROP_SRC_LOCAL, rootprops, NULL)) != 0)
|
||||
(void) spa_destroy(zc->zc_name);
|
||||
(void) spa_destroy(spa_name);
|
||||
|
||||
pool_props_bad:
|
||||
nvlist_free(rootprops);
|
||||
|
@ -210,6 +210,7 @@ typedef enum {
|
||||
ZPOOL_PROP_MAXBLOCKSIZE,
|
||||
ZPOOL_PROP_BOOTSIZE,
|
||||
ZPOOL_PROP_CHECKPOINT,
|
||||
ZPOOL_PROP_TNAME,
|
||||
ZPOOL_NUM_PROPS
|
||||
} zpool_prop_t;
|
||||
|
||||
@ -855,7 +856,7 @@ typedef struct vdev_stat {
|
||||
* is passed between kernel and userland as an nvlist uint64 array.
|
||||
*/
|
||||
typedef struct ddt_object {
|
||||
uint64_t ddo_count; /* number of elments in ddt */
|
||||
uint64_t ddo_count; /* number of elments in ddt */
|
||||
uint64_t ddo_dspace; /* size of ddt on disk */
|
||||
uint64_t ddo_mspace; /* size of ddt in-core */
|
||||
} ddt_object_t;
|
||||
@ -1061,6 +1062,7 @@ typedef enum {
|
||||
#define ZFS_IMPORT_MISSING_LOG 0x4
|
||||
#define ZFS_IMPORT_ONLY 0x8
|
||||
#define ZFS_IMPORT_CHECKPOINT 0x10
|
||||
#define ZFS_IMPORT_TEMP_NAME 0x20
|
||||
|
||||
/*
|
||||
* Channel program argument/return nvlist keys and defaults.
|
||||
|
Loading…
Reference in New Issue
Block a user