aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_inode.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2010-01-18 17:08:07 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2010-01-18 17:08:07 -0500
commit1e868d8e6d2c4b8736cdf7a4bd5701e4f527f722 (patch)
treece9ab0c1e5b4fd1610e8bf49a089a5cd5a474566 /fs/xfs/xfs_inode.c
parent2faae42233778676607a2a45b95aeb375bebe2c6 (diff)
parente09f98606dcc156de1146c209d45a0d6d5f51c3f (diff)
Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs
* 'for-linus' of git://oss.sgi.com/xfs/xfs: xfs: xfs_swap_extents needs to handle dynamic fork offsets xfs: fix missing error check in xfs_rtfree_range xfs: fix stale inode flush avoidance xfs: Remove inode iolock held check during allocation xfs: reclaim all inodes by background tree walks xfs: Avoid inodes in reclaim when flushing from inode cache xfs: reclaim inodes under a write lock
Diffstat (limited to 'fs/xfs/xfs_inode.c')
-rw-r--r--fs/xfs/xfs_inode.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
index 391d36b0e68c..ef77fd88c8e3 100644
--- a/fs/xfs/xfs_inode.c
+++ b/fs/xfs/xfs_inode.c
@@ -2842,13 +2842,9 @@ xfs_iflush(
2842 2842
2843 /* 2843 /*
2844 * If the inode isn't dirty, then just release the inode flush lock and 2844 * If the inode isn't dirty, then just release the inode flush lock and
2845 * do nothing. Treat stale inodes the same; we cannot rely on the 2845 * do nothing.
2846 * backing buffer remaining stale in cache for the remaining life of
2847 * the stale inode and so xfs_itobp() below may give us a buffer that
2848 * no longer contains inodes below. Doing this stale check here also
2849 * avoids forcing the log on pinned, stale inodes.
2850 */ 2846 */
2851 if (xfs_inode_clean(ip) || xfs_iflags_test(ip, XFS_ISTALE)) { 2847 if (xfs_inode_clean(ip)) {
2852 xfs_ifunlock(ip); 2848 xfs_ifunlock(ip);
2853 return 0; 2849 return 0;
2854 } 2850 }
@@ -2872,6 +2868,19 @@ xfs_iflush(
2872 xfs_iunpin_wait(ip); 2868 xfs_iunpin_wait(ip);
2873 2869
2874 /* 2870 /*
2871 * For stale inodes we cannot rely on the backing buffer remaining
2872 * stale in cache for the remaining life of the stale inode and so
2873 * xfs_itobp() below may give us a buffer that no longer contains
2874 * inodes below. We have to check this after ensuring the inode is
2875 * unpinned so that it is safe to reclaim the stale inode after the
2876 * flush call.
2877 */
2878 if (xfs_iflags_test(ip, XFS_ISTALE)) {
2879 xfs_ifunlock(ip);
2880 return 0;
2881 }
2882
2883 /*
2875 * This may have been unpinned because the filesystem is shutting 2884 * This may have been unpinned because the filesystem is shutting
2876 * down forcibly. If that's the case we must not write this inode 2885 * down forcibly. If that's the case we must not write this inode
2877 * to disk, because the log record didn't make it to disk! 2886 * to disk, because the log record didn't make it to disk!