From 0bf37725f80949f240efb7aec0ada48faaa9c7e5 Mon Sep 17 00:00:00 2001 From: Chunwei Chen Date: Fri, 9 Oct 2015 12:27:01 -0700 Subject: [PATCH] Fix fail path in zfs_znode_alloc When sa_bulk_lookup() fails, unlock_new_inode() will spit out a WARNING. It will also recursive deadlock on ZFS_OBJ_HOLD_ENTER in zfs_zinactive(). Since we never call insert_inode_locked in fail path, I_NEW is never set, the inode is never hashed. So unlock_new_inode() can be safely remove it. We set z_sa_hdl to NULL in fail path so that iput path will stop at zfs_inactive() without entering zfs_zinactive(). This way we can avoid the deadlock and prevent double sa_handle_destroy(). Signed-off-by: Chunwei Chen Signed-off-by: Brian Behlendorf Issue #3899 --- module/zfs/zfs_znode.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/module/zfs/zfs_znode.c b/module/zfs/zfs_znode.c index d39743de94..1eefec4d3e 100644 --- a/module/zfs/zfs_znode.c +++ b/module/zfs/zfs_znode.c @@ -410,7 +410,7 @@ zfs_znode_alloc(zfs_sb_t *zsb, dmu_buf_t *db, int blksz, if (sa_bulk_lookup(zp->z_sa_hdl, bulk, count) != 0 || zp->z_gen == 0) { if (hdl == NULL) sa_handle_destroy(zp->z_sa_hdl); - + zp->z_sa_hdl = NULL; goto error; } @@ -448,7 +448,6 @@ zfs_znode_alloc(zfs_sb_t *zsb, dmu_buf_t *db, int blksz, return (zp); error: - unlock_new_inode(ip); iput(ip); return (NULL); }