diff options
author | Brian Behlendorf <[email protected]> | 2014-09-08 18:31:27 -0700 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2014-09-11 09:11:45 -0700 |
commit | 2d501583430e54be39c6aed033fc6f841e469f23 (patch) | |
tree | 288e68f21f376565000c08c8448854c0bb1e9453 | |
parent | 52dd454d05a14813ed74e93dfca6ac2994333c4d (diff) |
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 <[email protected]>
Closes #2670
-rw-r--r-- | module/zfs/zfs_znode.c | 2 |
1 files changed, 1 insertions, 1 deletions
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); |