Fix segfault in zpool iostat when adding VDEVs

Fix a segfault when running 'zpool iostat -v 1' while adding
a VDEV.

Reviewed-by: George Melikov <mail@gmelikov.ru>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Tony Hutter <hutter2@llnl.gov>
Closes #6748 
Closes #6872
This commit is contained in:
Tony Hutter 2017-12-06 11:43:07 -08:00 committed by Brian Behlendorf
parent 1b2b0acab5
commit 674b89342e
1 changed files with 15 additions and 7 deletions

View File

@ -3648,7 +3648,7 @@ print_vdev_stats(zpool_handle_t *zhp, const char *name, nvlist_t *oldnv,
nvlist_t *newnv, iostat_cbdata_t *cb, int depth) nvlist_t *newnv, iostat_cbdata_t *cb, int depth)
{ {
nvlist_t **oldchild, **newchild; nvlist_t **oldchild, **newchild;
uint_t c, children; uint_t c, children, oldchildren;
vdev_stat_t *oldvs, *newvs, *calcvs; vdev_stat_t *oldvs, *newvs, *calcvs;
vdev_stat_t zerovs = { 0 }; vdev_stat_t zerovs = { 0 };
char *vname; char *vname;
@ -3760,10 +3760,14 @@ children:
&newchild, &children) != 0) &newchild, &children) != 0)
return (ret); return (ret);
if (oldnv && nvlist_lookup_nvlist_array(oldnv, ZPOOL_CONFIG_CHILDREN, if (oldnv) {
&oldchild, &c) != 0) if (nvlist_lookup_nvlist_array(oldnv, ZPOOL_CONFIG_CHILDREN,
&oldchild, &oldchildren) != 0)
return (ret); return (ret);
children = MIN(oldchildren, children);
}
for (c = 0; c < children; c++) { for (c = 0; c < children; c++) {
uint64_t ishole = B_FALSE, islog = B_FALSE; uint64_t ishole = B_FALSE, islog = B_FALSE;
@ -3818,10 +3822,14 @@ children:
&newchild, &children) != 0) &newchild, &children) != 0)
return (ret); return (ret);
if (oldnv && nvlist_lookup_nvlist_array(oldnv, ZPOOL_CONFIG_L2CACHE, if (oldnv) {
&oldchild, &c) != 0) if (nvlist_lookup_nvlist_array(oldnv, ZPOOL_CONFIG_L2CACHE,
&oldchild, &oldchildren) != 0)
return (ret); return (ret);
children = MIN(oldchildren, children);
}
if (children > 0) { if (children > 0) {
if ((!(cb->cb_flags & IOS_ANYHISTO_M)) && !cb->cb_scripted && if ((!(cb->cb_flags & IOS_ANYHISTO_M)) && !cb->cb_scripted &&
!cb->cb_vdev_names) { !cb->cb_vdev_names) {