btrfs: test read corruption of compressed extents differently
authorFilipe Manana <fdmanana@suse.com>
Wed, 14 Oct 2015 03:08:12 +0000 (14:08 +1100)
committerDave Chinner <david@fromorbit.com>
Wed, 14 Oct 2015 03:08:12 +0000 (14:08 +1100)
Regression test for file read corruption when using compressed extents
that represent file ranges with a length that is a multiple of 16 pages
and that are shared by multiple consecutive ranges of the same file.

This is similar to the test added in commit 694db0c050d6 ("btrfs: read
corruption of compressed extents"), but tests the special case where the
extent's uncompressed length is a multiple of 16 pages. The first btrfs
fix, tested by the test added in the commit mentioned before, failed to
address this special case.

This btrfs issue is fixed by the linux kernel patch titled:
"Btrfs: update fix for read corruption of compressed and shared extents"

Signed-off-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
tests/btrfs/106 [new file with mode: 0755]
tests/btrfs/106.out [new file with mode: 0644]
tests/btrfs/group

diff --git a/tests/btrfs/106 b/tests/btrfs/106
new file mode 100755 (executable)
index 0000000..1670453
--- /dev/null
@@ -0,0 +1,97 @@
+#! /bin/bash
+# FSQA Test No. 106
+#
+# Regression test for file read corruption when using compressed extents
+# that represent file ranges with a length that is a multiple of 16 pages
+# and that are shared by multiple consecutive ranges of the same file.
+#
+#-----------------------------------------------------------------------
+#
+# Copyright (C) 2015 SUSE Linux Products GmbH. All Rights Reserved.
+# Author: Filipe Manana <fdmanana@suse.com>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it would be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write the Free Software Foundation,
+# Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#-----------------------------------------------------------------------
+#
+
+seq=`basename $0`
+seqres=$RESULT_DIR/$seq
+echo "QA output created by $seq"
+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
+
+# real QA test starts here
+_need_to_be_root
+_supported_fs btrfs
+_supported_os Linux
+_require_scratch
+_require_cloner
+
+rm -f $seqres.full
+
+test_clone_and_read_compressed_extent()
+{
+       local mount_opts=$1
+
+       _scratch_mkfs >>$seqres.full 2>&1
+       _scratch_mount $mount_opts
+
+       # Create our test file with a single extent of 64Kb that is going to be
+       # compressed no matter which compression algorithm is used (zlib/lzo).
+       $XFS_IO_PROG -f -c "pwrite -S 0xaa 0K 64K" \
+               $SCRATCH_MNT/foo | _filter_xfs_io
+
+       # Now clone the compressed extent into an adjacent file offset.
+       $CLONER_PROG -s 0 -d $((64 * 1024)) -l $((64 * 1024)) \
+               $SCRATCH_MNT/foo $SCRATCH_MNT/foo
+
+       echo "File digest before unmount:"
+       md5sum $SCRATCH_MNT/foo | _filter_scratch
+
+       # Remount the fs or clear the page cache to trigger the bug in btrfs.
+       # Because the extent has an uncompressed length that is a multiple of
+       # 16 pages, all the pages belonging to the second range of the file
+       # (64K to 128K), which points to the same extent as the first range
+       # (0K to 64K), had their contents full of zeroes instead of the byte
+       # 0xaa. This was a bug exclusively in the read path of compressed
+       # extents, the correct data was stored on disk, btrfs just failed to
+       # fill in the pages correctly.
+       _scratch_remount
+
+       echo "File digest after remount:"
+       # Must match the digest we got before.
+       md5sum $SCRATCH_MNT/foo | _filter_scratch
+}
+
+echo -e "\nTesting with zlib compression..."
+test_clone_and_read_compressed_extent "-o compress=zlib"
+
+_scratch_unmount
+
+echo -e "\nTesting with lzo compression..."
+test_clone_and_read_compressed_extent "-o compress=lzo"
+
+status=0
+exit
diff --git a/tests/btrfs/106.out b/tests/btrfs/106.out
new file mode 100644 (file)
index 0000000..692108d
--- /dev/null
@@ -0,0 +1,17 @@
+QA output created by 106
+
+Testing with zlib compression...
+wrote 65536/65536 bytes at offset 0
+XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+File digest before unmount:
+be68df46e3cf60b559376a35f9fbb05d  SCRATCH_MNT/foo
+File digest after remount:
+be68df46e3cf60b559376a35f9fbb05d  SCRATCH_MNT/foo
+
+Testing with lzo compression...
+wrote 65536/65536 bytes at offset 0
+XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+File digest before unmount:
+be68df46e3cf60b559376a35f9fbb05d  SCRATCH_MNT/foo
+File digest after remount:
+be68df46e3cf60b559376a35f9fbb05d  SCRATCH_MNT/foo
index 02d94dc8e76a49a35d5ffd96949d42e093201855..f4ea2836bfae0e5ebffe9b0b6e5c76628ac8b568 100644 (file)
 103 auto quick clone compress
 104 auto qgroup
 105 auto quick send
+106 auto quick clone compress