4.1.0 bogus QCOW2 corruption reported after compress
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
QEMU |
Fix Released
|
Undecided
|
Unassigned |
Bug Description
Creating a compressed image then running `qemu-img check <..>.qcow2' on said image seems to report bogus corruption in some (but not all) cases:
Step 1.
# qemu-img info win7-base.qcow2
image: win7-base.qcow2
file format: qcow2
virtual size: 20 GiB (21474836480 bytes)
disk size: 12.2 GiB
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: true
refcount bits: 16
corrupt: false
# qemu-img check win7-base.qcow2
No errors were found on the image.
327680/327680 = 100.00% allocated, 0.00% fragmented, 0.00% compressed clusters
Image end offset: 21478375424
Step 2.
# qemu-img convert -f qcow2 -O qcow2 -c win7-base.qcow2 test1-z.qcow2
Step 3.
# qemu-img info test1-z.qcow2
image: test1-z.qcow2
file format: qcow2
virtual size: 20 GiB (21474836480 bytes)
disk size: 5.78 GiB
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
refcount bits: 16
corrupt: false
# qemu-img check test1-z.qcow2
ERROR cluster 1191 refcount=1 reference=2
ERROR cluster 1194 refcount=1 reference=4
ERROR cluster 1195 refcount=1 reference=7
ERROR cluster 1196 refcount=1 reference=7
ERROR cluster 1197 refcount=1 reference=6
ERROR cluster 1198 refcount=1 reference=4
ERROR cluster 1199 refcount=1 reference=4
ERROR cluster 1200 refcount=1 reference=5
ERROR cluster 1201 refcount=1 reference=3
<...> snip many errors
Leaked cluster 94847 refcount=3 reference=0
Leaked cluster 94848 refcount=3 reference=0
Leaked cluster 94849 refcount=11 reference=0
Leaked cluster 94850 refcount=14 reference=0
20503 errors were found on the image.
Data may be corrupted, or further writes to the image may corrupt it.
20503 leaked clusters were found on the image.
This means waste of disk space, but no harm to data.
197000/327680 = 60.12% allocated, 89.32% fragmented, 88.50% compressed clusters
Image end offset: 6216220672
The resultant image seems to work fine in a VM when used as a backing file.
Interestingly, if I substitute a qemu-img binary from qemu-4.0 then no errors are reported.
# /tmp/qemu-img check test1-z.qcow2
No errors were found on the image.
197000/327680 = 60.12% allocated, 89.32% fragmented, 88.50% compressed clusters
Image end offset: 6216220672
Is the image corrupted or not? I'm guessing not.
Just in case it matters, this is ext4 fs on rotational disk. Latest Arch Linux but self compiled 4.1.0 with recent QCOW2 corruption fixes added.
I haven't tried latest trunk but might do so if time permits.
Current trunk still displays the problem.
A git bisection between 4.0.0 and 4.1.0 revealed:
b6c246942b14d3e 0dec46a6c5868ed 84e7dbea19 is the first bad commit 0dec46a6c5868ed 84e7dbea19
commit b6c246942b14d3e
Author: Alberto Garcia <email address hidden>
Date: Fri May 10 19:22:54 2019 +0300
qcow2: Define and use QCOW2_COMPRESSE D_SECTOR_ SIZE
When an L2 table entry points to a compressed cluster the space used
by the data is specified in 512-byte sectors. This size is independent
from BDRV_SECTOR_SIZE and is specific to the qcow2 file format.
The QCOW2_COMPRESSE D_SECTOR_ SIZE constant defined in this patch makes
this explicit.
Signed-off-by: Alberto Garcia <email address hidden>
Signed-off-by: Kevin Wolf <email address hidden>
block/ qcow2-cluster. c | 5 +++-- qcow2-refcount. c | 25 +++++++ +++++++ ------- ----
block/
block/qcow2.c | 3 ++-
block/qcow2.h | 4 ++++
4 files changed, 23 insertions(+), 14 deletions(-)