26ba25
From 8cfcce3f112c40f24bb40b5cf30ced810916de52 Mon Sep 17 00:00:00 2001
26ba25
From: Max Reitz <mreitz@redhat.com>
26ba25
Date: Mon, 18 Jun 2018 16:12:03 +0200
26ba25
Subject: [PATCH 036/268] iotests: Split 214 off of 122
26ba25
26ba25
RH-Author: Max Reitz <mreitz@redhat.com>
26ba25
Message-id: <20180618161212.14444-2-mreitz@redhat.com>
26ba25
Patchwork-id: 80761
26ba25
O-Subject: [RHV-7.6 qemu-kvm-rhev PATCH 01/10] iotests: Split 214 off of 122
26ba25
Bugzilla: 1518738
26ba25
RH-Acked-by: John Snow <jsnow@redhat.com>
26ba25
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
26ba25
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
26ba25
26ba25
Commit abd3622cc03cf41ed542126a540385f30a4c0175 added a case to 122
26ba25
regarding how the qcow2 driver handles an incorrect compressed data
26ba25
length value.  This does not really fit into 122, as that file is
26ba25
supposed to contain qemu-img convert test cases, which this case is not.
26ba25
So this patch splits it off into its own file; maybe we will even get
26ba25
more qcow2-only compression tests in the future.
26ba25
26ba25
Also, that test case does not work with refcount_bits=1, so mark that
26ba25
option as unsupported.
26ba25
26ba25
Signed-off-by: Max Reitz <mreitz@redhat.com>
26ba25
Message-id: 20180406164108.26118-1-mreitz@redhat.com
26ba25
Reviewed-by: Eric Blake <eblake@redhat.com>
26ba25
Signed-off-by: Alberto Garcia <berto@igalia.com>
26ba25
Signed-off-by: Max Reitz <mreitz@redhat.com>
26ba25
(cherry picked from commit 6cba5377f54d7ea859a29c1877785e7101794683)
26ba25
Signed-off-by: Max Reitz <mreitz@redhat.com>
26ba25
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
26ba25
---
26ba25
 tests/qemu-iotests/122     | 47 ----------------------
26ba25
 tests/qemu-iotests/122.out | 33 ----------------
26ba25
 tests/qemu-iotests/214     | 97 ++++++++++++++++++++++++++++++++++++++++++++++
26ba25
 tests/qemu-iotests/214.out | 35 +++++++++++++++++
26ba25
 tests/qemu-iotests/group   |  1 +
26ba25
 5 files changed, 133 insertions(+), 80 deletions(-)
26ba25
 create mode 100755 tests/qemu-iotests/214
26ba25
 create mode 100644 tests/qemu-iotests/214.out
26ba25
26ba25
diff --git a/tests/qemu-iotests/122 b/tests/qemu-iotests/122
26ba25
index 6cf4fcb..45b359c 100755
26ba25
--- a/tests/qemu-iotests/122
26ba25
+++ b/tests/qemu-iotests/122
26ba25
@@ -130,53 +130,6 @@ $QEMU_IO -c "read -P 0    1024k 1022k" "$TEST_IMG" 2>&1 | _filter_qemu_io | _fil
26ba25
 
26ba25
 
26ba25
 echo
