Skip to content

Commit

Permalink
xfs: fix stale inode flush avoidance
Browse files Browse the repository at this point in the history
When reclaiming stale inodes, we need to guarantee that inodes are
unpinned before returning with a "clean" status. If we don't we can
reclaim inodes that are pinned, leading to use after free in the
transaction subsystem as transactions complete.

Signed-off-by: Dave Chinner <david@fromorbit.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Alex Elder <aelder@sgi.com>
  • Loading branch information
Dave Chinner authored and Alex Elder committed Jan 15, 2010
1 parent 126976c commit 4b6a468
Showing 1 changed file with 15 additions and 6 deletions.
21 changes: 15 additions & 6 deletions fs/xfs/xfs_inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -2842,13 +2842,9 @@ xfs_iflush(

/*
* 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.
* do nothing.
*/
if (xfs_inode_clean(ip) || xfs_iflags_test(ip, XFS_ISTALE)) {
if (xfs_inode_clean(ip)) {
xfs_ifunlock(ip);
return 0;
}
Expand All @@ -2871,6 +2867,19 @@ xfs_iflush(
}
xfs_iunpin_wait(ip);

/*
* For stale inodes 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. We have to check this after ensuring the inode is
* unpinned so that it is safe to reclaim the stale inode after the
* flush call.
*/
if (xfs_iflags_test(ip, XFS_ISTALE)) {
xfs_ifunlock(ip);
return 0;
}

/*
* This may have been unpinned because the filesystem is shutting
* down forcibly. If that's the case we must not write this inode
Expand Down

0 comments on commit 4b6a468

Please sign in to comment.