diff mbox series

generic: add FIBMAP basic testing

Message ID 20180813121439.19667-1-zlang@redhat.com (mailing list archive)
State New, archived
Headers show
Series generic: add FIBMAP basic testing | expand

Commit Message

Zorro Lang Aug. 13, 2018, 12:14 p.m. UTC
xfstests doesn't cover FIBMAP test, it cause we brought in a
regression bug fixed by "79b3dbe4adb3 fs: fix iomap_bmap position
calculation".

Although FIBMAP is old, there're still some programs use it, likes
LILO. So test FIBMAP basic function in this case.

Signed-off-by: Zorro Lang <zlang@redhat.com>
---
 tests/generic/505     | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/generic/505.out | 21 +++++++++++++
 tests/generic/group   |  1 +
 3 files changed, 106 insertions(+)
 create mode 100755 tests/generic/505
 create mode 100644 tests/generic/505.out

Comments

Eryu Guan Aug. 19, 2018, 1:07 p.m. UTC | #1
On Mon, Aug 13, 2018 at 08:14:39PM +0800, Zorro Lang wrote:
> xfstests doesn't cover FIBMAP test, it cause we brought in a
> regression bug fixed by "79b3dbe4adb3 fs: fix iomap_bmap position
> calculation".
> 
> Although FIBMAP is old, there're still some programs use it, likes
> LILO. So test FIBMAP basic function in this case.
> 
> Signed-off-by: Zorro Lang <zlang@redhat.com>
> ---
>  tests/generic/505     | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++
>  tests/generic/505.out | 21 +++++++++++++
>  tests/generic/group   |  1 +
>  3 files changed, 106 insertions(+)
>  create mode 100755 tests/generic/505
>  create mode 100644 tests/generic/505.out
> 
> diff --git a/tests/generic/505 b/tests/generic/505
> new file mode 100755
> index 00000000..9a4fd0c8
> --- /dev/null
> +++ b/tests/generic/505
> @@ -0,0 +1,84 @@
> +#! /bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +# Copyright (c) 2018 Red Hat Inc.  All Rights Reserved.
> +#
> +# FS QA Test 505
> +#
> +# FIBMAP basic test, cover 79b3dbe4adb3 fs: fix iomap_bmap position calculation
> +#
> +seq=`basename $0`
> +seqres=$RESULT_DIR/$seq
> +echo "QA output created by $seq"
> +
> +here=`pwd`
> +tmp=/tmp/$$
> +status=1	# failure is the default!
> +trap "_cleanup; exit \$status" 0 1 2 3 15
> +
> +_cleanup()
> +{
> +	cd /
> +	rm -f $tmp.*
> +}
> +
> +# get standard environment, filters and checks
> +. ./common/rc
> +. ./common/filter
> +
> +# remove previous $seqres.full before test
> +rm -f $seqres.full
> +
> +# real QA test starts here
> +_supported_fs generic
> +_supported_os Linux
> +_require_scratch
> +_require_command "$FILEFRAG_PROG" filefrag

You need to check if the filesystem being tested supports FIBMAP or not,
e.g. btrfs doesn't support FIBMAP.

> +
> +TESTFILE="$SCRATCH_MNT/$seq-testfile"
> +
> +# Use filefrag -B option to force the use of the older FIBMAP ioctl instead of
> +# the FIEMAP ioctl.
> +verify_filefrag()
> +{
> +	local frag_info
> +	local paddr
> +
> +	# record details in .full file
> +	${FILEFRAG_PROG} -Bes -v $TESTFILE >> $seqres.full
> +
> +	# Due to physical things can't be golden image, so only output logical
> +	# information at here
> +	frag_info=`${FILEFRAG_PROG} -Be $TESTFILE | _filter_filefrag`
> +	echo "$frag_info" | cut -d# -f3-

So you're assuming the filesystem will create as many extents as you
expected, e.g. you're expecting the fs create three extents for the "5M
sparse file", but the file layout is controlled by the fs not the user,
it may create many more extents than expected.

For a basic function test, I'm afraid you need to create your own map
and check if what FIBMAP returns matches your map, like what
src/fiemap-tester.c does.

But for a targeted regression test, I think you could simply check if
the physical addresses returned by FIBMAP are resonable.

Thanks,
Eryu

> +
> +	# Then verify physical data by physical address
> +	_scratch_unmount
> +	for i in $frag_info; do
> +		paddr=`echo $i | cut -d# -f 1`
> +		od -j $paddr -N 1048576 -t x1 $SCRATCH_DEV | \
> +			sed -e 's/^[0-9a-f]\+/XXXX /'
> +	done
> +	_scratch_mount
> +}
> +
> +_scratch_mkfs > $seqres.full 2>&1
> +_scratch_mount
> +
> +echo "== FIBMAP on an empty file =="
> +$XFS_IO_PROG -f -c "truncate 0" $TESTFILE > /dev/null
> +verify_filefrag
> +
> +echo "== FIBMAP on 1M general file =="
> +$XFS_IO_PROG -f -t -c "pwrite -S 0xaa 0 1m" $TESTFILE > /dev/null
> +verify_filefrag
> +
> +echo "== FIBMAP on 5M sparse file =="
> +$XFS_IO_PROG -f -t -c "pwrite -S 0xaa 0 1m" \
> +	     -c "pwrite -S 0xaa 2m 1m" \
> +	     -c "pwrite -S 0xaa 4m 1m" \
> +	     $TESTFILE > /dev/null
> +verify_filefrag
> +
> +# success, all done
> +status=0
> +exit
> diff --git a/tests/generic/505.out b/tests/generic/505.out
> new file mode 100644
> index 00000000..2a310ee8
> --- /dev/null
> +++ b/tests/generic/505.out
> @@ -0,0 +1,21 @@
> +QA output created by 505
> +== FIBMAP on an empty file ==
> +
> +== FIBMAP on 1M general file ==
> +0#merged,eof
> +XXXX  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa
> +*
> +XXXX 
> +== FIBMAP on 5M sparse file ==
> +0#merged
> +2097152#merged
> +4194304#merged,eof
> +XXXX  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa
> +*
> +XXXX 
> +XXXX  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa
> +*
> +XXXX 
> +XXXX  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa
> +*
> +XXXX 
> diff --git a/tests/generic/group b/tests/generic/group
> index 55155de8..018c5d2d 100644
> --- a/tests/generic/group
> +++ b/tests/generic/group
> @@ -507,3 +507,4 @@
>  502 auto quick log
>  503 auto quick dax punch collapse zero
>  504 auto quick locks
> +505 auto quick
> -- 
> 2.14.4
>
diff mbox series