26ba25
-echo "=== Corrupted size field in compressed cluster descriptor ==="
26ba25
-echo
26ba25
-# Create an empty image and fill half of it with compressed data.
26ba25
-# The L2 entries of the two compressed clusters are located at
26ba25
-# 0x800000 and 0x800008, their original values are 0x4008000000a00000
26ba25
-# and 0x4008000000a00802 (5 sectors for compressed data each).
26ba25
-_make_test_img 8M -o cluster_size=2M
26ba25
-$QEMU_IO -c "write -c -P 0x11 0 2M" -c "write -c -P 0x11 2M 2M" "$TEST_IMG" \
26ba25
-         2>&1 | _filter_qemu_io | _filter_testdir
26ba25
-
26ba25
-# Reduce size of compressed data to 4 sectors: this corrupts the image.
26ba25
-poke_file "$TEST_IMG" $((0x800000)) "\x40\x06"
26ba25
-$QEMU_IO -c "read  -P 0x11 0 4M" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
26ba25
-
26ba25
-# 'qemu-img check' however doesn't see anything wrong because it
26ba25
-# doesn't try to decompress the data and the refcounts are consistent.
26ba25
-# TODO: update qemu-img so this can be detected.
26ba25
-_check_test_img
26ba25
-
26ba25
-# Increase size of compressed data to the maximum (8192 sectors).
26ba25
-# This makes QEMU read more data (8192 sectors instead of 5, host
26ba25
-# addresses [0xa00000, 0xdfffff]), but the decompression algorithm
26ba25
-# stops once we have enough to restore the uncompressed cluster, so
26ba25
-# the rest of the data is ignored.
26ba25
-poke_file "$TEST_IMG" $((0x800000)) "\x7f\xfe"
26ba25
-# Do it also for the second compressed cluster (L2 entry at 0x800008).
26ba25
-# In this case the compressed data would span 3 host clusters
26ba25
-# (host addresses: [0xa00802, 0xe00801])
26ba25
-poke_file "$TEST_IMG" $((0x800008)) "\x7f\xfe"
26ba25
-
26ba25
-# Here the image is too small so we're asking QEMU to read beyond the
26ba25
-# end of the image.
26ba25
-$QEMU_IO -c "read  -P 0x11  0 4M" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
26ba25
-# But if we grow the image we won't be reading beyond its end anymore.
26ba25
-$QEMU_IO -c "write -P 0x22 4M 4M" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
26ba25
-$QEMU_IO -c "read  -P 0x11  0 4M" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
26ba25
-
26ba25
-# The refcount data is however wrong because due to the increased size
26ba25
-# of the compressed data it now reaches the following host clusters.
26ba25
-# This can be repaired by qemu-img check by increasing the refcount of
26ba25
-# those clusters.
26ba25
-# TODO: update qemu-img to correct the compressed cluster size instead.
26ba25
-_check_test_img -r all
26ba25
-$QEMU_IO -c "read  -P 0x11  0 4M" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
26ba25
-$QEMU_IO -c "read  -P 0x22 4M 4M" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
26ba25
-
26ba25
-echo
26ba25
 echo "=== Full allocation with -S 0 ==="
26ba25
 echo
26ba25
 
26ba25
diff --git a/tests/qemu-iotests/122.out b/tests/qemu-iotests/122.out
26ba25
index a6b7fe0..47d8656 100644
26ba25
--- a/tests/qemu-iotests/122.out
26ba25
+++ b/tests/qemu-iotests/122.out
26ba25
@@ -99,39 +99,6 @@ read 1024/1024 bytes at offset 1047552
26ba25
 read 1046528/1046528 bytes at offset 1048576
26ba25
 1022 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
26ba25
 
26ba25
-=== Corrupted size field in compressed cluster descriptor ===
26ba25
-
26ba25
-Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=8388608
26ba25
-wrote 2097152/2097152 bytes at offset 0
26ba25
-2 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
26ba25
-wrote 2097152/2097152 bytes at offset 2097152
26ba25
-2 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
26ba25
-read failed: Input/output error
26ba25
-No errors were found on the image.
26ba25
-read 4194304/4194304 bytes at offset 0
26ba25
-4 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
26ba25
-wrote 4194304/4194304 bytes at offset 4194304
26ba25
-4 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
26ba25
-read 4194304/4194304 bytes at offset 0
26ba25
-4 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
26ba25
-ERROR cluster 6 refcount=1 reference=3
26ba25
-ERROR cluster 7 refcount=1 reference=2
26ba25
-Repairing cluster 6 refcount=1 reference=3
26ba25
-Repairing cluster 7 refcount=1 reference=2
26ba25
-Repairing OFLAG_COPIED data cluster: l2_entry=8000000000c00000 refcount=3
26ba25
-Repairing OFLAG_COPIED data cluster: l2_entry=8000000000e00000 refcount=2
26ba25
-The following inconsistencies were found and repaired:
26ba25
-
26ba25
-    0 leaked clusters
26ba25
-    4 corruptions
26ba25
-
26ba25
-Double checking the fixed image now...
26ba25
-No errors were found on the image.
26ba25
-read 4194304/4194304 bytes at offset 0
26ba25
-4 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
26ba25
-read 4194304/4194304 bytes at offset 4194304
26ba25
-4 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
26ba25
-
26ba25
 === Full allocation with -S 0 ===
