Message ID | 20200604074606.266213-21-david@fromorbit.com (mailing list archive) |
---|---|
State | Superseded, archived |
Headers | show |
Series | xfs: rework inode flushing to make inode reclaim fully asynchronous | expand |
On Thu, Jun 04, 2020 at 05:45:56PM +1000, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > 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> > 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 c4ba8d7bc45bc..d1c47a0e0b0ec 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 @@ 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 >
diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index c4ba8d7bc45bc..d1c47a0e0b0ec 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 @@ 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; }