| From david@fromorbit.com Fri Apr 2 11:08:07 2010 |
| From: Dave Chinner <david@fromorbit.com> |
| Date: Fri, 12 Mar 2010 09:42:06 +1100 |
| Subject: xfs: Don't flush stale inodes |
| To: stable@kernel.org |
| Cc: xfs@oss.sgi.com |
| Message-ID: <1268347337-7160-9-git-send-email-david@fromorbit.com> |
| |
| From: Dave Chinner <david@fromorbit.com> |
| |
| commit 44e08c45cc14e6190a424be8d450070c8e508fad upstream |
| |
| Because inodes remain in cache much longer than inode buffers do |
| under memory pressure, we can get the situation where we have |
| stale, dirty inodes being reclaimed but the backing storage has |
| been freed. Hence we should never, ever flush XFS_ISTALE inodes |
| to disk as there is no guarantee that the backing buffer is in |
| cache and still marked stale when the flush occurs. |
| |
| Signed-off-by: Dave Chinner <david@fromorbit.com> |
| Signed-off-by: Alex Elder <aelder@sgi.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| --- |
| fs/xfs/xfs_inode.c | 10 +++++++--- |
| 1 file changed, 7 insertions(+), 3 deletions(-) |
| |
| --- a/fs/xfs/xfs_inode.c |
| +++ b/fs/xfs/xfs_inode.c |
| @@ -2877,10 +2877,14 @@ xfs_iflush( |
| mp = ip->i_mount; |
| |
| /* |
| - * If the inode isn't dirty, then just release the inode |
| - * flush lock and do nothing. |
| + * If the inode isn't dirty, then just release the inode flush lock and |
| + * do nothing. Treat stale inodes the same; we cannot rely on the |
| + * backing buffer remaining stale in cache for the remaining life of |
| + * the stale inode and so xfs_itobp() below may give us a buffer that |
| + * no longer contains inodes below. Doing this stale check here also |
| + * avoids forcing the log on pinned, stale inodes. |
| */ |
| - if (xfs_inode_clean(ip)) { |
| + if (xfs_inode_clean(ip) || xfs_iflags_test(ip, XFS_ISTALE)) { |
| xfs_ifunlock(ip); |
| return 0; |
| } |