diff options
author | Christoph Hellwig <hch@lst.de> | 2018-09-29 06:49:58 +0300 |
---|---|---|
committer | Dave Chinner <david@fromorbit.com> | 2018-09-29 06:49:58 +0300 |
commit | f5f3f959b70b272dfe2d05758e43ae52f5ff7748 (patch) | |
tree | 993379f5bd715a61485c0ac9f966464222977151 /fs/btrfs | |
parent | f369a13cead821e679c7415dc66a17ec48cc26bf (diff) | |
download | linux-f5f3f959b70b272dfe2d05758e43ae52f5ff7748.tar.xz |
xfs: skip delalloc COW blocks in xfs_reflink_end_cow
The iomap direct I/O code issues a single ->end_io call for the whole
I/O request, and if some of the extents cowered needed a COW operation
it will call xfs_reflink_end_cow over the whole range.
When we do AIO writes we drop the iolock after doing the initial setup,
but before the I/O completion. Between dropping the lock and completing
the I/O we can have a racing buffered write create new delalloc COW fork
extents in the region covered by the outstanding direct I/O write, and
thus see delalloc COW fork extents in xfs_reflink_end_cow. As
concurrent writes are fundamentally racy and no guarantees are given we
can simply skip those.
This can be easily reproduced with xfstests generic/208 in always_cow
mode.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
Diffstat (limited to 'fs/btrfs')
0 files changed, 0 insertions, 0 deletions