mirror of
https://github.com/torvalds/linux.git
synced 2026-06-10 23:53:52 +02:00
xfs: Avoid inodes in reclaim when flushing from inode cache
commit 018027be90 upstream
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: Dave Chinner <david@fromorbit.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Alex Elder <aelder@sgi.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
96ce91ba51
commit
22a482c621
|
|
@ -179,26 +179,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
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user