Fix "zpool add" crash when a replacing vdev has a spare child

Fix an assertion in zpool that causes a crash when running any "zpool add"
command on a spare that contains a replacing vdev with a spare child.

This likely affects Illumos, too.

PR:		225546
MFC after:	3 weeks
Sponsored by:	Spectra Logic Corp
Differential Revision:	https://reviews.freebsd.org/D14138
This commit is contained in:
Alan Somers 2018-02-09 16:08:57 +00:00
parent 8162ec9b35
commit ad4bbe575b

View File

@ -688,6 +688,21 @@ get_replication(nvlist_t *nvroot, boolean_t fatal)
verify(nvlist_lookup_string(cnv,
ZPOOL_CONFIG_TYPE,
&childtype) == 0);
if (strcmp(childtype,
VDEV_TYPE_SPARE) == 0) {
/* We have a replacing vdev with
* a spare child. Get the first
* real child of the spare
*/
verify(
nvlist_lookup_nvlist_array(
cnv,
ZPOOL_CONFIG_CHILDREN,
&rchild,
&rchildren) == 0);
assert(rchildren >= 2);
cnv = rchild[0];
}
}
verify(nvlist_lookup_string(cnv,