mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-09-08 16:07:39 -06:00

The point of 'qemu-img convert --bitmaps' is to be a convenience for actions that are already possible through a string of smaller 'qemu-img bitmap' sub-commands. One situation not accounted for already is that if a source image contains an inconsistent bitmap (for example, because a qemu process died abruptly before flushing bitmap state), the user MUST delete those inconsistent bitmaps before anything else useful can be done with the image. We don't want to delete inconsistent bitmaps by default: although a corrupt bitmap is only a loss of optimization rather than a corruption of user-visible data, it is still nice to require the user to opt in to the fact that they are aware of the loss of the bitmap. Still, requiring the user to check 'qemu-img info' to see whether bitmaps are consistent, then use 'qemu-img bitmap --remove' to remove offenders, all before using 'qemu-img convert', is a lot more work than just adding a knob 'qemu-img convert --bitmaps --skip-broken-bitmaps' which opts in to skipping the broken bitmaps. After testing the new option, also demonstrate the way to manually fix things (either deleting bad bitmaps, or re-creating them as empty) so that it is possible to convert without the option. Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1946084 Signed-off-by: Eric Blake <eblake@redhat.com> Message-Id: <20210709153951.2801666-4-eblake@redhat.com> [eblake: warning message tweak, test enhancements] Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
183 lines
5.5 KiB
Text
183 lines
5.5 KiB
Text
QA output created by qemu-img-bitmaps
|
|
|
|
=== Initial image setup ===
|
|
|
|
Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=10485760
|
|
wrote 1048576/1048576 bytes at offset 3145728
|
|
1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
Formatting 'TEST_DIR/t.IMGFMT.orig', fmt=IMGFMT size=10485760 backing_file=TEST_DIR/t.IMGFMT.base backing_fmt=IMGFMT
|
|
wrote 1048576/1048576 bytes at offset 0
|
|
1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
wrote 1048576/1048576 bytes at offset 3145728
|
|
1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
wrote 1048576/1048576 bytes at offset 1048576
|
|
1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
wrote 1048576/1048576 bytes at offset 2097152
|
|
1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
|
|
|
=== Bitmap preservation not possible to non-qcow2 ===
|
|
|
|
qemu-img: Format driver 'raw' does not support bitmaps
|
|
|
|
=== Convert with bitmap preservation ===
|
|
|
|
image: TEST_DIR/t.IMGFMT
|
|
file format: IMGFMT
|
|
virtual size: 10 MiB (10485760 bytes)
|
|
cluster_size: 65536
|
|
Format specific information:
|
|
bitmaps:
|
|
[0]:
|
|
flags:
|
|
name: b1
|
|
granularity: 524288
|
|
[1]:
|
|
flags:
|
|
[0]: auto
|
|
name: b2
|
|
granularity: 65536
|
|
corrupt: false
|
|
image: TEST_DIR/t.IMGFMT
|
|
file format: IMGFMT
|
|
virtual size: 10 MiB (10485760 bytes)
|
|
cluster_size: 65536
|
|
Format specific information:
|
|
bitmaps:
|
|
[0]:
|
|
flags:
|
|
name: b1
|
|
granularity: 524288
|
|
[1]:
|
|
flags:
|
|
[0]: auto
|
|
name: b2
|
|
granularity: 65536
|
|
[2]:
|
|
flags:
|
|
name: b0
|
|
granularity: 65536
|
|
corrupt: false
|
|
|
|
=== Merge from top layer into backing image ===
|
|
|
|
image: TEST_DIR/t.IMGFMT
|
|
file format: IMGFMT
|
|
virtual size: 10 MiB (10485760 bytes)
|
|
cluster_size: 65536
|
|
backing file: TEST_DIR/t.IMGFMT.base
|
|
backing file format: IMGFMT
|
|
Format specific information:
|
|
bitmaps:
|
|
[0]:
|
|
flags:
|
|
name: b1
|
|
granularity: 524288
|
|
[1]:
|
|
flags:
|
|
[0]: auto
|
|
name: b2
|
|
granularity: 65536
|
|
[2]:
|
|
flags:
|
|
name: b0
|
|
granularity: 65536
|
|
corrupt: false
|
|
|
|
image: TEST_DIR/t.IMGFMT.base
|
|
file format: IMGFMT
|
|
virtual size: 10 MiB (10485760 bytes)
|
|
cluster_size: 65536
|
|
Format specific information:
|
|
bitmaps:
|
|
[0]:
|
|
flags:
|
|
[0]: auto
|
|
name: b0
|
|
granularity: 65536
|
|
[1]:
|
|
flags:
|
|
[0]: auto
|
|
name: b3
|
|
granularity: 65536
|
|
corrupt: false
|
|
|
|
=== Check bitmap contents ===
|
|
|
|
[{ "start": 0, "length": 3145728, "depth": 0, "present": true, "zero": false, "data": true, "offset": OFFSET},
|
|
{ "start": 3145728, "length": 1048576, "depth": 0, "present": false, "zero": false, "data": false},
|
|
{ "start": 4194304, "length": 6291456, "depth": 0, "present": true, "zero": false, "data": true, "offset": OFFSET}]
|
|
[{ "start": 0, "length": 1048576, "depth": 0, "present": true, "zero": false, "data": true, "offset": OFFSET},
|
|
{ "start": 1048576, "length": 1048576, "depth": 0, "present": false, "zero": false, "data": false},
|
|
{ "start": 2097152, "length": 8388608, "depth": 0, "present": true, "zero": false, "data": true, "offset": OFFSET}]
|
|
[{ "start": 0, "length": 2097152, "depth": 0, "present": true, "zero": false, "data": true, "offset": OFFSET},
|
|
{ "start": 2097152, "length": 1048576, "depth": 0, "present": false, "zero": false, "data": false},
|
|
{ "start": 3145728, "length": 7340032, "depth": 0, "present": true, "zero": false, "data": true, "offset": OFFSET}]
|
|
[{ "start": 0, "length": 2097152, "depth": 0, "present": true, "zero": false, "data": true, "offset": OFFSET},
|
|
{ "start": 2097152, "length": 1048576, "depth": 0, "present": false, "zero": false, "data": false},
|
|
{ "start": 3145728, "length": 7340032, "depth": 0, "present": true, "zero": false, "data": true, "offset": OFFSET}]
|
|
|
|
=== Check handling of inconsistent bitmap ===
|
|
|
|
image: TEST_DIR/t.IMGFMT
|
|
file format: IMGFMT
|
|
virtual size: 10 MiB (10485760 bytes)
|
|
cluster_size: 65536
|
|
backing file: TEST_DIR/t.IMGFMT.base
|
|
backing file format: IMGFMT
|
|
Format specific information:
|
|
bitmaps:
|
|
[0]:
|
|
flags:
|
|
[0]: in-use
|
|
[1]: auto
|
|
name: b2
|
|
granularity: 65536
|
|
[1]:
|
|
flags:
|
|
[0]: in-use
|
|
name: b0
|
|
granularity: 65536
|
|
[2]:
|
|
flags:
|
|
[0]: auto
|
|
name: b4
|
|
granularity: 65536
|
|
corrupt: false
|
|
|
|
qemu-img: Cannot copy inconsistent bitmap 'b0'
|
|
Try --skip-broken-bitmaps, or use 'qemu-img bitmap --remove' to delete it
|
|
qemu-img: Could not open 'TEST_DIR/t.IMGFMT.copy': Could not open 'TEST_DIR/t.IMGFMT.copy': No such file or directory
|
|
|
|
qemu-img: warning: Skipping inconsistent bitmap 'b0'
|
|
qemu-img: warning: Skipping inconsistent bitmap 'b2'
|
|
image: TEST_DIR/t.IMGFMT.copy
|
|
file format: IMGFMT
|
|
virtual size: 10 MiB (10485760 bytes)
|
|
cluster_size: 65536
|
|
Format specific information:
|
|
bitmaps:
|
|
[0]:
|
|
flags:
|
|
[0]: auto
|
|
name: b4
|
|
granularity: 65536
|
|
corrupt: false
|
|
|
|
image: TEST_DIR/t.IMGFMT.copy
|
|
file format: IMGFMT
|
|
virtual size: 10 MiB (10485760 bytes)
|
|
cluster_size: 65536
|
|
Format specific information:
|
|
bitmaps:
|
|
[0]:
|
|
flags:
|
|
[0]: auto
|
|
name: b4
|
|
granularity: 65536
|
|
[1]:
|
|
flags:
|
|
[0]: auto
|
|
name: b2
|
|
granularity: 65536
|
|
corrupt: false
|
|
*** done
|