mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-10 05:17:59 +03:00
qemu: Probe whether an image is 'qcow2 v2' from query-named-block-nodes
Such images don't support stuff like dirty bitmaps. Note that the synthetic test for detecting bitmaps is used as an example to prevent adding additional test cases. Signed-off-by: Peter Krempa <pkrempa@redhat.com> Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
This commit is contained in:
parent
9e855e7589
commit
253bce93d3
@ -732,6 +732,9 @@ struct _qemuBlockNamedNodeData {
|
|||||||
|
|
||||||
/* the cluster size of the image is valid only when > 0 */
|
/* the cluster size of the image is valid only when > 0 */
|
||||||
unsigned long long clusterSize;
|
unsigned long long clusterSize;
|
||||||
|
|
||||||
|
/* image version */
|
||||||
|
bool qcow2v2;
|
||||||
};
|
};
|
||||||
|
|
||||||
GHashTable *
|
GHashTable *
|
||||||
|
@ -2978,6 +2978,7 @@ qemuMonitorJSONBlockGetNamedNodeDataWorker(size_t pos G_GNUC_UNUSED,
|
|||||||
GHashTable *nodes = opaque;
|
GHashTable *nodes = opaque;
|
||||||
virJSONValuePtr img;
|
virJSONValuePtr img;
|
||||||
virJSONValuePtr bitmaps;
|
virJSONValuePtr bitmaps;
|
||||||
|
virJSONValuePtr format_specific;
|
||||||
const char *nodename;
|
const char *nodename;
|
||||||
g_autoptr(qemuBlockNamedNodeData) ent = NULL;
|
g_autoptr(qemuBlockNamedNodeData) ent = NULL;
|
||||||
|
|
||||||
@ -3000,6 +3001,16 @@ qemuMonitorJSONBlockGetNamedNodeDataWorker(size_t pos G_GNUC_UNUSED,
|
|||||||
if ((bitmaps = virJSONValueObjectGetArray(val, "dirty-bitmaps")))
|
if ((bitmaps = virJSONValueObjectGetArray(val, "dirty-bitmaps")))
|
||||||
qemuMonitorJSONBlockGetNamedNodeDataBitmaps(bitmaps, ent);
|
qemuMonitorJSONBlockGetNamedNodeDataBitmaps(bitmaps, ent);
|
||||||
|
|
||||||
|
/* query qcow2 format specific props */
|
||||||
|
if ((format_specific = virJSONValueObjectGetObject(img, "format-specific")) &&
|
||||||
|
STREQ_NULLABLE(virJSONValueObjectGetString(format_specific, "type"), "qcow2")) {
|
||||||
|
virJSONValuePtr qcow2props = virJSONValueObjectGetObject(format_specific, "data");
|
||||||
|
|
||||||
|
if (qcow2props &&
|
||||||
|
STREQ_NULLABLE(virJSONValueObjectGetString(qcow2props, "compat"), "0.10"))
|
||||||
|
ent->qcow2v2 = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (virHashAddEntry(nodes, nodename, ent) < 0)
|
if (virHashAddEntry(nodes, nodename, ent) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
@ -599,6 +599,8 @@ testQemuDetectBitmapsWorker(GHashTable *nodedata,
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
virBufferAsprintf(buf, "%s:\n", nodename);
|
virBufferAsprintf(buf, "%s:\n", nodename);
|
||||||
|
if (data->qcow2v2)
|
||||||
|
virBufferAddLit(buf, " qcow2 v2\n");
|
||||||
virBufferAdjustIndent(buf, 1);
|
virBufferAdjustIndent(buf, 1);
|
||||||
|
|
||||||
for (i = 0; i < data->nbitmaps; i++) {
|
for (i = 0; i < data->nbitmaps; i++) {
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
"format-specific": {
|
"format-specific": {
|
||||||
"type": "qcow2",
|
"type": "qcow2",
|
||||||
"data": {
|
"data": {
|
||||||
"compat": "1.1",
|
"compat": "0.10",
|
||||||
"compression-type": "zlib",
|
"compression-type": "zlib",
|
||||||
"lazy-refcounts": false,
|
"lazy-refcounts": false,
|
||||||
"bitmaps": [
|
"bitmaps": [
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
libvirt-1-format:
|
libvirt-1-format:
|
||||||
|
qcow2 v2
|
||||||
current: record:1 busy:0 persist:1 inconsist:1 gran:65536 dirty:0
|
current: record:1 busy:0 persist:1 inconsist:1 gran:65536 dirty:0
|
||||||
top-ok: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0
|
top-ok: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0
|
||||||
top-inactive: record:0 busy:0 persist:1 inconsist:0 gran:65536 dirty:0
|
top-inactive: record:0 busy:0 persist:1 inconsist:0 gran:65536 dirty:0
|
||||||
|
Loading…
Reference in New Issue
Block a user