xfs: Convert to new freezing code
Generic code now blocks all writers from standard write paths. So we add blocking of all writers coming from ioctl (we get a protection of ioctl against racing remount read-only as a bonus) and convert xfs_file_aio_write() to a non-racy freeze protection. We also keep freeze protection on transaction start to block internal filesystem writes such as removal of preallocated blocks. CC: Ben Myers <bpm@sgi.com> CC: Alex Elder <elder@kernel.org> CC: xfs@oss.sgi.com Signed-off-by: Jan Kara <jack@suse.cz> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
8e8ad8a57c
commit
d9457dc056
10 changed files with 109 additions and 16 deletions
|
@ -123,6 +123,12 @@ xfs_setfilesize_trans_alloc(
|
|||
|
||||
ioend->io_append_trans = tp;
|
||||
|
||||
/*
|
||||
* We will pass freeze protection with a transaction. So tell lockdep
|
||||
* we released it.
|
||||
*/
|
||||
rwsem_release(&ioend->io_inode->i_sb->s_writers.lock_map[SB_FREEZE_FS-1],
|
||||
1, _THIS_IP_);
|
||||
/*
|
||||
* We hand off the transaction to the completion thread now, so
|
||||
* clear the flag here.
|
||||
|
@ -199,6 +205,15 @@ xfs_end_io(
|
|||
struct xfs_inode *ip = XFS_I(ioend->io_inode);
|
||||
int error = 0;
|
||||
|
||||
if (ioend->io_append_trans) {
|
||||
/*
|
||||
* We've got freeze protection passed with the transaction.
|
||||
* Tell lockdep about it.
|
||||
*/
|
||||
rwsem_acquire_read(
|
||||
&ioend->io_inode->i_sb->s_writers.lock_map[SB_FREEZE_FS-1],
|
||||
0, 1, _THIS_IP_);
|
||||
}
|
||||
if (XFS_FORCED_SHUTDOWN(ip->i_mount)) {
|
||||
ioend->io_error = -EIO;
|
||||
goto done;
|
||||
|
@ -1410,6 +1425,9 @@ out_trans_cancel:
|
|||
if (ioend->io_append_trans) {
|
||||
current_set_flags_nested(&ioend->io_append_trans->t_pflags,
|
||||
PF_FSTRANS);
|
||||
rwsem_acquire_read(
|
||||
&inode->i_sb->s_writers.lock_map[SB_FREEZE_FS-1],
|
||||
0, 1, _THIS_IP_);
|
||||
xfs_trans_cancel(ioend->io_append_trans, 0);
|
||||
}
|
||||
out_destroy_ioend:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue