mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-06 10:57:46 +00:00
xfs: Don't flush stale inodes
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>
This commit is contained in:
parent
d6d59bada3
commit
44e08c45cc
1 changed files with 7 additions and 3 deletions
|
@ -2841,10 +2841,14 @@ xfs_iflush(
|
||||||
mp = ip->i_mount;
|
mp = ip->i_mount;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the inode isn't dirty, then just release the inode
|
* If the inode isn't dirty, then just release the inode flush lock and
|
||||||
* flush lock and do nothing.
|
* 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);
|
xfs_ifunlock(ip);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue