Message ID | c5ede97bf4c2537ef9ee3adf35a9b35cb2150b8a.1665490911.git.fdmanana@suse.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | generic: test fiemap reports extent as shared after cloning it | expand |
On Tue, Oct 11, 2022 at 01:22:03PM +0100, fdmanana@kernel.org wrote: > From: Filipe Manana <fdmanana@suse.com> > > 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@suse.com> > --- 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@redhat.com> > 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 >
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