9ffd6d646d
One clear problem with how qcow2's refcount structure rebuild algorithm used to be before "qcow2: Improve refcount structure rebuilding" was that it is prone to failure for qcow2 images on block devices: There is generally unused space after the actual image, and if that exceeds what one refblock covers, the old algorithm would invariably write the reftable past the block device's end, which cannot work. The new algorithm does not have this problem. Test it with three tests: (1) Create an image with more empty space at the end than what one refblock covers, see whether rebuilding the refcount structures results in a change in the image file length. (It should not.) (2) Leave precisely enough space somewhere at the beginning of the image for the new reftable (and the refblock for that place), see whether the new algorithm puts the reftable there. (It should.) (3) Test the original problem: Create (something like) a block device with a fixed size, then create a qcow2 image in there, write some data, and then have qemu-img check rebuild the refcount structures. Before HEAD^, the reftable would have been written past the image file end, i.e. outside of what the block device provides, which cannot work. HEAD^ should have fixed that. ("Something like a block device" means a loop device if we can use one ("sudo -n losetup" works), or a FUSE block export with growable=false otherwise.) Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Hanna Reitz <hreitz@redhat.com> Message-Id: <20220405134652.19278-3-hreitz@redhat.com>
192 lines
6.2 KiB
Plaintext
192 lines
6.2 KiB
Plaintext
QA output created by 108
|
|
|
|
=== 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)
|
|
|
|
=== Repairing refblock beyond the image end ===
|
|
|
|
|
|
--- Otherwise clean ---
|
|
|
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
|
Repairing refcount block 1 is outside image
|
|
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.
|
|
|
|
--- Refblock is unallocated ---
|
|
|
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
|
Repairing refcount block 1 is outside image
|
|
ERROR cluster 16 refcount=0 reference=1
|
|
Rebuilding refcount structure
|
|
Repairing cluster 1 refcount=1 reference=0
|
|
Repairing cluster 2 refcount=1 reference=0
|
|
Repairing cluster 16 refcount=1 reference=0
|
|
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.
|
|
|
|
--- Signed overflow after the refblock ---
|
|
|
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
|
Repairing refcount block 1 is outside image
|
|
ERROR could not resize image: Invalid argument
|
|
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.
|
|
|
|
--- Unsigned overflow after the refblock ---
|
|
|
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
|
Repairing refcount block 1 is outside image
|
|
ERROR could not resize image: Invalid argument
|
|
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.
|
|
|
|
=== Check rebuilt reftable location ===
|
|
|
|
--- Does the image size increase? ---
|
|
|
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1048576
|
|
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
|
|
Rebuilding refcount structure
|
|
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.
|
|
|
|
OK: Image size did not change
|
|
|
|
--- Will the reftable occupy a hole specifically left for it? ---
|
|
|
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=9437184
|
|
wrote 8388608/8388608 bytes at offset 0
|
|
8 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
discard 512/512 bytes at offset 0
|
|
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
discard 1024/1024 bytes at offset 4096
|
|
1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
|
|
ERROR cluster 0 refcount=0 reference=1
|
|
Rebuilding refcount structure
|
|
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.
|
|
|
|
OK: Reftable is where we expect it
|
|
|
|
--- Rebuilding refcount structures on block devices ---
|
|
|
|
{ "execute": "qmp_capabilities" }
|
|
{"return": {}}
|
|
{ "execute": "blockdev-create",
|
|
"arguments": {
|
|
"job-id": "create",
|
|
"options": {
|
|
"driver": "IMGFMT",
|
|
"file": "file",
|
|
"size": 67108864,
|
|
"cluster-size": 512
|
|
} } }
|
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "create"}}
|
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "create"}}
|
|
{"return": {}}
|
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "waiting", "id": "create"}}
|
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "pending", "id": "create"}}
|
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "create"}}
|
|
{ "execute": "job-dismiss", "arguments": { "id": "create" } }
|
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "create"}}
|
|
{"return": {}}
|
|
{ "execute": "quit" }
|
|
{"return": {}}
|
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}}
|
|
|
|
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
|
|
Rebuilding refcount structure
|
|
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.
|
|
*** done
|