summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Chinner <dchinner@redhat.com>2020-06-30 00:49:17 +0300
committerDarrick J. Wong <darrick.wong@oracle.com>2020-07-07 17:15:08 +0300
commit9552e14d3e879a3b4281427ef368271f371ea167 (patch)
treea68c0e2425c30d34c4a579902edced661612790b
parent0e8e2c6343dd74a4f55f8507a9fae9064d456436 (diff)
downloadlinux-9552e14d3e879a3b4281427ef368271f371ea167.tar.xz
xfs: don't block inode reclaim on the ILOCK
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>
-rw-r--r--fs/xfs/xfs_icache.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c
index 592eab23c6e7..f387ec21dd35 100644
--- a/fs/xfs/xfs_icache.c
+++ b/fs/xfs/xfs_icache.c
@@ -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;
}