Patch

diff --git a/tests/generic/505 b/tests/generic/505
new file mode 100755
index 00000000..9a4fd0c8
--- /dev/null
+++ b/tests/generic/505
@@ -0,0 +1,84 @@ 
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2018 Red Hat Inc.  All Rights Reserved.
+#
+# FS QA Test 505
+#
+# FIBMAP basic test, cover 79b3dbe4adb3 fs: fix iomap_bmap position calculation
+#
+seq=`basename $0`
+seqres=$RESULT_DIR/$seq
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1	# failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+	cd /
+	rm -f $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+
+# remove previous $seqres.full before test
+rm -f $seqres.full
+
+# real QA test starts here
+_supported_fs generic
+_supported_os Linux
+_require_scratch
+_require_command "$FILEFRAG_PROG" filefrag
+
+TESTFILE="$SCRATCH_MNT/$seq-testfile"
+
+# Use filefrag -B option to force the use of the older FIBMAP ioctl instead of
+# the FIEMAP ioctl.
+verify_filefrag()
+{
+	local frag_info
+	local paddr
+
+	# record details in .full file
+	${FILEFRAG_PROG} -Bes -v $TESTFILE >> $seqres.full
+
+	# Due to physical things can't be golden image, so only output logical
+	# information at here
+	frag_info=`${FILEFRAG_PROG} -Be $TESTFILE | _filter_filefrag`
+	echo "$frag_info" | cut -d# -f3-
+
+	# Then verify physical data by physical address
+	_scratch_unmount
+	for i in $frag_info; do
+		paddr=`echo $i | cut -d# -f 1`
+		od -j $paddr -N 1048576 -t x1 $SCRATCH_DEV | \
+			sed -e 's/^[0-9a-f]\+/XXXX /'
+	done
+	_scratch_mount
+}
+
+_scratch_mkfs > $seqres.full 2>&1
+_scratch_mount
+
+echo "== FIBMAP on an empty file =="
+$XFS_IO_PROG -f -c "truncate 0" $TESTFILE > /dev/null
+verify_filefrag
+
+echo "== FIBMAP on 1M general file =="
+$XFS_IO_PROG -f -t -c "pwrite -S 0xaa 0 1m" $TESTFILE > /dev/null
+verify_filefrag
+
+echo "== FIBMAP on 5M sparse file =="
+$XFS_IO_PROG -f -t -c "pwrite -S 0xaa 0 1m" \
+	     -c "pwrite -S 0xaa 2m 1m" \
+	     -c "pwrite -S 0xaa 4m 1m" \
+	     $TESTFILE > /dev/null
+verify_filefrag
+
+# success, all done
+status=0
+exit
diff --git a/tests/generic/505.out b/tests/generic/505.out
new file mode 100644
index 00000000..2a310ee8
--- /dev/null
+++ b/tests/generic/505.out
@@ -0,0 +1,21 @@ 
+QA output created by 505
+== FIBMAP on an empty file ==
+
+== FIBMAP on 1M general file ==
+0#merged,eof
+XXXX  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa
+*
+XXXX 
+== FIBMAP on 5M sparse file ==
+0#merged
+2097152#merged
+4194304#merged,eof
+XXXX  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa
+*
+XXXX 
+XXXX  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa
+*
+XXXX 
+XXXX  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa
+*
+XXXX 
diff --git a/tests/generic/group b/tests/generic/group
index 55155de8..018c5d2d 100644
--- a/tests/generic/group
+++ b/tests/generic/group
@@ -507,3 +507,4 @@ 
 502 auto quick log
 503 auto quick dax punch collapse zero
 504 auto quick locks
+505 auto quick