Re: [PATCH 16/24] xfs: don't block inode reclaim on the ILOCK

Darrick J. Wong
2020-05-22T23:11:28Z

On Fri, May 22, 2020 at 01:50:21PM +1000, Dave Chinner wrote:
> From: Dave Chinner <dchinner@redhat.com>
>
> When we attempt to reclaim an inode, the first thing we do it take

"...we do is take the inode lock."

With that fixed,
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>

--D

> 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>
> ---
> fs/xfs/xfs_icache.c | 8 +++++---
> 1 file changed, 5 insertions(+), 3 deletions(-)
>
> diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c
> index f44493b2eae77..c020d2379e12e 100644
> --- a/fs/xfs/xfs_icache.c
> +++ b/fs/xfs/xfs_icache.c
> @@ -1138,9 +1138,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);
> @@ -1157,8 +1158,9 @@ xfs_reclaim_inode(
>
> out_ifunlock:
> xfs_ifunlock(ip);
> -out:
> +out_iunlock:
> xfs_iunlock(ip, XFS_ILOCK_EXCL);
> +out:
> xfs_iflags_clear(ip, XFS_IRECLAIM);
> return false;
>
> --
> 2.26.2.761.g0e0b3e54be
>