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

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: 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 acfbac77
......@@ -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;
}
......
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