mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-04 02:34:10 -04:00
xfs: IOMAP_ZERO and IOMAP_UNSHARE already hold invalidate_lock
All XFS callers of iomap_zero_range and iomap_file_unshare already hold invalidate_lock, so we can't take it again in iomap_file_buffered_write_punch_delalloc. Use the passed in flags argument to detect if we're called from a zero or unshare operation and don't take the lock again in this case. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Darrick J. Wong <djwong@kernel.org> Signed-off-by: Carlos Maiolino <cem@kernel.org>
This commit is contained in:
committed by
Carlos Maiolino
parent
acfbac7764
commit
abd7d651ad
@@ -1239,10 +1239,18 @@ xfs_buffered_write_iomap_end(
|
||||
if (start_byte >= end_byte)
|
||||
return 0;
|
||||
|
||||
filemap_invalidate_lock(inode->i_mapping);
|
||||
iomap_write_delalloc_release(inode, start_byte, end_byte, flags, iomap,
|
||||
xfs_buffered_write_delalloc_punch);
|
||||
filemap_invalidate_unlock(inode->i_mapping);
|
||||
/* For zeroing operations the callers already hold invalidate_lock. */
|
||||
if (flags & (IOMAP_UNSHARE | IOMAP_ZERO)) {
|
||||
rwsem_assert_held_write(&inode->i_mapping->invalidate_lock);
|
||||
iomap_write_delalloc_release(inode, start_byte, end_byte, flags,
|
||||
iomap, xfs_buffered_write_delalloc_punch);
|
||||
} else {
|
||||
filemap_invalidate_lock(inode->i_mapping);
|
||||
iomap_write_delalloc_release(inode, start_byte, end_byte, flags,
|
||||
iomap, xfs_buffered_write_delalloc_punch);
|
||||
filemap_invalidate_unlock(inode->i_mapping);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user