aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_inode.c
diff options
context:
space:
mode:
authorDave Chinner <david@fromorbit.com>2010-02-05 20:37:26 -0500
committerDave Chinner <david@fromorbit.com>2010-02-05 20:37:26 -0500
commit777df5afdb26c71634edd60582be620ff94e87a0 (patch)
tree26ed86f1ec114250230e4e090be18980c94ce73f /fs/xfs/xfs_inode.c
parentd5db0f97fbbeff11c88dec1aaf1536a975afbaeb (diff)
xfs: Make inode reclaim states explicit
A.K.A.: don't rely on xfs_iflush() return value in reclaim We have gradually been moving checks out of the reclaim code because they are duplicated in xfs_iflush(). We've had a history of problems in this area, and many of them stem from the overloading of the return values from xfs_iflush() and interaction with inode flush locking to determine if the inode is safe to reclaim. With the desire to move to delayed write flushing of inodes and non-blocking inode tree reclaim walks, the overloading of the return value of xfs_iflush makes it very difficult to determine the correct thing to do next. This patch explicitly re-adds the checks to the inode reclaim code, removing the reliance on the return value of xfs_iflush() to determine what to do next. It also means that we can clearly document all the inode states that reclaim must handle and hence we can easily see that we handled all the necessary cases. This also removes the need for the xfs_inode_clean() check in xfs_iflush() as all callers now check this first (safely). Signed-off-by: Dave Chinner <david@fromorbit.com> Reviewed-by: Christoph Hellwig <hch@lst.de>
Diffstat (limited to 'fs/xfs/xfs_inode.c')
-rw-r--r--fs/xfs/xfs_inode.c11
1 files changed, 1 insertions, 10 deletions
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
index d0d1b5a05183..8d0666dd170a 100644
--- a/fs/xfs/xfs_inode.c
+++ b/fs/xfs/xfs_inode.c
@@ -2493,7 +2493,7 @@ __xfs_iunpin_wait(
2493 wait_event(ip->i_ipin_wait, (atomic_read(&ip->i_pincount) == 0)); 2493 wait_event(ip->i_ipin_wait, (atomic_read(&ip->i_pincount) == 0));
2494} 2494}
2495 2495
2496static inline void 2496void
2497xfs_iunpin_wait( 2497xfs_iunpin_wait(
2498 xfs_inode_t *ip) 2498 xfs_inode_t *ip)
2499{ 2499{
@@ -2849,15 +2849,6 @@ xfs_iflush(
2849 mp = ip->i_mount; 2849 mp = ip->i_mount;
2850 2850
2851 /* 2851 /*
2852 * If the inode isn't dirty, then just release the inode flush lock and
2853 * do nothing.
2854 */
2855 if (xfs_inode_clean(ip)) {
2856 xfs_ifunlock(ip);
2857 return 0;
2858 }
2859
2860 /*
2861 * We can't flush the inode until it is unpinned, so wait for it if we 2852 * We can't flush the inode until it is unpinned, so wait for it if we
2862 * are allowed to block. We know noone new can pin it, because we are 2853 * are allowed to block. We know noone new can pin it, because we are
2863 * holding the inode lock shared and you need to hold it exclusively to 2854 * holding the inode lock shared and you need to hold it exclusively to