make inode reclaim synchronise with xfs_iflush_done()
PATCH v2 1/1 make inode reclaim synchronise with xfs_iflush_done()
On a forced shutdown, xfs_finish_reclaim() will skip flushing the inode. If the inode flush lock is not already held and there is an outstanding xfs_iflush_done() then we might free the inode prematurely. By acquiring and releasing the flush lock we will synchronise with xfs_iflush_done().
Lachlan
xfs/xfs_vnodeops.c renamed from xfs/xfs_vnodeops.c_1.727 +8 -14
@@ -3721,12 +3721,12 @@ xfs_finish_reclaim(* We get the flush lock regardless, though, just to make sure * we don't free it while it is being flushed. */ -if (!XFS_FORCED_SHUTDOWN (ip->i_mount)) { -if (!locked) { -xfs_ilock (ip,XFS_ILOCK_EXCL ); -xfs_iflock (ip); - } +if (!locked) { +xfs_ilock (ip,XFS_ILOCK_EXCL ); +xfs_iflock (ip); + } +if (!XFS_FORCED_SHUTDOWN (ip->i_mount)) {if (ip->i_update_core || ((ip->i_itemp !=NULL ) && (ip->i_itemp->ili_format.ilf_fields !=0 ))) {
@@ -3746,17 +3746,11 @@ xfs_finish_reclaim(ASSERT (ip->i_update_core ==0 );ASSERT (ip->i_itemp ==NULL || ip->i_itemp->ili_format.ilf_fields ==0 ); -xfs_iunlock (ip,XFS_ILOCK_EXCL ); - }else if (locked) { -/* -* We are not interested in doing an iflush if we're -* in the process of shutting down the filesystem forcibly. -* So, just reclaim the inode. -*/ -xfs_ifunlock (ip); -xfs_iunlock (ip,XFS_ILOCK_EXCL ); } +xfs_ifunlock (ip); +xfs_iunlock (ip,XFS_ILOCK_EXCL ); + reclaim:xfs_ireclaim (ip);return 0 ;
Quoted 4 lines · Lachlan McIlroy
On a forced shutdown,
xfs_finish_reclaim()will skip flushing the inode. If the inode flush lock is not already held and there is an outstandingxfs_iflush_done()then we might free the inode prematurely. By acquiring and releasing the flush lock we will synchronise withxfs_iflush_done().
Looks fine.
Cheers,
Dave.
Signature · 3 lines
Dave Chinner Principal Engineer SGI Australian Software Group