If lazy refcounts are enabled for a backing file, committing to this backing file may leave it in a dirty state even if the commit succeeds. The reason is that the bdrv_flush() call in bdrv_commit() doesn't flush refcount updates with lazy refcounts enabled, and qcow2_reopen_prepare() doesn't take care to flush metadata. In order to fix this, this patch also fixes qcow2_mark_clean(), which contains another ineffective bdrv_flush() call beause lazy refcounts are disabled only afterwards. All existing callers of qcow2_mark_clean() either don't modify refcounts or already flush manually, so that this fixes only a latent, but not yet actually triggerable bug. Another instance of the same problem is live snapshots. Again, a real corruption is prevented by an explicit flush for non-read-only images in external_snapshot_prepare(), but images using lazy refcounts stay dirty. Cc: qemu-stable@nongnu.org Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
69 lines
2.4 KiB
Plaintext
69 lines
2.4 KiB
Plaintext
QA output created by 039
|
|
|
|
== Checking that image is clean on shutdown ==
|
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
|
|
wrote 512/512 bytes at offset 0
|
|
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
incompatible_features 0x0
|
|
No errors were found on the image.
|
|
|
|
== Creating a dirty image file ==
|
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
|
|
wrote 512/512 bytes at offset 0
|
|
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
incompatible_features 0x1
|
|
ERROR cluster 5 refcount=0 reference=1
|
|
ERROR OFLAG_COPIED data cluster: l2_entry=8000000000050000 refcount=0
|
|
|
|
2 errors were found on the image.
|
|
Data may be corrupted, or further writes to the image may corrupt it.
|
|
|
|
== Read-only access must still work ==
|
|
read 512/512 bytes at offset 0
|
|
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
incompatible_features 0x1
|
|
|
|
== Repairing the image file must succeed ==
|
|
Repairing cluster 5 refcount=0 reference=1
|
|
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.
|
|
incompatible_features 0x0
|
|
|
|
== Data should still be accessible after repair ==
|
|
read 512/512 bytes at offset 0
|
|
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
|
|
== Opening a dirty image read/write should repair it ==
|
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
|
|
wrote 512/512 bytes at offset 0
|
|
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
incompatible_features 0x1
|
|
Repairing cluster 5 refcount=0 reference=1
|
|
wrote 512/512 bytes at offset 0
|
|
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
incompatible_features 0x0
|
|
|
|
== Creating an image file with lazy_refcounts=off ==
|
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
|
|
wrote 512/512 bytes at offset 0
|
|
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
incompatible_features 0x0
|
|
No errors were found on the image.
|
|
|
|
== Committing to a backing file with lazy_refcounts=on ==
|
|
Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=134217728
|
|
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728 backing_file='TEST_DIR/t.IMGFMT.base'
|
|
wrote 512/512 bytes at offset 0
|
|
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
Image committed.
|
|
incompatible_features 0x0
|
|
incompatible_features 0x0
|
|
No errors were found on the image.
|
|
No errors were found on the image.
|
|
*** done
|