26ba25
 
26ba25
 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
26ba25
diff --git a/tests/qemu-iotests/214 b/tests/qemu-iotests/214
26ba25
new file mode 100755
26ba25
index 0000000..c46ca2a
26ba25
--- /dev/null
26ba25
+++ b/tests/qemu-iotests/214
26ba25
@@ -0,0 +1,97 @@
26ba25
+#!/bin/bash
26ba25
+#
26ba25
+# Test qcow2 image compression
26ba25
+#
26ba25
+# Copyright (C) 2018 Igalia, S.L.
26ba25
+# Author: Alberto Garcia <berto@igalia.com>
26ba25
+#
26ba25
+# This program is free software; you can redistribute it and/or modify
26ba25
+# it under the terms of the GNU General Public License as published by
26ba25
+# the Free Software Foundation; either version 2 of the License, or
26ba25
+# (at your option) any later version.
26ba25
+#
26ba25
+# This program is distributed in the hope that it will be useful,
26ba25
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
26ba25
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26ba25
+# GNU General Public License for more details.
26ba25
+#
26ba25
+# You should have received a copy of the GNU General Public License
26ba25
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
26ba25
+#
26ba25
+
26ba25
+seq=$(basename "$0")
26ba25
+echo "QA output created by $seq"
26ba25
+
26ba25
+here=$PWD
26ba25
+status=1	# failure is the default!
26ba25
+
26ba25
+_cleanup()
26ba25
+{
26ba25
+    _cleanup_test_img
26ba25
+}
26ba25
+trap "_cleanup; exit \$status" 0 1 2 3 15
26ba25
+
26ba25
+# get standard environment, filters and checks
26ba25
+. ./common.rc
26ba25
+. ./common.filter
26ba25
+
26ba25
+_supported_fmt qcow2
26ba25
+_supported_proto file
26ba25
+_supported_os Linux
26ba25
+
26ba25
+# Repairing the corrupted image requires qemu-img check to store a
26ba25
+# refcount up to 3, which requires at least two refcount bits.
26ba25
+_unsupported_imgopts 'refcount_bits=1[^0-9]'
26ba25
+
26ba25
+
26ba25
+echo
26ba25
+echo "=== Corrupted size field in compressed cluster descriptor ==="
26ba25
+echo
26ba25
+# Create an empty image and fill half of it with compressed data.
26ba25
+# The L2 entries of the two compressed clusters are located at
26ba25
+# 0x800000 and 0x800008, their original values are 0x4008000000a00000
26ba25
+# and 0x4008000000a00802 (5 sectors for compressed data each).
26ba25
+_make_test_img 8M -o cluster_size=2M
26ba25
+$QEMU_IO -c "write -c -P 0x11 0 2M" -c "write -c -P 0x11 2M 2M" "$TEST_IMG" \
26ba25
+         2>&1 | _filter_qemu_io | _filter_testdir
26ba25
+
26ba25
+# Reduce size of compressed data to 4 sectors: this corrupts the image.
26ba25
+poke_file "$TEST_IMG" $((0x800000)) "\x40\x06"
26ba25
+$QEMU_IO -c "read  -P 0x11 0 4M" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
26ba25
+
26ba25
+# 'qemu-img check' however doesn't see anything wrong because it
26ba25
+# doesn't try to decompress the data and the refcounts are consistent.
26ba25
+# TODO: update qemu-img so this can be detected.
26ba25
+_check_test_img
26ba25
+
26ba25
+# Increase size of compressed data to the maximum (8192 sectors).
26ba25
+# This makes QEMU read more data (8192 sectors instead of 5, host
26ba25
+# addresses [0xa00000, 0xdfffff]), but the decompression algorithm
26ba25
+# stops once we have enough to restore the uncompressed cluster, so
26ba25
+# the rest of the data is ignored.
26ba25
+poke_file "$TEST_IMG" $((0x800000)) "\x7f\xfe"
26ba25
+# Do it also for the second compressed cluster (L2 entry at 0x800008).
26ba25
+# In this case the compressed data would span 3 host clusters
26ba25
+# (host addresses: [0xa00802, 0xe00801])
26ba25
+poke_file "$TEST_IMG" $((0x800008)) "\x7f\xfe"
26ba25
+
26ba25
+# Here the image is too small so we're asking QEMU to read beyond the
26ba25
+# end of the image.
26ba25
+$QEMU_IO -c "read  -P 0x11  0 4M" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
26ba25
+# But if we grow the image we won't be reading beyond its end anymore.
26ba25
+$QEMU_IO -c "write -P 0x22 4M 4M" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
26ba25
+$QEMU_IO -c "read  -P 0x11  0 4M" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
26ba25
+
26ba25
+# The refcount data is however wrong because due to the increased size
26ba25
+# of the compressed data it now reaches the following host clusters.
26ba25
+# This can be repaired by qemu-img check by increasing the refcount of
26ba25
+# those clusters.
26ba25
+# TODO: update qemu-img to correct the compressed cluster size instead.
26ba25
+_check_test_img -r all
26ba25
+$QEMU_IO -c "read  -P 0x11  0 4M" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
26ba25
+$QEMU_IO -c "read  -P 0x22 4M 4M" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
26ba25
+
26ba25
+# success, all done
26ba25
+echo '*** done'
26ba25
+rm -f $seq.full
26ba25
+status=0
26ba25
diff --git a/tests/qemu-iotests/214.out b/tests/qemu-iotests/214.out
26ba25
new file mode 100644
26ba25
index 0000000..0fcd8dc
26ba25
--- /dev/null
26ba25
+++ b/tests/qemu-iotests/214.out
26ba25
@@ -0,0 +1,35 @@
26ba25
+QA output created by 214
26ba25
+
26ba25
+=== Corrupted size field in compressed cluster descriptor ===
26ba25
+
26ba25
+Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=8388608
26ba25
+wrote 2097152/2097152 bytes at offset 0
26ba25
+2 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
26ba25
+wrote 2097152/2097152 bytes at offset 2097152
26ba25
+2 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
26ba25
+read failed: Input/output error
26ba25
+No errors were found on the image.
26ba25
+read 4194304/4194304 bytes at offset 0
26ba25
+4 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
26ba25
+wrote 4194304/4194304 bytes at offset 4194304
26ba25
+4 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
26ba25
+read 4194304/4194304 bytes at offset 0
26ba25
+4 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
26ba25
+ERROR cluster 6 refcount=1 reference=3
26ba25
+ERROR cluster 7 refcount=1 reference=2
26ba25
+Repairing cluster 6 refcount=1 reference=3
26ba25
+Repairing cluster 7 refcount=1 reference=2
26ba25
+Repairing OFLAG_COPIED data cluster: l2_entry=8000000000c00000 refcount=3
26ba25
+Repairing OFLAG_COPIED data cluster: l2_entry=8000000000e00000 refcount=2
26ba25
+The following inconsistencies were found and repaired:
26ba25
+
26ba25
+    0 leaked clusters
26ba25
+    4 corruptions
26ba25
+
26ba25
+Double checking the fixed image now...
26ba25
+No errors were found on the image.
26ba25
+read 4194304/4194304 bytes at offset 0
26ba25
+4 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
26ba25
+read 4194304/4194304 bytes at offset 4194304
26ba25
+4 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
26ba25
+*** done
26ba25
diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group
26ba25
index 3a89aed..ba7a2d1 100644
26ba25
--- a/tests/qemu-iotests/group
26ba25
+++ b/tests/qemu-iotests/group
26ba25
@@ -212,4 +212,5 @@
26ba25
 211 rw auto quick
26ba25
 212 rw auto quick
26ba25
 213 rw auto quick
26ba25
+214 rw auto
26ba25
 218 rw auto quick
26ba25
-- 
26ba25
1.8.3.1
26ba25