xfs: resample the data fork mapping after cycling ILOCK

Conflicts:
	fs/xfs/xfs_reflink.c - The variables around seq_before in
	xfs_reflink_fill_cow_hole are slightly different. We adjust the
	patch so that it still just adds the seq_before declaration.

[ Upstream commit 2f4acd0fcd862e22eab45690ec2c08c80b6ef2e7 ]

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.

BUG=b/535631885
TEST=presubmit, compile
RELEASE_NOTE=Fixed an important bug for xfs file system users.

cos-patch: bug
Fixes: 3c68d44a2b49a0 ("xfs: allocate direct I/O COW blocks in iomap_begin")
Signed-off-by: Kevin Berry <kpberry@google.com>
Change-Id: If6c9c2c82fba19110a2f610e11d2ad9c3cd51bc6
Reviewed-on: https://cos-review.googlesource.com/c/third_party/kernel/+/169925
Tested-by: Cusky Presubmit Bot <presubmit@cos-infra-prod.iam.gserviceaccount.com>
Main-Branch-Verified: Cusky Presubmit Bot <presubmit@cos-infra-prod.iam.gserviceaccount.com>
Reviewed-by: Robert Kolchmeyer <rkolchmeyer@google.com>
Reviewed-on: https://cos-review.googlesource.com/c/third_party/kernel/+/170124
1 file changed