xfs: don't block inode reclaim on the ILOCK
authorDave Chinner <dchinner@redhat.com>
Mon, 29 Jun 2020 21:49:17 +0000 (14:49 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Tue, 7 Jul 2020 14:15:08 +0000 (07:15 -0700)
When we attempt to reclaim an inode, the first thing we do is take
the inode lock. This is blocking right now, so if the inode being
accessed by something else (e.g. being flushed to the cluster
buffer) we will block here.

Change this to a trylock so that we do not block inode reclaim
unnecessarily here.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
fs/xfs/xfs_icache.c

index 592eab23c6e7320e697f53e529bb4464c1e3c1d2..f387ec21dd354ba8c72d0c4e214a1f8b3601f640 100644 (file)
@@ -1119,9 +1119,10 @@ xfs_reclaim_inode(
 {
        xfs_ino_t               ino = ip->i_ino; /* for radix_tree_delete */
 
-       xfs_ilock(ip, XFS_ILOCK_EXCL);
-       if (!xfs_iflock_nowait(ip))
+       if (!xfs_ilock_nowait(ip, XFS_ILOCK_EXCL))
                goto out;
+       if (!xfs_iflock_nowait(ip))
+               goto out_iunlock;
 
        if (XFS_FORCED_SHUTDOWN(ip->i_mount)) {
                xfs_iunpin_wait(ip);
@@ -1188,8 +1189,9 @@ reclaim:
 
 out_ifunlock:
        xfs_ifunlock(ip);
-out:
+out_iunlock:
        xfs_iunlock(ip, XFS_ILOCK_EXCL);
+out:
        xfs_iflags_clear(ip, XFS_IRECLAIM);
        return false;
 }