Fix a race condition in zfs_getattr_fast()
authorGunnar Beutner <gunnar@beutner.name>
Thu, 3 Nov 2011 05:48:13 +0000 (06:48 +0100)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 3 Nov 2011 17:13:09 +0000 (10:13 -0700)
zfs_getattr_fast() was missing a lock on the ZFS superblock which
could result in zfs_znode_dmu_fini() clearing the zp->z_sa_hdl member
while zfs_getattr_fast() was accessing the znode. The result of this
would usually be a panic.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Fixes #431

module/zfs/zfs_vnops.c

index 3331a17..b7f5daa 100644 (file)
@@ -2301,6 +2301,9 @@ zfs_getattr_fast(struct inode *ip, struct kstat *sp)
        znode_t *zp = ITOZ(ip);
        zfs_sb_t *zsb = ITOZSB(ip);
 
+       ZFS_ENTER(zsb);
+       ZFS_VERIFY_ZP(zp);
+
        mutex_enter(&zp->z_lock);
 
        generic_fillattr(ip, sp);
@@ -2316,6 +2319,8 @@ zfs_getattr_fast(struct inode *ip, struct kstat *sp)
 
        mutex_exit(&zp->z_lock);
 
+       ZFS_EXIT(zsb);
+
        return (0);
 }
 EXPORT_SYMBOL(zfs_getattr_fast);