]> git.ipfire.org Git - thirdparty/kernel/linux.git/commit
xfs: resample the data fork mapping after cycling ILOCK
authorDarrick J. Wong <djwong@kernel.org>
Tue, 14 Jul 2026 06:03:44 +0000 (23:03 -0700)
committerCarlos Maiolino <cem@kernel.org>
Tue, 14 Jul 2026 09:00:14 +0000 (11:00 +0200)
commit2f4acd0fcd862e22eab45690ec2c08c80b6ef2e7
treee5f4f12ec449787cd92f13dfe5280a94a0377736
parent9202ee546b0cd71004eed7598546efe4660097da
xfs: resample the data fork mapping after cycling ILOCK

xfs_reflink_fill_{cow_hole,delalloc} are both presented with an inode,
a data fork mapping, and a cow fork mapping.  Unfortunately, these two
helpers cycle the ILOCK to grab a transaction, which means that the
mappings are stale as soon as we reacquire the ILOCK.  Currently we
refresh the cow fork mapping by re-calling xfs_find_trim_cow_extent, but
we don't refresh the data fork mapping beforehand, which means that the
xfs_bmap_trim_cow in that function queries the refcount btree about the
wrong physical blocks and returns an inaccurate value in *shared.

If *shared is now false, the directio write proceeds with a stale data
fork mapping.  Fix this by querying the data fork mapping if the
sequence counter changes across the ILOCK cycle.

Cc: hch@lst.de
Cc: stable@vger.kernel.org # v4.11
Fixes: 3c68d44a2b49a0 ("xfs: allocate direct I/O COW blocks in iomap_begin")
Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
fs/xfs/xfs_reflink.c