From 2d501583430e54be39c6aed033fc6f841e469f23 Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Mon, 8 Sep 2014 18:31:27 -0700 Subject: [PATCH] Fix z_teardown_inactive_lock deadlock When rolling back a mounted filesystem zfs_suspend() is called which acquires the z_teardown_inactive_lock. This lock can not be dropped until the filesystem has been rolled back and resumed in zfs_resume_fs(). Therefore, we must not call iput() under this lock because it may result in the inode->evict() handler being called which also takes this lock. Instead use zfs_iput_async() to ensure dropping the last reference is deferred and runs in a safe context. Signed-off-by: Brian Behlendorf Closes #2670 --- module/zfs/zfs_znode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/zfs/zfs_znode.c b/module/zfs/zfs_znode.c index f2e305f7a..08faf0838 100644 --- a/module/zfs/zfs_znode.c +++ b/module/zfs/zfs_znode.c @@ -1009,7 +1009,7 @@ zfs_rezget(znode_t *zp) } if (zp->z_xattr_parent) { - iput(ZTOI(zp->z_xattr_parent)); + zfs_iput_async(ZTOI(zp->z_xattr_parent)); zp->z_xattr_parent = NULL; } rw_exit(&zp->z_xattr_lock);