mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-05 08:43:55 -06:00
qcow2: Check that corrupted images can be repaired in iotest 060
We just fixed a few bugs that caused QEMU to crash when trying to write to corrupted qcow2 images, and iotest 060 was expanded to test all those scenarios. In almost all cases the corrupted images can be repaired using qemu-img, so this patch verifies that. Signed-off-by: Alberto Garcia <berto@igalia.com> Message-id: 0b1b95340ecdfbc6927e36adf2fd42ae6198747a.1510143008.git.berto@igalia.com Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
parent
147b44be49
commit
bcb5270c75
2 changed files with 74 additions and 0 deletions
|
@ -248,6 +248,8 @@ echo
|
||||||
_make_test_img 64M
|
_make_test_img 64M
|
||||||
poke_file "$TEST_IMG" "$rt_offset" "\x00\x00\x00\x00\x00\x00\x00\x00"
|
poke_file "$TEST_IMG" "$rt_offset" "\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||||
$QEMU_IO -c "write 0 64k" "$TEST_IMG" | _filter_qemu_io
|
$QEMU_IO -c "write 0 64k" "$TEST_IMG" | _filter_qemu_io
|
||||||
|
# Repair the image
|
||||||
|
_check_test_img -r all
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo "=== Testing empty refcount table with valid L1 and L2 tables ==="
|
echo "=== Testing empty refcount table with valid L1 and L2 tables ==="
|
||||||
|
@ -259,6 +261,8 @@ poke_file "$TEST_IMG" "$rt_offset" "\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||||
# allocation with an explicit offset (using qcow2_alloc_clusters_at())
|
# allocation with an explicit offset (using qcow2_alloc_clusters_at())
|
||||||
# causing a refcount block to be allocated at offset 0
|
# causing a refcount block to be allocated at offset 0
|
||||||
$QEMU_IO -c "write 0 128k" "$TEST_IMG" | _filter_qemu_io
|
$QEMU_IO -c "write 0 128k" "$TEST_IMG" | _filter_qemu_io
|
||||||
|
# Repair the image
|
||||||
|
_check_test_img -r all
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo "=== Testing empty refcount block ==="
|
echo "=== Testing empty refcount block ==="
|
||||||
|
@ -266,6 +270,8 @@ echo
|
||||||
_make_test_img 64M
|
_make_test_img 64M
|
||||||
poke_file "$TEST_IMG" "$rb_offset" "\x00\x00\x00\x00\x00\x00\x00\x00"
|
poke_file "$TEST_IMG" "$rb_offset" "\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||||
$QEMU_IO -c "write 0 64k" "$TEST_IMG" | _filter_qemu_io
|
$QEMU_IO -c "write 0 64k" "$TEST_IMG" | _filter_qemu_io
|
||||||
|
# Repair the image
|
||||||
|
_check_test_img -r all
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo "=== Testing empty refcount block with compressed write ==="
|
echo "=== Testing empty refcount block with compressed write ==="
|
||||||
|
@ -276,6 +282,8 @@ poke_file "$TEST_IMG" "$rb_offset" "\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||||
# The previous write already allocated an L2 table, so now this new
|
# The previous write already allocated an L2 table, so now this new
|
||||||
# write will try to allocate a compressed data cluster at offset 0.
|
# write will try to allocate a compressed data cluster at offset 0.
|
||||||
$QEMU_IO -c "write -c 0k 64k" "$TEST_IMG" | _filter_qemu_io
|
$QEMU_IO -c "write -c 0k 64k" "$TEST_IMG" | _filter_qemu_io
|
||||||
|
# Repair the image
|
||||||
|
_check_test_img -r all
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo "=== Testing zero refcount table size ==="
|
echo "=== Testing zero refcount table size ==="
|
||||||
|
@ -283,6 +291,8 @@ echo
|
||||||
_make_test_img 64M
|
_make_test_img 64M
|
||||||
poke_file "$TEST_IMG" "56" "\x00\x00\x00\x00"
|
poke_file "$TEST_IMG" "56" "\x00\x00\x00\x00"
|
||||||
$QEMU_IO -c "write 0 64k" "$TEST_IMG" 2>&1 | _filter_testdir | _filter_imgfmt
|
$QEMU_IO -c "write 0 64k" "$TEST_IMG" 2>&1 | _filter_testdir | _filter_imgfmt
|
||||||
|
# Repair the image
|
||||||
|
_check_test_img -r all
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo "=== Testing incorrect refcount table offset ==="
|
echo "=== Testing incorrect refcount table offset ==="
|
||||||
|
|
|
@ -187,6 +187,18 @@ read failed: Input/output error
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
||||||
qcow2: Marking image as corrupt: Preventing invalid write on metadata (overlaps with refcount table); further corruption events will be suppressed
|
qcow2: Marking image as corrupt: Preventing invalid write on metadata (overlaps with refcount table); further corruption events will be suppressed
|
||||||
write failed: Input/output error
|
write failed: Input/output error
|
||||||
|
ERROR cluster 0 refcount=0 reference=1
|
||||||
|
ERROR cluster 1 refcount=0 reference=1
|
||||||
|
ERROR cluster 3 refcount=0 reference=1
|
||||||
|
Rebuilding refcount structure
|
||||||
|
Repairing cluster 1 refcount=1 reference=0
|
||||||
|
The following inconsistencies were found and repaired:
|
||||||
|
|
||||||
|
0 leaked clusters
|
||||||
|
3 corruptions
|
||||||
|
|
||||||
|
Double checking the fixed image now...
|
||||||
|
No errors were found on the image.
|
||||||
|
|
||||||
=== Testing empty refcount table with valid L1 and L2 tables ===
|
=== Testing empty refcount table with valid L1 and L2 tables ===
|
||||||
|
|
||||||
|
@ -195,12 +207,40 @@ wrote 65536/65536 bytes at offset 0
|
||||||
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
qcow2: Marking image as corrupt: Preventing invalid allocation of refcount block at offset 0; further corruption events will be suppressed
|
qcow2: Marking image as corrupt: Preventing invalid allocation of refcount block at offset 0; further corruption events will be suppressed
|
||||||
write failed: Input/output error
|
write failed: Input/output error
|
||||||
|
ERROR cluster 0 refcount=0 reference=1
|
||||||
|
ERROR cluster 1 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
|
||||||
|
Repairing cluster 1 refcount=1 reference=0
|
||||||
|
The following inconsistencies were found and repaired:
|
||||||
|
|
||||||
|
0 leaked clusters
|
||||||
|
5 corruptions
|
||||||
|
|
||||||
|
Double checking the fixed image now...
|
||||||
|
No errors were found on the image.
|
||||||
|
|
||||||
=== Testing empty refcount block ===
|
=== Testing empty refcount block ===
|
||||||
|
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
||||||
qcow2: Marking image as corrupt: Preventing invalid allocation of L2 table at offset 0; further corruption events will be suppressed
|
qcow2: Marking image as corrupt: Preventing invalid allocation of L2 table at offset 0; further corruption events will be suppressed
|
||||||
write failed: Input/output error
|
write failed: Input/output error
|
||||||
|
ERROR cluster 0 refcount=0 reference=1
|
||||||
|
ERROR cluster 1 refcount=0 reference=1
|
||||||
|
ERROR cluster 2 refcount=0 reference=1
|
||||||
|
ERROR cluster 3 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
|
||||||
|
4 corruptions
|
||||||
|
|
||||||
|
Double checking the fixed image now...
|
||||||
|
No errors were found on the image.
|
||||||
|
|
||||||
=== Testing empty refcount block with compressed write ===
|
=== Testing empty refcount block with compressed write ===
|
||||||
|
|
||||||
|
@ -209,11 +249,35 @@ wrote 65536/65536 bytes at offset 65536
|
||||||
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||||
qcow2: Marking image as corrupt: Preventing invalid allocation of compressed cluster at offset 0; further corruption events will be suppressed
|
qcow2: Marking image as corrupt: Preventing invalid allocation of compressed cluster at offset 0; further corruption events will be suppressed
|
||||||
write failed: Input/output error
|
write failed: Input/output error
|
||||||
|
ERROR cluster 0 refcount=0 reference=1
|
||||||
|
ERROR cluster 1 refcount=0 reference=1
|
||||||
|
ERROR cluster 2 refcount=0 reference=1
|
||||||
|
ERROR cluster 3 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
|
||||||
|
4 corruptions
|
||||||
|
|
||||||
|
Double checking the fixed image now...
|
||||||
|
No errors were found on the image.
|
||||||
|
|
||||||
=== Testing zero refcount table size ===
|
=== Testing zero refcount table size ===
|
||||||
|
|
||||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
||||||
can't open device TEST_DIR/t.IMGFMT: Image does not contain a reference count table
|
can't open device TEST_DIR/t.IMGFMT: Image does not contain a reference count table
|
||||||
|
ERROR cluster 0 refcount=0 reference=1
|
||||||
|
ERROR cluster 3 refcount=0 reference=1
|
||||||
|
Rebuilding refcount structure
|
||||||
|
The following inconsistencies were found and repaired:
|
||||||
|
|
||||||
|
0 leaked clusters
|
||||||
|
2 corruptions
|
||||||
|
|
||||||
|
Double checking the fixed image now...
|
||||||
|
No errors were found on the image.
|
||||||
|
|
||||||
=== Testing incorrect refcount table offset ===
|
=== Testing incorrect refcount table offset ===
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue