]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Fix 'zfs diff' shares error
authorBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 4 Dec 2013 21:50:34 +0000 (13:50 -0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 6 Dec 2013 17:42:39 +0000 (09:42 -0800)
When creating a dataset with ZoL a zsb->z_shares_dir ZAP object
will not be created because shares are unimplemented.  Instead ZoL
just sets zsb->z_shares_dir to zero to indicate there are no shares.

However, if you import a pool which was created with a different
ZFS implementation then the shares ZAP object may exist.  Code was
added to handle this case but it clearly wasn't sufficiently tested
with other ZFS pools.

There was a bug in the zpl_shares_getattr() function which passed
the wrong inode to zfs_getattr_fast() for the case where are shares
ZAP object does exist.  This causes an EIO to be returned to stat64()
which in turn causes 'zfs diff' to fail.

This fix is the pass the correct inode after a sucessful zfs_zget().
Additionally, only put away the references if we were able to get one.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Graham Booker <https://github.com/gbooker>
Signed-off-by: timemaster67 <https://github.com/timemaster67>
Closes #1426
Closes #481

module/zfs/zpl_ctldir.c

index 96157ec780f45b678a25162f90f389d9737898cc..8afe8bfdb3e57253e08c9a8f6f8b8e52bbe8a382 100644 (file)
@@ -497,10 +497,11 @@ zpl_shares_getattr(struct vfsmount *mnt, struct dentry *dentry,
        }
 
        error = -zfs_zget(zsb, zsb->z_shares_dir, &dzp);
-       if (error == 0)
-               error = -zfs_getattr_fast(dentry->d_inode, stat);
+       if (error == 0) {
+               error = -zfs_getattr_fast(ZTOI(dzp), stat);
+               iput(ZTOI(dzp));
+       }
 
-       iput(ZTOI(dzp));
        ZFS_EXIT(zsb);
        ASSERT3S(error, <=, 0);