qemu-devel
[Top][All Lists]
Advanced

[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>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]