[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#696119: `zpool status` incorrectly names raidz vdevs



Package: libzfs1
Version: 9.0-3
Severity: normal
Tags: patch

"zpool status" incorrectly prints "raidz" vdevs as "-0" instead of
"raidz1-0", e.g.
    $ zpool status mpool 
      pool: mpool
     state: ONLINE
     scan: scrub repaired 0 in 0h52m with 0 errors on Sun Dec 16 12:43:40 2012
    config:

            NAME        STATE     READ WRITE CKSUM
            mpool       ONLINE       0     0     0
              -0        ONLINE       0     0     0
                ada0p3  ONLINE       0     0     0
                ada1p3  ONLINE       0     0     0
                ada2p3  ONLINE       0     0     0
should be
    $ LD_LIBRARY_PATH=debian/libzfs1/lib zpool status mpool 
      pool: mpool
     state: ONLINE
     scan: scrub repaired 0 in 0h52m with 0 errors on Sun Dec 16 12:43:40 2012
    config:

            NAME        STATE     READ WRITE CKSUM
            mpool       ONLINE       0     0     0
              raidz1-0  ONLINE       0     0     0
                ada0p3  ONLINE       0     0     0
                ada1p3  ONLINE       0     0     0
                ada2p3  ONLINE       0     0     0


I investigated the problem and it turns out to be bad use of snprintf (the
output buffer is the same as one of the positional arguments); Solaris and
possibly FreeBSD libc behave differently than glibc in this case. (FreeBSD 9.0
doesn't exhibit the problem)

I have a patch derived from the zfsonlinux project, where they have also
fixed the bug.  My patch is simply a combination of these two patches:

https://github.com/zfsonlinux/zfs/commit/858219cc4e44
https://github.com/zfsonlinux/zfs/commit/fc24f7c887a0

-- System Information:
Debian Release: wheezy/sid
  APT prefers testing
  APT policy: (500, 'testing'), (1, 'experimental')
Architecture: kfreebsd-amd64 (x86_64)

Kernel: kFreeBSD 9.0-2-amd64
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages libzfs1 depends on:
ii  libbsd0     0.4.2-1
ii  libc0.1     2.13-37
ii  libgeom1    9.0+ds1-3
ii  libnvpair1  9.0-3
ii  libumem1    9.0-3
ii  libuutil1   9.0-3

libzfs1 recommends no packages.

Libzfs1 suggests no packages.

-- no debconf information


Index: zfsutils-9.0/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c
===================================================================
--- zfsutils-9.0.orig/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c	2012-12-16 12:15:18.000000000 -0600
+++ zfsutils-9.0/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c	2012-12-16 13:11:34.171723989 -0600
@@ -3087,6 +3087,8 @@
 	(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,
  * we use that, stripping off any leading "/dev/dsk/"; if not, we use the type.
@@ -3108,7 +3110,8 @@
 {
 	char *path, *devid;
 	uint64_t value;
-	char buf[64];
+	char buf[PATH_BUF_LEN];
+	char tmpbuf[PATH_BUF_LEN];
 	vdev_stat_t *vs;
 	uint_t vsc;
 	int have_stats;
@@ -3204,6 +3207,7 @@
 		 * If it's a raidz device, we need to stick in the parity level.
 		 */
 		if (strcmp(path, VDEV_TYPE_RAIDZ) == 0) {
+
 			verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_NPARITY,
 			    &value) == 0);
 			(void) snprintf(buf, sizeof (buf), "%s%llu", path,
@@ -3220,9 +3224,9 @@
 
 			verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_ID,
 			    &id) == 0);
-			(void) snprintf(buf, sizeof (buf), "%s-%llu", path,
-			    (u_longlong_t)id);
-			path = buf;
+			(void) snprintf(tmpbuf, sizeof (tmpbuf), "%s-%llu",
+			    path, (u_longlong_t)id);
+			path = tmpbuf;
 		}
 	}
 


Reply to: