Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 018027be authored by Dave Chinner's avatar Dave Chinner Committed by Alex Elder
Browse files

xfs: Avoid inodes in reclaim when flushing from inode cache



The reclaim code will handle flushing of dirty inodes before reclaim
occurs, so avoid them when determining whether an inode is a
candidate for flushing to disk when walking the radix trees.  This
is based on a test patch from Christoph Hellwig.

Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarAlex Elder <aelder@sgi.com>
parent c8e20be0
Loading
Loading
Loading
Loading
+18 −13
Original line number Diff line number Diff line
@@ -180,26 +180,31 @@ xfs_sync_inode_valid(
	struct xfs_perag	*pag)
{
	struct inode		*inode = VFS_I(ip);
	int			error = EFSCORRUPTED;

	/* nothing to sync during shutdown */
	if (XFS_FORCED_SHUTDOWN(ip->i_mount)) {
		read_unlock(&pag->pag_ici_lock);
		return EFSCORRUPTED;
	}
	if (XFS_FORCED_SHUTDOWN(ip->i_mount))
		goto out_unlock;

	/* If we can't get a reference on the inode, it must be in reclaim. */
	if (!igrab(inode)) {
		read_unlock(&pag->pag_ici_lock);
		return ENOENT;
	}
	read_unlock(&pag->pag_ici_lock);
	/* avoid new or reclaimable inodes. Leave for reclaim code to flush */
	error = ENOENT;
	if (xfs_iflags_test(ip, XFS_INEW | XFS_IRECLAIMABLE | XFS_IRECLAIM))
		goto out_unlock;

	if (is_bad_inode(inode) || xfs_iflags_test(ip, XFS_INEW)) {
	/* If we can't grab the inode, it must on it's way to reclaim. */
	if (!igrab(inode))
		goto out_unlock;

	if (is_bad_inode(inode)) {
		IRELE(ip);
		return ENOENT;
		goto out_unlock;
	}

	return 0;
	/* inode is valid */
	error = 0;
out_unlock:
	read_unlock(&pag->pag_ici_lock);
	return error;
}

STATIC int