On Mon, Sep 23, 2024 at 05:28:20PM +0200, Christoph Hellwig wrote: > 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. Shouldn't this be a part of the previous patch? AFAICT taking the invalidation lock in xfs_file_write_zero_eof is why we need the change to rwsem_assert_held_write here, right? > Signed-off-by: Christoph Hellwig <hch@xxxxxx> Reviewed-by: Darrick J. Wong <djwong@xxxxxxxxxx> --D > --- > 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 >