xfs
[Top] [All Lists]

[PATCH 2/4] xfs: Avoid inodes in reclaim when flushing from inode cache

To: xfs@xxxxxxxxxxx
Subject: [PATCH 2/4] xfs: Avoid inodes in reclaim when flushing from inode cache
From: Dave Chinner <david@xxxxxxxxxxxxx>
Date: Mon, 11 Jan 2010 10:51:46 +1100
In-reply-to: <1263167508-9346-1-git-send-email-david@xxxxxxxxxxxxx>
References: <1263167508-9346-1-git-send-email-david@xxxxxxxxxxxxx>
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@xxxxxxxxxxxxx>
---
 fs/xfs/linux-2.6/xfs_sync.c |   31 ++++++++++++++++++-------------
 1 files changed, 18 insertions(+), 13 deletions(-)

diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c
index 2ee1265..6946978 100644
--- a/fs/xfs/linux-2.6/xfs_sync.c
+++ b/fs/xfs/linux-2.6/xfs_sync.c
@@ -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
-- 
1.6.5

<Prev in Thread] Current Thread [Next in Thread>