Fix missing vdev names in zpool status output
Top-level vdev names in zpool status output should follow a <type-id> naming convention. In the case of raidz devices, the type portion of the name was missing. This commit fixes a bug in zpool_vdev_name() where in this snprintf call (void) snprintf(buf, sizeof (buf), "%s-%llu", path, (u_longlong_t)id); buf and path may point to the same location. The result is that buf ends up containing only the "-id" part. This only occurred for raidz devices because the code for appending the parity level to the type string stored its result in buf then set path to point there. To fix this we allocate a new temporary buffer on the stack instead of reusing buf. Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #57
This commit is contained in:
parent
368f4c10ae
commit
858219cc4e
@ -3047,6 +3047,8 @@ set_path(zpool_handle_t *zhp, nvlist_t *nv, const char *path)
|
|||||||
(void) ioctl(zhp->zpool_hdl->libzfs_fd, ZFS_IOC_VDEV_SETPATH, &zc);
|
(void) ioctl(zhp->zpool_hdl->libzfs_fd, ZFS_IOC_VDEV_SETPATH, &zc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define PATH_BUF_LEN 64
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Given a vdev, return the name to display in iostat. If the vdev has a path,
|
* Given a vdev, return the name to display in iostat. If the vdev has a path,
|
||||||
* we use that, stripping off any leading "/dev/dsk/"; if not, we use the type.
|
* we use that, stripping off any leading "/dev/dsk/"; if not, we use the type.
|
||||||
@ -3068,7 +3070,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[64];
|
char buf[PATH_BUF_LEN];
|
||||||
vdev_stat_t *vs;
|
vdev_stat_t *vs;
|
||||||
uint_t vsc;
|
uint_t vsc;
|
||||||
|
|
||||||
@ -3160,11 +3162,13 @@ 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(buf, sizeof (buf), "%s%llu", path,
|
(void) snprintf(tmpbuf, sizeof (tmpbuf), "%s%llu", path,
|
||||||
(u_longlong_t)value);
|
(u_longlong_t)value);
|
||||||
path = buf;
|
path = tmpbuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user