diff mbox

[v3,10/10] iotests: Add test for potentially damaging repairs

Message ID 1408725104-17176-11-git-send-email-mreitz@redhat.com
State New
Headers show

Commit Message

Max Reitz Aug. 22, 2014, 4:31 p.m. UTC
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 <mreitz@redhat.com>
---
 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

Comments

Benoît Canet Aug. 22, 2014, 6:50 p.m. UTC | #1
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 <mreitz@redhat.com>
> ---
>  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
> +owner=mreitz@redhat.com
> +
> +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 <benoit.canet@nodalink.com>
Eric Blake Aug. 22, 2014, 7:55 p.m. UTC | #2
On 08/22/2014 10:31 AM, 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 <mreitz@redhat.com>
> ---
>  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.

Welcome to 2014, where we are practically 2/3 through with the year
already :)
Benoît Canet Aug. 22, 2014, 8:55 p.m. UTC | #3
On Fri, Aug 22, 2014 at 01:55:01PM -0600, Eric Blake wrote:
> On 08/22/2014 10:31 AM, 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 <mreitz@redhat.com>
> > ---
> >  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.
> 
> Welcome to 2014, where we are practically 2/3 through with the year
> already :)

It may have been copied from an existing template so maybe the initial copyright
is really from 2013.

Benoît

> 
> -- 
> Eric Blake   eblake redhat com    +1-919-301-3266
> Libvirt virtualization library http://libvirt.org
>
Max Reitz Aug. 26, 2014, 5:53 p.m. UTC | #4
On 22.08.2014 21:55, Eric Blake wrote:
> On 08/22/2014 10:31 AM, 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 <mreitz@redhat.com>
>> ---
>>   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.
> Welcome to 2014, where we are practically 2/3 through with the year
> already :)

Oops *g*

And I thought it was bad when I forgot which day of the week it was...

Max
diff mbox

Patch

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
+owner=mreitz@redhat.com
+
+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