On Tue, Oct 11, 2022 at 01:22:03PM +0100, fdmanana@xxxxxxxxxx wrote: > From: Filipe Manana <fdmanana@xxxxxxxx> > > Test that if we have two consecutive extents and only one of them is > cloned, then fiemap correctly reports which one is shared and reports > the other as not shared. > > This currently fails on btrfs for all kernel releases, but is fixed by > a kernel patch that landed in Linus' tree last week: > > ac3c0d36a2a2f7 ("btrfs: make fiemap more efficient and accurate reporting extent sharedness") > > Signed-off-by: Filipe Manana <fdmanana@xxxxxxxx> > --- This patch looks good to me. Although I haven't pushed your patch which adds fiemap group -- "[PATCH 3/3] fstests: add fiemap group", but I've merged it locally, will push it with this patch together (as this patch depends on it). Reviewed-by: Zorro Lang <zlang@xxxxxxxxxx> > tests/generic/702 | 92 +++++++++++++++++++++++++++++++++++++++++++ > tests/generic/702.out | 23 +++++++++++ > 2 files changed, 115 insertions(+) > create mode 100755 tests/generic/702 > create mode 100644 tests/generic/702.out > > diff --git a/tests/generic/702 b/tests/generic/702 > new file mode 100755 > index 00000000..f93bc946 > --- /dev/null > +++ b/tests/generic/702 > @@ -0,0 +1,92 @@ > +#! /bin/bash > +# SPDX-License-Identifier: GPL-2.0 > +# Copyright (C) 2022 SUSE Linux Products GmbH. All Rights Reserved. > +# > +# FS QA Test 702 > +# > +# Test that if we have two consecutive extents and only one of them is cloned, > +# then fiemap correctly reports which one is shared and reports the other as not > +# shared. > +# > +. ./common/preamble > +_begin_fstest auto quick clone fiemap > + > +. ./common/filter > +. ./common/reflink > + > +_fixed_by_kernel_commit ac3c0d36a2a2f7 \ > + "btrfs: make fiemap more efficient and accurate reporting extent sharedness" > + > +_supported_fs generic > +_require_scratch_reflink > +_require_xfs_io_command "fiemap" > + > +fiemap_test_file() > +{ > + local filepath=$1 > + > + # Skip the first two lines of xfs_io's fiemap output (file path and > + # header describing the output columns). > + # > + # Print the first column (extent number), second column (file range), > + # fourth column (extent size) and fifth column (flags) of the fiemap > + # output. > + # > + # We filter the flags column to only tell us if an extent is shared or > + # not (flag 0x2000, which matches FIEMAP_EXTENT_SHARED) because on some > + # filesystem configs we may have other flags printed - for example > + # running btrfs with "-o compress" we get the flag 0x8 as well (which > + # is FIEMAP_EXTENT_ENCODED). > + # > + # The third column is the physical location of the extents, so it's > + # omitted because the location varies between different filesystems. > + # > + $XFS_IO_PROG -c "fiemap -v" $filepath | tail -n +3 | \ > + $AWK_PROG '{ print $1, $2, $4, \ > + and(strtonum($5), 0x2000) ? "shared" : "not_shared" }' > +} > + > +_scratch_mkfs >> $seqres.full > +_scratch_mount > + > +# We create 128K extents in the test files below. > +_require_congruent_file_oplen $SCRATCH_MNT $((128 * 1024)) > + > +# Create file foo with 2 consecutive extents, each one with a size of 128K. > +echo "Creating file foo" > +$XFS_IO_PROG -f -c "pwrite -b 128K 0 128K" -c "fsync" \ > + -c "pwrite -b 128K 128K 128K" -c "fsync" \ > + $SCRATCH_MNT/foo | _filter_xfs_io > + > +# Clone only the first extent into another file. > +echo "Cloning first extent of file foo to file bar" > +$XFS_IO_PROG -f -c "reflink $SCRATCH_MNT/foo 0 0 128K" $SCRATCH_MNT/bar | \ > + _filter_xfs_io > + > +# Now fiemap file foo, it should report the first 128K extent as shared and the > +# second 128K extent as not shared. > +echo "fiemap of file foo:" > +fiemap_test_file $SCRATCH_MNT/foo > + > +# Now do a similar test as above, except that this time only the second 128K > +# extent is cloned, the first extent is not cloned. > + > +# Create file foo2 with 2 consecutive extents, each one with a size of 128K. > +echo "Creating file foo2" > +$XFS_IO_PROG -f -c "pwrite -b 128K 0 128K" -c "fsync" \ > + -c "pwrite -b 128K 128K 128K" -c "fsync" \ > + $SCRATCH_MNT/foo2 | _filter_xfs_io > + > +# Clone only the second extent of foo2 into another file. > +echo "Cloning second extent of file foo2 to file bar2" > +$XFS_IO_PROG -f -c "reflink $SCRATCH_MNT/foo2 128K 0 128K" $SCRATCH_MNT/bar2 | \ > + _filter_xfs_io > + > +# Now fiemap file foo2, it should report the first 128K extent as not shared and > +# the second 128K extent as shared > +echo "fiemap of file foo2:" > +fiemap_test_file $SCRATCH_MNT/foo2 > + > +# success, all done > +status=0 > +exit > diff --git a/tests/generic/702.out b/tests/generic/702.out > new file mode 100644 > index 00000000..576bb5e8 > --- /dev/null > +++ b/tests/generic/702.out > @@ -0,0 +1,23 @@ > +QA output created by 702 > +Creating file foo > +wrote 131072/131072 bytes at offset 0 > +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) > +wrote 131072/131072 bytes at offset 131072 > +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) > +Cloning first extent of file foo to file bar > +linked 131072/131072 bytes at offset 0 > +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) > +fiemap of file foo: > +0: [0..255]: 256 shared > +1: [256..511]: 256 not_shared > +Creating file foo2 > +wrote 131072/131072 bytes at offset 0 > +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) > +wrote 131072/131072 bytes at offset 131072 > +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) > +Cloning second extent of file foo2 to file bar2 > +linked 131072/131072 bytes at offset 0 > +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) > +fiemap of file foo2: > +0: [0..255]: 256 not_shared > +1: [256..511]: 256 shared > -- > 2.35.1 >