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/+/169924
Reviewed-by: Robert Kolchmeyer <rkolchmeyer@google.com>
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-on: https://cos-review.googlesource.com/c/third_party/kernel/+/170105
1 file changed