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 <behlendorf1@llnl.gov>
Closes #2670
This commit is contained in:
Brian Behlendorf 2014-09-08 18:31:27 -07:00
parent 52dd454d05
commit 2d50158343

View File

@ -1009,7 +1009,7 @@ zfs_rezget(znode_t *zp)
} }
if (zp->z_xattr_parent) { if (zp->z_xattr_parent) {
iput(ZTOI(zp->z_xattr_parent)); zfs_iput_async(ZTOI(zp->z_xattr_parent));
zp->z_xattr_parent = NULL; zp->z_xattr_parent = NULL;
} }
rw_exit(&zp->z_xattr_lock); rw_exit(&zp->z_xattr_lock);