Fix import finding spare/l2cache when path changes
When spare or l2cache device path changes, zpool import will not fix up their paths like normal vdev. The issue is that when you supply a pool name argument to zpool import, it will use it to filter out device which doesn't have the pool name in the label. Since spare and l2cache device never have that in the label, they'll always get filtered out. We fix this by making sure we never filter out a spare or l2cache device. Reviewed by: Richard Elling <Richard.Elling@RichardElling.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Chunwei Chen <david.chen@osnexus.com> Closes #6158
This commit is contained in:
parent
ed9cb8390b
commit
412e3c26a9
|
@ -1337,16 +1337,33 @@ zpool_find_import_impl(libzfs_handle_t *hdl, importargs_t *iarg)
|
||||||
|
|
||||||
if (config != NULL) {
|
if (config != NULL) {
|
||||||
boolean_t matched = B_TRUE;
|
boolean_t matched = B_TRUE;
|
||||||
|
boolean_t aux = B_FALSE;
|
||||||
char *pname;
|
char *pname;
|
||||||
|
|
||||||
if ((iarg->poolname != NULL) &&
|
/*
|
||||||
|
* Check if it's a spare or l2cache device. If
|
||||||
|
* it is, we need to skip the name and guid
|
||||||
|
* check since they don't exist on aux device
|
||||||
|
* label.
|
||||||
|
*/
|
||||||
|
if (iarg->poolname != NULL ||
|
||||||
|
iarg->guid != 0) {
|
||||||
|
uint64_t state;
|
||||||
|
aux = nvlist_lookup_uint64(config,
|
||||||
|
ZPOOL_CONFIG_POOL_STATE,
|
||||||
|
&state) == 0 &&
|
||||||
|
(state == POOL_STATE_SPARE ||
|
||||||
|
state == POOL_STATE_L2CACHE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((iarg->poolname != NULL) && !aux &&
|
||||||
(nvlist_lookup_string(config,
|
(nvlist_lookup_string(config,
|
||||||
ZPOOL_CONFIG_POOL_NAME, &pname) == 0)) {
|
ZPOOL_CONFIG_POOL_NAME, &pname) == 0)) {
|
||||||
|
|
||||||
if (strcmp(iarg->poolname, pname))
|
if (strcmp(iarg->poolname, pname))
|
||||||
matched = B_FALSE;
|
matched = B_FALSE;
|
||||||
|
|
||||||
} else if (iarg->guid != 0) {
|
} else if (iarg->guid != 0 && !aux) {
|
||||||
uint64_t this_guid;
|
uint64_t this_guid;
|
||||||
|
|
||||||
matched = nvlist_lookup_uint64(config,
|
matched = nvlist_lookup_uint64(config,
|
||||||
|
|
Loading…
Reference in New Issue