Fix missing vdev names in zpool status output

Commit 858219c makes more sense down below in the 'if (verbose)'
section of the code.  Initially, buf and path will never point
to the same location.  Once 'path = buf' is set on a raidz vdev,
the code may drop into the verbose section depending on the
verbose flag.  In here, using a tmpbuf makes sense since now
'buf == path'.

This issue does not occur in the upstream Solaris code because
their implementations of snprintf() allow for buf and path to
be the same address.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #57
This commit is contained in:
Michael Martin 2012-09-05 09:46:29 -07:00 committed by Brian Behlendorf
parent cafa9709f3
commit fc24f7c887

View File

@ -3134,6 +3134,7 @@ zpool_vdev_name(libzfs_handle_t *hdl, zpool_handle_t *zhp, nvlist_t *nv,
char *path, *devid, *type; char *path, *devid, *type;
uint64_t value; uint64_t value;
char buf[PATH_BUF_LEN]; char buf[PATH_BUF_LEN];
char tmpbuf[PATH_BUF_LEN];
vdev_stat_t *vs; vdev_stat_t *vs;
uint_t vsc; uint_t vsc;
@ -3206,13 +3207,12 @@ zpool_vdev_name(libzfs_handle_t *hdl, zpool_handle_t *zhp, nvlist_t *nv,
* If it's a raidz device, we need to stick in the parity level. * If it's a raidz device, we need to stick in the parity level.
*/ */
if (strcmp(path, VDEV_TYPE_RAIDZ) == 0) { if (strcmp(path, VDEV_TYPE_RAIDZ) == 0) {
char tmpbuf[PATH_BUF_LEN];
verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_NPARITY, verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_NPARITY,
&value) == 0); &value) == 0);
(void) snprintf(tmpbuf, sizeof (tmpbuf), "%s%llu", path, (void) snprintf(buf, sizeof (buf), "%s%llu", path,
(u_longlong_t)value); (u_longlong_t)value);
path = tmpbuf; path = buf;
} }
/* /*
@ -3224,9 +3224,9 @@ zpool_vdev_name(libzfs_handle_t *hdl, zpool_handle_t *zhp, nvlist_t *nv,
verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_ID, verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_ID,
&id) == 0); &id) == 0);
(void) snprintf(buf, sizeof (buf), "%s-%llu", path, (void) snprintf(tmpbuf, sizeof (tmpbuf), "%s-%llu",
(u_longlong_t)id); path, (u_longlong_t)id);
path = buf; path = tmpbuf;
} }
} }