From: Gunnar Beutner Date: Thu, 3 Nov 2011 05:48:13 +0000 (+0100) Subject: Fix a race condition in zfs_getattr_fast() X-Git-Tag: zfs-0.6.0-rc7~74 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a7b125e9a577cbf66ddbd7cf9701028ff150ee8e;p=zfs Fix a race condition in zfs_getattr_fast() 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 Fixes #431 --- diff --git a/module/zfs/zfs_vnops.c b/module/zfs/zfs_vnops.c index 3331a1706..b7f5daaaf 100644 --- a/module/zfs/zfs_vnops.c +++ b/module/zfs/zfs_vnops.c @@ -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);