[XFS] 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(). SGI-PV: 909874 SGI-Modid: xfs-linux-melb:xfs-kern:30468a Signed-off-by: Lachlan McIlroy <lachlan@sgi.com> Signed-off-by: David Chinner <dgc@sgi.com>
This commit is contained in:
parent
e12070a5dc
commit
461aa8a225
1 changed files with 8 additions and 14 deletions
|
@ -3694,12 +3694,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))) {
|
||||
|
@ -3719,17 +3719,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;
|
||||
|
|
Loading…
Reference in a new issue