[PATCH 06/10] xfs: zeroing already holds invalidate_lock

Christoph Hellwig
2024-09-24T07:41:36Z

All XFS callers of iomap_zero_range 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 zeroing
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>
---
fs/xfs/xfs_iomap.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c
index 4fa4d66dc37761..0f5fa3de6d3ecc 100644
--- a/fs/xfs/xfs_iomap.c
+++ b/fs/xfs/xfs_iomap.c
@@ -1239,10 +1239,17 @@ xfs_buffered_write_iomap_end(
if (start_byte >= end_byte)
return 0;

- filemap_invalidate_lock(inode->i_mapping);
+ /* For zeroing operations the callers already hold invalidate_lock. */
+ if (flags & IOMAP_ZERO)
+ rwsem_assert_held_write(&inode->i_mapping->invalidate_lock);
+ 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);
+
+ if (!(flags & IOMAP_ZERO))
+ filemap_invalidate_unlock(inode->i_mapping);
return 0;
}

--
2.45.2