Skip to content

Commit

Permalink
qcow2: Add refcount_bits to format-specific info
Browse files Browse the repository at this point in the history
Add the bit width of every refcount entry to the format-specific
information.

In contrast to lazy_refcounts and the corrupt flag, this should be
always emitted, even for compat=0.10 although it does not support any
refcount width other than 16 bits. This is because if a boolean is
optional, one normally assumes it to be false when omitted; but if an
integer is not specified, it is rather difficult to guess its value.

This new field breaks some test outputs, fix them.

Signed-off-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
  • Loading branch information
XanClic authored and kevmw committed Mar 10, 2015
1 parent 346a53d commit 0709c5a
Show file tree
Hide file tree
Showing 7 changed files with 37 additions and 10 deletions.
4 changes: 3 additions & 1 deletion block/qcow2.c
Expand Up @@ -2482,7 +2482,8 @@ static ImageInfoSpecific *qcow2_get_specific_info(BlockDriverState *bs)
};
if (s->qcow_version == 2) {
*spec_info->qcow2 = (ImageInfoSpecificQCow2){
.compat = g_strdup("0.10"),
.compat = g_strdup("0.10"),
.refcount_bits = s->refcount_bits,
};
} else if (s->qcow_version == 3) {
*spec_info->qcow2 = (ImageInfoSpecificQCow2){
Expand All @@ -2493,6 +2494,7 @@ static ImageInfoSpecific *qcow2_get_specific_info(BlockDriverState *bs)
.corrupt = s->incompatible_features &
QCOW2_INCOMPAT_CORRUPT,
.has_corrupt = true,
.refcount_bits = s->refcount_bits,
};
}

Expand Down
5 changes: 4 additions & 1 deletion qapi/block-core.json
Expand Up @@ -41,13 +41,16 @@
# @corrupt: #optional true if the image has been marked corrupt; only valid for
# compat >= 1.1 (since 2.2)
#
# @refcount-bits: width of a refcount entry in bits (since 2.3)
#
# Since: 1.7
##
{ 'type': 'ImageInfoSpecificQCow2',
'data': {
'compat': 'str',
'*lazy-refcounts': 'bool',
'*corrupt': 'bool'
'*corrupt': 'bool',
'refcount-bits': 'int'
} }

##
Expand Down
1 change: 1 addition & 0 deletions tests/qemu-iotests/060.out
Expand Up @@ -18,6 +18,7 @@ cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
refcount bits: 16
corrupt: true
qemu-io: can't open device TEST_DIR/t.IMGFMT: IMGFMT: Image is corrupt; cannot be opened read/write
read 512/512 bytes at offset 0
Expand Down
23 changes: 15 additions & 8 deletions tests/qemu-iotests/065
Expand Up @@ -88,34 +88,41 @@ class TestQMP(TestImageInfoSpecific):
class TestQCow2(TestQemuImgInfo):
'''Testing a qcow2 version 2 image'''
img_options = 'compat=0.10'
json_compare = { 'compat': '0.10' }
human_compare = [ 'compat: 0.10' ]
json_compare = { 'compat': '0.10', 'refcount-bits': 16 }
human_compare = [ 'compat: 0.10', 'refcount bits: 16' ]

class TestQCow3NotLazy(TestQemuImgInfo):
'''Testing a qcow2 version 3 image with lazy refcounts disabled'''
img_options = 'compat=1.1,lazy_refcounts=off'
json_compare = { 'compat': '1.1', 'lazy-refcounts': False, 'corrupt': False }
human_compare = [ 'compat: 1.1', 'lazy refcounts: false', 'corrupt: false' ]
json_compare = { 'compat': '1.1', 'lazy-refcounts': False,
'refcount-bits': 16, 'corrupt': False }
human_compare = [ 'compat: 1.1', 'lazy refcounts: false',
'refcount bits: 16', 'corrupt: false' ]

class TestQCow3Lazy(TestQemuImgInfo):
'''Testing a qcow2 version 3 image with lazy refcounts enabled'''
img_options = 'compat=1.1,lazy_refcounts=on'
json_compare = { 'compat': '1.1', 'lazy-refcounts': True, 'corrupt': False }
human_compare = [ 'compat: 1.1', 'lazy refcounts: true', 'corrupt: false' ]
json_compare = { 'compat': '1.1', 'lazy-refcounts': True,
'refcount-bits': 16, 'corrupt': False }
human_compare = [ 'compat: 1.1', 'lazy refcounts: true',
'refcount bits: 16', 'corrupt: false' ]

class TestQCow3NotLazyQMP(TestQMP):
'''Testing a qcow2 version 3 image with lazy refcounts disabled, opening
with lazy refcounts enabled'''
img_options = 'compat=1.1,lazy_refcounts=off'
qemu_options = 'lazy-refcounts=on'
compare = { 'compat': '1.1', 'lazy-refcounts': False, 'corrupt': False }
compare = { 'compat': '1.1', 'lazy-refcounts': False,
'refcount-bits': 16, 'corrupt': False }


