diff mbox series

generic: test fiemap reports extent as shared after cloning it

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

Commit Message

Filipe Manana Oct. 11, 2022, 12:22 p.m. UTC
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>
---
 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

Comments

Zorro Lang Oct. 11, 2022, 2:31 p.m. UTC | #1
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 mbox series

Patch

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