mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-11 05:17:10 +09:00
xfs: fix xfs_mark_inode_dirty during umount
commit 866e4ed774 upstream.
During umount we do not add a dirty inode to the lru and wait for it to
become clean first, but force writeback of data and metadata with
I_WILL_FREE set. Currently there is no way for XFS to detect that the
inode has been redirtied for metadata operations, as we skip the
mark_inode_dirty call during teardown. Fix this by setting i_update_core
nanually in that case, so that the inode gets flushed during inode reclaim.
Alternatively we could enable calling mark_inode_dirty for inodes in
I_WILL_FREE state, and let the VFS dirty tracking handle this. I decided
against this as we will get better I/O patterns from reclaim compared to
the synchronous writeout in write_inode_now, and always marking the inode
dirty in some way from xfs_mark_inode_dirty is a better safetly net in
either case.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Alex Elder <aelder@sgi.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
e62cccfcf5
commit
afd717d6cd
@@ -69,9 +69,8 @@ xfs_synchronize_times(
|
||||
}
|
||||
|
||||
/*
|
||||
* If the linux inode is valid, mark it dirty.
|
||||
* Used when committing a dirty inode into a transaction so that
|
||||
* the inode will get written back by the linux code
|
||||
* If the linux inode is valid, mark it dirty, else mark the dirty state
|
||||
* in the XFS inode to make sure we pick it up when reclaiming the inode.
|
||||
*/
|
||||
void
|
||||
xfs_mark_inode_dirty_sync(
|
||||
@@ -81,6 +80,10 @@ xfs_mark_inode_dirty_sync(
|
||||
|
||||
if (!(inode->i_state & (I_WILL_FREE|I_FREEING)))
|
||||
mark_inode_dirty_sync(inode);
|
||||
else {
|
||||
barrier();
|
||||
ip->i_update_core = 1;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
@@ -91,6 +94,11 @@ xfs_mark_inode_dirty(
|
||||
|
||||
if (!(inode->i_state & (I_WILL_FREE|I_FREEING)))
|
||||
mark_inode_dirty(inode);
|
||||
else {
|
||||
barrier();
|
||||
ip->i_update_core = 1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user