Illumos 5118 - When verifying or creating a storage pool, error messages only show one device

5118 When verifying or creating a storage pool, error messages
only show one device
Reviewed by: Adam Leventhal <adam.leventhal@delphix.com>
Reviewed by: Dan Kimmel <dan.kimmel@delphix.com>
Reviewed by: Matt Ahrens <mahrens@delphix.com>
Reviewed by: Boris Protopopov <boris.protopopov@me.com>
Approved by: Dan McDonald <danmcd@omniti.com>

References:
  https://github.com/illumos/illumos-gate/commit/75fbdf9
  https://www.illumos.org/issues/5118

Ported-by: kernelOfTruth kerneloftruth@gmail.com
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #3567
This commit is contained in:
Basil Crow 2015-07-05 21:17:49 +02:00 committed by Brian Behlendorf
parent 3e43edd2c5
commit de0a9d7630

View File

@ -21,6 +21,7 @@
/* /*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2013 by Delphix. All rights reserved.
*/ */
/* /*
@ -1289,8 +1290,8 @@ make_disks(zpool_handle_t *zhp, nvlist_t *nv)
* Go through and find any devices that are in use. We rely on libdiskmgt for * Go through and find any devices that are in use. We rely on libdiskmgt for
* the majority of this task. * the majority of this task.
*/ */
static int static boolean_t
check_in_use(nvlist_t *config, nvlist_t *nv, boolean_t force, is_device_in_use(nvlist_t *config, nvlist_t *nv, boolean_t force,
boolean_t replacing, boolean_t isspare) boolean_t replacing, boolean_t isspare)
{ {
nvlist_t **child; nvlist_t **child;
@ -1299,6 +1300,7 @@ check_in_use(nvlist_t *config, nvlist_t *nv, boolean_t force,
int ret = 0; int ret = 0;
char buf[MAXPATHLEN]; char buf[MAXPATHLEN];
uint64_t wholedisk = B_FALSE; uint64_t wholedisk = B_FALSE;
boolean_t anyinuse = B_FALSE;
verify(nvlist_lookup_string(nv, ZPOOL_CONFIG_TYPE, &type) == 0); verify(nvlist_lookup_string(nv, ZPOOL_CONFIG_TYPE, &type) == 0);
@ -1324,38 +1326,38 @@ check_in_use(nvlist_t *config, nvlist_t *nv, boolean_t force,
} }
if (is_spare(config, buf)) if (is_spare(config, buf))
return (0); return (B_FALSE);
} }
if (strcmp(type, VDEV_TYPE_DISK) == 0) if (strcmp(type, VDEV_TYPE_DISK) == 0)
ret = check_device(path, force, isspare, wholedisk); ret = check_device(path, force, isspare, wholedisk);
if (strcmp(type, VDEV_TYPE_FILE) == 0) else if (strcmp(type, VDEV_TYPE_FILE) == 0)
ret = check_file(path, force, isspare); ret = check_file(path, force, isspare);
return (ret); return (ret != 0);
} }
for (c = 0; c < children; c++) for (c = 0; c < children; c++)
if ((ret = check_in_use(config, child[c], force, if (is_device_in_use(config, child[c], force, replacing,
replacing, B_FALSE)) != 0) B_FALSE))
return (ret); anyinuse = B_TRUE;
if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_SPARES, if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_SPARES,
&child, &children) == 0) &child, &children) == 0)
for (c = 0; c < children; c++) for (c = 0; c < children; c++)
if ((ret = check_in_use(config, child[c], force, if (is_device_in_use(config, child[c], force, replacing,
replacing, B_TRUE)) != 0) B_TRUE))
return (ret); anyinuse = B_TRUE;
if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_L2CACHE, if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_L2CACHE,
&child, &children) == 0) &child, &children) == 0)
for (c = 0; c < children; c++) for (c = 0; c < children; c++)
if ((ret = check_in_use(config, child[c], force, if (is_device_in_use(config, child[c], force, replacing,
replacing, B_FALSE)) != 0) B_FALSE))
return (ret); anyinuse = B_TRUE;
return (0); return (anyinuse);
} }
static const char * static const char *
@ -1710,7 +1712,7 @@ make_root_vdev(zpool_handle_t *zhp, nvlist_t *props, int force, int check_rep,
* uses (such as a dedicated dump device) that even '-f' cannot * uses (such as a dedicated dump device) that even '-f' cannot
* override. * override.
*/ */
if (check_in_use(poolconfig, newroot, force, replacing, B_FALSE) != 0) { if (is_device_in_use(poolconfig, newroot, force, replacing, B_FALSE)) {
nvlist_free(newroot); nvlist_free(newroot);
return (NULL); return (NULL);
} }