Commit acfbac77 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Carlos Maiolino

xfs: take XFS_MMAPLOCK_EXCL xfs_file_write_zero_eof

xfs_file_write_zero_eof is the only caller of xfs_zero_range that does
not take XFS_MMAPLOCK_EXCL (aka the invalidate lock).  Currently that
is actually the right thing, as an error in the iomap zeroing code will
also take the invalidate_lock to clean up, but to fix that deadlock we
need a consistent locking pattern first.

The only extra thing that XFS_MMAPLOCK_EXCL will lock out are read
pagefaults, which isn't really needed here, but also not actively
harmful.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
Signed-off-by: default avatarCarlos Maiolino <cem@kernel.org>
parent 3c399374
...@@ -364,6 +364,7 @@ xfs_file_write_zero_eof( ...@@ -364,6 +364,7 @@ xfs_file_write_zero_eof(
{ {
struct xfs_inode *ip = XFS_I(iocb->ki_filp->f_mapping->host); struct xfs_inode *ip = XFS_I(iocb->ki_filp->f_mapping->host);
loff_t isize; loff_t isize;
int error;
/* /*
* We need to serialise against EOF updates that occur in IO completions * We need to serialise against EOF updates that occur in IO completions
...@@ -411,7 +412,12 @@ xfs_file_write_zero_eof( ...@@ -411,7 +412,12 @@ xfs_file_write_zero_eof(
} }
trace_xfs_zero_eof(ip, isize, iocb->ki_pos - isize); trace_xfs_zero_eof(ip, isize, iocb->ki_pos - isize);
return xfs_zero_range(ip, isize, iocb->ki_pos - isize, NULL);
xfs_ilock(ip, XFS_MMAPLOCK_EXCL);
error = xfs_zero_range(ip, isize, iocb->ki_pos - isize, NULL);
xfs_iunlock(ip, XFS_MMAPLOCK_EXCL);
return error;
} }
/* /*
......
...@@ -1449,6 +1449,8 @@ xfs_zero_range( ...@@ -1449,6 +1449,8 @@ xfs_zero_range(
{ {
struct inode *inode = VFS_I(ip); struct inode *inode = VFS_I(ip);
xfs_assert_ilocked(ip, XFS_IOLOCK_EXCL | XFS_MMAPLOCK_EXCL);
if (IS_DAX(inode)) if (IS_DAX(inode))
return dax_zero_range(inode, pos, len, did_zero, return dax_zero_range(inode, pos, len, did_zero,
&xfs_dax_write_iomap_ops); &xfs_dax_write_iomap_ops);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment