Bug#780308: zfs-fuse: zfs list -t snapshot missing entries

2015-03-11 Thread Michael Klein
Package: zfs-fuse
Version: 0.7.0-12
Severity: important
Tags: upstream patch

Dear Maintainer,

I see exactly the behavior described in 
https://groups.google.com/forum/#!topic/zfs-fuse/-BtjGFUPOyk:

Removing the com.sun:auto-snapshot-desc property as descibed in the 
command by user hornowitz did not help for me, though.

# zfs list -r -t snapshot -H zpool | wc -l
504

# zdb -d zpool | grep ^Dataset .*@  | wc -l
913

I can list any property of the missing snapshots if I name the snapshot 
on the command line, it exists but is just missing in the output of zfs 
list -t snapshot fs.

After some debugging, I found the root cause in src/lib/libzfs/libzfs_dataset.c:

2425 static int
2426 zfs_do_list_ioctl(zfs_handle_t *zhp, int arg, zfs_cmd_t *zc)
2427 {
2428 int rc;
2429 uint64_torig_cookie;
2430
2431 orig_cookie = zc-zc_cookie;
2432 top:
2433 (void) strlcpy(zc-zc_name, zhp-zfs_name, sizeof (zc-zc_name));
2434 rc = ioctl(zhp-zfs_hdl-libzfs_fd, arg, zc);
2435
2436 if (rc == -1) {
2437 switch (errno) {
2438 case ENOMEM:
2439 /* expand nvlist memory and try again */
2440 if (zcmd_expand_dst_nvlist(zhp-zfs_hdl, zc) != 0) {
2441 zcmd_free_nvlists(zc);
2442 return (-1);
2443 }


This code assumes ioctl() returns either 0 or -1, but I'm occasionally getting
12 (=ENOMEM) here.  After changing the condition in line 2436 to just if (rc)
and recompiling the zfs command the output of zfs list -r -t snapshot matches
the output of zdb.


Kind regards,
Michael




-- System Information:
Debian Release: 7.8
  APT prefers stable
  APT policy: (500, 'stable')
Architecture: armhf (armv7l)

Kernel: Linux 3.4.104+ (SMP w/2 CPU cores; PREEMPT)
Locale: LANG=C, LC_CTYPE=de_DE.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages zfs-fuse depends on:
ii  fuse 2.9.0-2+deb7u1
ii  libaio1  0.3.109-3
ii  libc62.13-38+deb7u8
ii  libfuse2 2.9.0-2+deb7u1
ii  libgcc1  1:4.7.2-5
ii  libssl1.0.0  1.0.1e-2+deb7u14
ii  lsb-base 4.1+Debian8+deb7u1
ii  zlib1g   1:1.2.7.dfsg-13

zfs-fuse recommends no packages.

Versions of packages zfs-fuse suggests:
pn  kpartx none
ii  nfs-kernel-server  1:1.2.6-4

-- Configuration Files:
/etc/zfs/zfsrc changed [not included]

-- no debconf information
--- ./src/lib/libzfs/libzfs_dataset.c.orig	2015-03-11 21:36:13.0 +0100
+++ ./src/lib/libzfs/libzfs_dataset.c	2015-03-11 21:36:24.0 +0100
@@ -2433,7 +2433,7 @@
 	(void) strlcpy(zc-zc_name, zhp-zfs_name, sizeof (zc-zc_name));
 	rc = ioctl(zhp-zfs_hdl-libzfs_fd, arg, zc);
 
-if (rc == -1) {
+if (rc) {
 		switch (errno) {
 		case ENOMEM:
 			/* expand nvlist memory and try again */


Bug#780308: zfs-fuse: zfs list -t snapshot missing entries

2015-03-11 Thread Asias He
Hello Michael,

Thanks for this. I will include the patch in next release.

On Thu, Mar 12, 2015 at 4:56 AM, Michael Klein
michael.kl...@puffin.lb.shuttle.de wrote:
 Package: zfs-fuse
 Version: 0.7.0-12
 Severity: important
 Tags: upstream patch

 Dear Maintainer,

 I see exactly the behavior described in
 https://groups.google.com/forum/#!topic/zfs-fuse/-BtjGFUPOyk:

 Removing the com.sun:auto-snapshot-desc property as descibed in the
 command by user hornowitz did not help for me, though.

 # zfs list -r -t snapshot -H zpool | wc -l
 504

 # zdb -d zpool | grep ^Dataset .*@  | wc -l
 913

 I can list any property of the missing snapshots if I name the snapshot
 on the command line, it exists but is just missing in the output of zfs
 list -t snapshot fs.

 After some debugging, I found the root cause in 
 src/lib/libzfs/libzfs_dataset.c:

 2425 static int
 2426 zfs_do_list_ioctl(zfs_handle_t *zhp, int arg, zfs_cmd_t *zc)
 2427 {
 2428 int rc;
 2429 uint64_torig_cookie;
 2430
 2431 orig_cookie = zc-zc_cookie;
 2432 top:
 2433 (void) strlcpy(zc-zc_name, zhp-zfs_name, sizeof (zc-zc_name));
 2434 rc = ioctl(zhp-zfs_hdl-libzfs_fd, arg, zc);
 2435
 2436 if (rc == -1) {
 2437 switch (errno) {
 2438 case ENOMEM:
 2439 /* expand nvlist memory and try again */
 2440 if (zcmd_expand_dst_nvlist(zhp-zfs_hdl, zc) != 0) {
 2441 zcmd_free_nvlists(zc);
 2442 return (-1);
 2443 }


 This code assumes ioctl() returns either 0 or -1, but I'm occasionally getting
 12 (=ENOMEM) here.  After changing the condition in line 2436 to just if 
 (rc)
 and recompiling the zfs command the output of zfs list -r -t snapshot 
 matches
 the output of zdb.


 Kind regards,
 Michael




 -- System Information:
 Debian Release: 7.8
   APT prefers stable
   APT policy: (500, 'stable')
 Architecture: armhf (armv7l)

 Kernel: Linux 3.4.104+ (SMP w/2 CPU cores; PREEMPT)
 Locale: LANG=C, LC_CTYPE=de_DE.UTF-8 (charmap=UTF-8)
 Shell: /bin/sh linked to /bin/dash

 Versions of packages zfs-fuse depends on:
 ii  fuse 2.9.0-2+deb7u1
 ii  libaio1  0.3.109-3
 ii  libc62.13-38+deb7u8
 ii  libfuse2 2.9.0-2+deb7u1
 ii  libgcc1  1:4.7.2-5
 ii  libssl1.0.0  1.0.1e-2+deb7u14
 ii  lsb-base 4.1+Debian8+deb7u1
 ii  zlib1g   1:1.2.7.dfsg-13

 zfs-fuse recommends no packages.

 Versions of packages zfs-fuse suggests:
 pn  kpartx none
 ii  nfs-kernel-server  1:1.2.6-4

 -- Configuration Files:
 /etc/zfs/zfsrc changed [not included]

 -- no debconf information



-- 
Asias


-- 
To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org
with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org