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

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
Loading
Loading
Loading
Loading
+12 −4
Original line number Diff line number Diff line
@@ -1239,10 +1239,18 @@ xfs_buffered_write_iomap_end(
	if (start_byte >= end_byte)
		return 0;

	/* 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);
		iomap_write_delalloc_release(inode, start_byte, end_byte, flags,
				iomap, xfs_buffered_write_delalloc_punch);
		filemap_invalidate_unlock(inode->i_mapping);
	}

	return 0;
}