mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-03 17:14:14 +08:00
xfs: fix xfs_mark_inode_dirty during umount
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> (cherry picked from commit da6742a5a4cc844a9982fdd936ddb537c0747856) Signed-off-by: Alex Elder <aelder@sgi.com>
This commit is contained in:
parent
242d621964
commit
866e4ed774
@ -70,9 +70,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(
|
||||
@ -82,6 +81,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
|
||||
@ -92,6 +95,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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user