xfs: fix stale inode flush avoidance
PATCH 1/1 xfs: fix stale inode flush avoidance
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.
--- fs/xfs/xfs_inode.c | 21 +++++++++++++++------ 1 files changed, 15 insertions(+), 6 deletions(-)
fs/xfs/xfs_inode.c +15 -6
@@ -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 ; }
@@ -2872,6 +2868,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 * to disk, because the log record didn't make it to disk!
Signature · 6 lines
1.6.5 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
Quoted 4 lines · Dave Chinner
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.
Looks good. Per discussion this morning the clean check might not be good enough for delwri buffers either, but as let's leave that for the more throughout redo of the inode buffer flushing.
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs