]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
xfs: do not take the iolock in xfs_inactive
authorChristoph Hellwig <hch@infradead.org>
Wed, 4 Jul 2012 15:13:31 +0000 (11:13 -0400)
committerBen Myers <bpm@sgi.com>
Sun, 29 Jul 2012 21:16:49 +0000 (16:16 -0500)
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>
fs/xfs/xfs_inode.c
fs/xfs/xfs_vnodeops.c

index 5c10825f2f80f8d0508b7056def9034977c0c2ce..2778258fcfa239e07dbc79edf6cb4750b7e13dd8 100644 (file)
@@ -1123,7 +1123,9 @@ xfs_itruncate_extents(
        int                     error = 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(tp->t_flags & XFS_TRANS_PERM_LOG_RES);
        ASSERT(ip->i_itemp != NULL);
index 9a2ae8c0ecc437ff10d05df30a74666b3669ccd7..79270430dafcb8dfd88eff98832780eb68e26a72 100644 (file)
@@ -554,7 +554,7 @@ xfs_inactive(
                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);
 
        if (S_ISLNK(ip->i_d.di_mode)) {
@@ -591,21 +591,24 @@ xfs_inactive(
                ASSERT(ip->i_d.di_forkoff != 0);
 
                error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES);
-               xfs_iunlock(ip, XFS_ILOCK_EXCL);
                if (error)
-                       goto error_unlock;
+                       goto out_unlock;
+
+               xfs_iunlock(ip, XFS_ILOCK_EXCL);
 
                error = xfs_attr_inactive(ip);
                if (error)
-                       goto error_unlock;
+                       goto out;
 
                tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE);
                error = xfs_trans_reserve(tp, 0,
                                          XFS_IFREE_LOG_RES(mp),
                                          0, XFS_TRANS_PERM_LOG_RES,
                                          XFS_INACTIVE_LOG_COUNT);
-               if (error)
-                       goto error_cancel;
+               if (error) {
+                       xfs_trans_cancel(tp, 0);
+                       goto out;
+               }
 
                xfs_ilock(ip, XFS_ILOCK_EXCL);
                xfs_trans_ijoin(tp, ip, 0);
@@ -658,21 +661,13 @@ xfs_inactive(
         * Release the dquots held by inode, if any.
         */
        xfs_qm_dqdetach(ip);
-       xfs_iunlock(ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL);
-
+out_unlock:
+       xfs_iunlock(ip, XFS_ILOCK_EXCL);
 out:
        return VN_INACTIVE_CACHE;
 out_cancel:
        xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT);
-       xfs_iunlock(ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL);
-       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;
+       goto out_unlock;
 }
 
 /*