class TestQCow3LazyQMP(TestQMP):
'''Testing a qcow2 version 3 image with lazy refcounts enabled, opening
with lazy refcounts disabled'''
img_options = 'compat=1.1,lazy_refcounts=on'
qemu_options = 'lazy-refcounts=off'
compare = { 'compat': '1.1', 'lazy-refcounts': True, 'corrupt': False }
compare = { 'compat': '1.1', 'lazy-refcounts': True,
'refcount-bits': 16, 'corrupt': False }

TestImageInfoSpecific = None
TestQemuImgInfo = None
Expand Down
5 changes: 5 additions & 0 deletions tests/qemu-iotests/067.out
Expand Up @@ -32,6 +32,7 @@ Testing: -drive file=TEST_DIR/t.qcow2,format=qcow2,if=none,id=disk -device virti
"data": {
"compat": "1.1",
"lazy-refcounts": false,
"refcount-bits": 16,
"corrupt": false
}
},
Expand Down Expand Up @@ -208,6 +209,7 @@ Testing: -drive file=TEST_DIR/t.qcow2,format=qcow2,if=none,id=disk
"data": {
"compat": "1.1",
"lazy-refcounts": false,
"refcount-bits": 16,
"corrupt": false
}
},
Expand Down Expand Up @@ -414,6 +416,7 @@ Testing:
"data": {
"compat": "1.1",
"lazy-refcounts": false,
"refcount-bits": 16,
"corrupt": false
}
},
Expand Down Expand Up @@ -599,6 +602,7 @@ Testing:
"data": {
"compat": "1.1",
"lazy-refcounts": false,
"refcount-bits": 16,
"corrupt": false
}
},
Expand Down Expand Up @@ -710,6 +714,7 @@ Testing:
"data": {
"compat": "1.1",
"lazy-refcounts": false,
"refcount-bits": 16,
"corrupt": false
}
},
Expand Down
7 changes: 7 additions & 0 deletions tests/qemu-iotests/082.out
Expand Up @@ -18,6 +18,7 @@ cluster_size: 4096
Format specific information:
compat: 1.1
lazy refcounts: true
refcount bits: 16
corrupt: false

Testing: create -f qcow2 -o cluster_size=4k -o lazy_refcounts=on -o cluster_size=8k TEST_DIR/t.qcow2 128M
Expand All @@ -29,6 +30,7 @@ cluster_size: 8192
Format specific information:
compat: 1.1
lazy refcounts: true
refcount bits: 16
corrupt: false

Testing: create -f qcow2 -o cluster_size=4k,cluster_size=8k TEST_DIR/t.qcow2 128M
Expand Down Expand Up @@ -190,6 +192,7 @@ cluster_size: 4096
Format specific information:
compat: 1.1
lazy refcounts: true
refcount bits: 16
corrupt: false

Testing: convert -O qcow2 -o cluster_size=4k -o lazy_refcounts=on -o cluster_size=8k TEST_DIR/t.qcow2 TEST_DIR/t.qcow2.base
Expand All @@ -200,6 +203,7 @@ cluster_size: 8192
Format specific information:
compat: 1.1
lazy refcounts: true
refcount bits: 16
corrupt: false

Testing: convert -O qcow2 -o cluster_size=4k,cluster_size=8k TEST_DIR/t.qcow2 TEST_DIR/t.qcow2.base
Expand Down Expand Up @@ -346,6 +350,7 @@ cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: true
refcount bits: 16
corrupt: false

Testing: amend -f qcow2 -o size=130M -o lazy_refcounts=off TEST_DIR/t.qcow2
Expand All @@ -356,6 +361,7 @@ cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
refcount bits: 16
corrupt: false

Testing: amend -f qcow2 -o size=8M -o lazy_refcounts=on -o size=132M TEST_DIR/t.qcow2
Expand All @@ -366,6 +372,7 @@ cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: true
refcount bits: 16
corrupt: false

Testing: amend -f qcow2 -o size=4M,size=148M TEST_DIR/t.qcow2
Expand Down
2 changes: 2 additions & 0 deletions tests/qemu-iotests/089.out
Expand Up @@ -43,12 +43,14 @@ vm state offset: 512 MiB
Format specific information:
compat: 1.1
lazy refcounts: false
refcount bits: 16
corrupt: false
format name: IMGFMT
cluster size: 64 KiB
vm state offset: 512 MiB
Format specific information:
compat: 1.1
lazy refcounts: false
refcount bits: 16
corrupt: false
*** done

0 comments on commit 0709c5a

Please sign in to comment.