xfs: do not take the iolock in xfs_inactive

An inode that enters xfs_inactive has been removed from all global
lists but the inode hash, and can't be recycled in xfs_iget before
it has been marked reclaimable.  Thus taking the iolock in here
is not nessecary at all, and given the amount of lockdep false
positives it has triggered already I'd rather remove the locking.

The only change outside of xfs_inactive is relaxing an assert in
xfs_itruncate_extents.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Rich Johnston <rjohnston@sgi.com>
Signed-off-by: Ben Myers <bpm@sgi.com>
This commit is contained in:
Christoph Hellwig 2012-07-04 11:13:31 -04:00 committed by Ben Myers
parent fe67be036f
commit 0b56185b0d
2 changed files with 15 additions and 18 deletions

View File

@ -1123,7 +1123,9 @@ xfs_itruncate_extents(
int error = 0; int error = 0;
int done = 0; int done = 0;
ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_IOLOCK_EXCL)); ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
ASSERT(!atomic_read(&VFS_I(ip)->i_count) ||
xfs_isilocked(ip, XFS_IOLOCK_EXCL));
ASSERT(new_size <= XFS_ISIZE(ip)); ASSERT(new_size <= XFS_ISIZE(ip));
ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES); ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES);
ASSERT(ip->i_itemp != NULL); ASSERT(ip->i_itemp != NULL);

View File

@ -554,7 +554,7 @@ xfs_inactive(
return VN_INACTIVE_CACHE; return VN_INACTIVE_CACHE;
} }
xfs_ilock(ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); xfs_ilock(ip, XFS_ILOCK_EXCL);
xfs_trans_ijoin(tp, ip, 0); xfs_trans_ijoin(tp, ip, 0);
if (S_ISLNK(ip->i_d.di_mode)) { if (S_ISLNK(ip->i_d.di_mode)) {
@ -591,21 +591,24 @@ xfs_inactive(
ASSERT(ip->i_d.di_forkoff != 0); ASSERT(ip->i_d.di_forkoff != 0);
error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES);
xfs_iunlock(ip, XFS_ILOCK_EXCL);
if (error) if (error)
goto error_unlock; goto out_unlock;
xfs_iunlock(ip, XFS_ILOCK_EXCL);
error = xfs_attr_inactive(ip); error = xfs_attr_inactive(ip);
if (error) if (error)
goto error_unlock; goto out;
tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE);
error = xfs_trans_reserve(tp, 0, error = xfs_trans_reserve(tp, 0,
XFS_IFREE_LOG_RES(mp), XFS_IFREE_LOG_RES(mp),
0, XFS_TRANS_PERM_LOG_RES, 0, XFS_TRANS_PERM_LOG_RES,
XFS_INACTIVE_LOG_COUNT); XFS_INACTIVE_LOG_COUNT);
if (error) if (error) {
goto error_cancel; xfs_trans_cancel(tp, 0);
goto out;
}
xfs_ilock(ip, XFS_ILOCK_EXCL); xfs_ilock(ip, XFS_ILOCK_EXCL);
xfs_trans_ijoin(tp, ip, 0); xfs_trans_ijoin(tp, ip, 0);
@ -658,21 +661,13 @@ xfs_inactive(
* Release the dquots held by inode, if any. * Release the dquots held by inode, if any.
*/ */
xfs_qm_dqdetach(ip); xfs_qm_dqdetach(ip);
xfs_iunlock(ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); out_unlock:
xfs_iunlock(ip, XFS_ILOCK_EXCL);
out: out:
return VN_INACTIVE_CACHE; return VN_INACTIVE_CACHE;
out_cancel: out_cancel:
xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT);
xfs_iunlock(ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); goto out_unlock;
return VN_INACTIVE_CACHE;
error_cancel:
ASSERT(XFS_FORCED_SHUTDOWN(mp));
xfs_trans_cancel(tp, 0);
error_unlock:
xfs_iunlock(ip, XFS_IOLOCK_EXCL);
return VN_INACTIVE_CACHE;
} }
/* /*