[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v3 10/10] iotests: Add test for potentially dama
From: |
Benoît Canet |
Subject: |
Re: [Qemu-devel] [PATCH v3 10/10] iotests: Add test for potentially damaging repairs |
Date: |
Fri, 22 Aug 2014 18:50:21 +0000 |
User-agent: |
Mutt/1.5.21 (2010-09-15) |
On Fri, Aug 22, 2014 at 06:31:44PM +0200, Max Reitz wrote:
> There are certain cases where repairing a qcow2 image might actually
> damage it further (or rather, where repairing it has in fact damaged it
> further with the old qcow2 check implementation). This should not
> happen, so add a test for these cases.
>
> Signed-off-by: Max Reitz <address@hidden>
> ---
> tests/qemu-iotests/104 | 98
> ++++++++++++++++++++++++++++++++++++++++++++++
> tests/qemu-iotests/104.out | 46 ++++++++++++++++++++++
> tests/qemu-iotests/group | 1 +
> 3 files changed, 145 insertions(+)
> create mode 100755 tests/qemu-iotests/104
> create mode 100644 tests/qemu-iotests/104.out
>
> diff --git a/tests/qemu-iotests/104 b/tests/qemu-iotests/104
> new file mode 100755
> index 0000000..cc6d0b3
> --- /dev/null
> +++ b/tests/qemu-iotests/104
> @@ -0,0 +1,98 @@
> +#!/bin/bash
> +#
> +# Test case for repairing qcow2 images which cannot be repaired using
> +# the on-disk refcount structures
> +#
> +# Copyright (C) 2013 Red Hat, Inc.
> +#
> +# 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; either version 2 of the License, or
> +# (at your option) any later version.
> +#
> +# This program is distributed in the hope that it will 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, see <http://www.gnu.org/licenses/>.
> +#
> +
> +# creator
> address@hidden
> +
> +seq="$(basename $0)"
> +echo "QA output created by $seq"
> +
> +here="$PWD"
> +tmp=/tmp/$$
> +status=1 # failure is the default!
> +
> +_cleanup()
> +{
> + _cleanup_test_img
> +}
> +trap "_cleanup; exit \$status" 0 1 2 3 15
> +
> +# get standard environment, filters and checks
> +. ./common.rc
> +. ./common.filter
> +
> +# This tests qocw2-specific low-level functionality
> +_supported_fmt qcow2
> +_supported_proto file
> +_supported_os Linux
> +
> +echo
> +echo '=== Repairing an image without any refcount table ==='
> +echo
> +
> +_make_test_img 64M
> +# just write some data
> +$QEMU_IO -c 'write -P 42 0 64k' "$TEST_IMG" | _filter_qemu_io
> +
> +# refcount_table_offset
> +poke_file "$TEST_IMG" 48 "\x00\x00\x00\x00\x00\x00\x00\x00"
> +# refcount_table_clusters
> +poke_file "$TEST_IMG" 56 "\x00\x00\x00\x00"
> +
> +_check_test_img -r all
> +
> +$QEMU_IO -c 'read -P 42 0 64k' "$TEST_IMG" | _filter_qemu_io
> +
> +echo
> +echo '=== Repairing unreferenced data cluster in new refblock area ==='
> +echo
> +
> +IMGOPTS='cluster_size=512' _make_test_img 64M
> +# Allocate the first 128 kB in the image (first refblock)
> +$QEMU_IO -c 'write 0 111104' "$TEST_IMG" | _filter_qemu_io
> +# should be 131072
> +stat -c '%s' "$TEST_IMG"
> +
> +# Enter a cluster at 128 kB (0x20000)
> +# XXX: This (0x1ccc8) should be the first free entry in the last L2 table,
> but
> +# we cannot be sure
> +poke_file "$TEST_IMG" 117960 "\x80\x00\x00\x00\x00\x02\x00\x00"
> +
> +# Fill the cluster
> +truncate -s 131584 "$TEST_IMG"
> +$QEMU_IO -c "open -o driver=raw $TEST_IMG" -c 'write -P 42 128k 512' \
> + | _filter_qemu_io
> +
> +# The data should now appear at this guest offset
> +$QEMU_IO -c 'read -P 42 111104 512' "$TEST_IMG" | _filter_qemu_io
> +
> +# This cluster is unallocated; fix it
> +_check_test_img -r all
> +
> +# This repair operation must have allocated a new refblock; and that refblock
> +# should not overlap with the unallocated data cluster. If it does, the data
> +# will be damaged, so check it.
> +$QEMU_IO -c 'read -P 42 111104 512' "$TEST_IMG" | _filter_qemu_io
> +
> +# success, all done
> +echo '*** done'
> +rm -f $seq.full
> +status=0
> diff --git a/tests/qemu-iotests/104.out b/tests/qemu-iotests/104.out
> new file mode 100644
> index 0000000..742fe77
> --- /dev/null
> +++ b/tests/qemu-iotests/104.out
> @@ -0,0 +1,46 @@
> +QA output created by 104
> +
> +=== Repairing an image without any refcount table ===
> +
> +Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
> +wrote 65536/65536 bytes at offset 0
> +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> +ERROR cluster 0 refcount=0 reference=1
> +ERROR cluster 3 refcount=0 reference=1
> +ERROR cluster 4 refcount=0 reference=1
> +ERROR cluster 5 refcount=0 reference=1
> +Rebuilding refcount structure
> +The following inconsistencies were found and repaired:
> +
> + 0 leaked clusters
> + 4 corruptions
> +
> +Double checking the fixed image now...
> +No errors were found on the image.
> +read 65536/65536 bytes at offset 0
> +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> +
> +=== Repairing unreferenced data cluster in new refblock area ===
> +
> +Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
> +wrote 111104/111104 bytes at offset 0
> +108.500 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> +131072
> +wrote 512/512 bytes at offset 131072
> +512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> +read 512/512 bytes at offset 111104
> +512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> +ERROR cluster 256 refcount=0 reference=1
> +Rebuilding refcount structure
> +Repairing cluster 1 refcount=1 reference=0
> +Repairing cluster 2 refcount=1 reference=0
> +The following inconsistencies were found and repaired:
> +
> + 0 leaked clusters
> + 1 corruptions
> +
> +Double checking the fixed image now...
> +No errors were found on the image.
> +read 512/512 bytes at offset 111104
> +512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> +*** done
> diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group
> index 2803d68..5a3f9dd 100644
> --- a/tests/qemu-iotests/group
> +++ b/tests/qemu-iotests/group
> @@ -103,3 +103,4 @@
> 099 rw auto quick
> 101 rw auto quick
> 103 rw auto quick
> +104 rw auto quick
> --
> 2.0.4
>
Reviewed-by: Benoît Canet <address@hidden>
- [Qemu-devel] [PATCH v3 06/10] qcow2: Do not perform potentially damaging repairs, (continued)
- [Qemu-devel] [PATCH v3 06/10] qcow2: Do not perform potentially damaging repairs, Max Reitz, 2014/08/22
- [Qemu-devel] [PATCH v3 07/10] qcow2: Rebuild refcount structure during check, Max Reitz, 2014/08/22
- [Qemu-devel] [PATCH v3 08/10] qcow2: Clean up after refcount rebuild, Max Reitz, 2014/08/22
- [Qemu-devel] [PATCH v3 09/10] iotests: Fix test outputs, Max Reitz, 2014/08/22
- [Qemu-devel] [PATCH v3 10/10] iotests: Add test for potentially damaging repairs, Max Reitz, 2014/08/22