diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c index ffa1bf22ad..1eda7c2789 100644 --- a/src/conf/snapshot_conf.c +++ b/src/conf/snapshot_conf.c @@ -659,6 +659,7 @@ virDomainSnapshotDiskDefFormat(virBufferPtr buf, char *virDomainSnapshotDefFormat(const char *domain_uuid, virDomainSnapshotDefPtr def, + virCapsPtr caps, unsigned int flags, int internal) { @@ -702,7 +703,7 @@ char *virDomainSnapshotDefFormat(const char *domain_uuid, virBufferAddLit(&buf, "\n"); } if (def->dom) { - if (virDomainDefFormatInternal(def->dom, NULL, flags, &buf) < 0) { + if (virDomainDefFormatInternal(def->dom, caps, flags, &buf) < 0) { virBufferFreeAndReset(&buf); return NULL; } diff --git a/src/conf/snapshot_conf.h b/src/conf/snapshot_conf.h index 4f0d096592..fcf7a1e824 100644 --- a/src/conf/snapshot_conf.h +++ b/src/conf/snapshot_conf.h @@ -113,6 +113,7 @@ virDomainSnapshotDefPtr virDomainSnapshotDefParseNode(xmlDocPtr xml, void virDomainSnapshotDefFree(virDomainSnapshotDefPtr def); char *virDomainSnapshotDefFormat(const char *domain_uuid, virDomainSnapshotDefPtr def, + virCapsPtr caps, unsigned int flags, int internal); int virDomainSnapshotAlignDisks(virDomainSnapshotDefPtr snapshot, diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c index ce5f799864..00d0e0a6f0 100644 --- a/src/esx/esx_driver.c +++ b/src/esx/esx_driver.c @@ -4292,7 +4292,7 @@ esxDomainSnapshotGetXMLDesc(virDomainSnapshotPtr snapshot, virUUIDFormat(snapshot->domain->uuid, uuid_string); - xml = virDomainSnapshotDefFormat(uuid_string, &def, + xml = virDomainSnapshotDefFormat(uuid_string, &def, priv->caps, virDomainDefFormatConvertXMLFlags(flags), 0); diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 9d08f4f175..7290e3a3ca 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -2605,6 +2605,7 @@ qemuFindQemuImgBinary(virQEMUDriverPtr driver) int qemuDomainSnapshotWriteMetadata(virDomainObjPtr vm, virDomainSnapshotObjPtr snapshot, + virCapsPtr caps, char *snapshotDir) { char *newxml = NULL; @@ -2615,7 +2616,7 @@ qemuDomainSnapshotWriteMetadata(virDomainObjPtr vm, virUUIDFormat(vm->def->uuid, uuidstr); newxml = virDomainSnapshotDefFormat( - uuidstr, snapshot->def, + uuidstr, snapshot->def, caps, virDomainDefFormatConvertXMLFlags(QEMU_DOMAIN_FORMAT_LIVE_FLAGS), 1); if (newxml == NULL) @@ -2775,7 +2776,7 @@ qemuDomainSnapshotDiscard(virQEMUDriverPtr driver, snap->def->parent); } else { parentsnap->def->current = true; - if (qemuDomainSnapshotWriteMetadata(vm, parentsnap, + if (qemuDomainSnapshotWriteMetadata(vm, parentsnap, driver->caps, cfg->snapshotDir) < 0) { VIR_WARN("failed to set parent snapshot '%s' as current", snap->def->parent); diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index 6a8cf705d8..7cabf102d5 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -375,6 +375,7 @@ const char *qemuFindQemuImgBinary(virQEMUDriverPtr driver); int qemuDomainSnapshotWriteMetadata(virDomainObjPtr vm, virDomainSnapshotObjPtr snapshot, + virCapsPtr caps, char *snapshotDir); int qemuDomainSnapshotForEachQcow2(virQEMUDriverPtr driver, diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 9f38ce24a9..f2db7d7622 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -14908,6 +14908,7 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, if (update_current) { vm->current_snapshot->def->current = false; if (qemuDomainSnapshotWriteMetadata(vm, vm->current_snapshot, + driver->caps, cfg->snapshotDir) < 0) goto endjob; vm->current_snapshot = NULL; @@ -14956,7 +14957,7 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, endjob: if (snapshot && !(flags & VIR_DOMAIN_SNAPSHOT_CREATE_NO_METADATA)) { - if (qemuDomainSnapshotWriteMetadata(vm, snap, + if (qemuDomainSnapshotWriteMetadata(vm, snap, driver->caps, cfg->snapshotDir) < 0) { /* if writing of metadata fails, error out rather than trying * to silently carry on without completing the snapshot */ @@ -15275,6 +15276,7 @@ static char * qemuDomainSnapshotGetXMLDesc(virDomainSnapshotPtr snapshot, unsigned int flags) { + virQEMUDriverPtr driver = snapshot->domain->conn->privateData; virDomainObjPtr vm = NULL; char *xml = NULL; virDomainSnapshotObjPtr snap = NULL; @@ -15293,7 +15295,7 @@ qemuDomainSnapshotGetXMLDesc(virDomainSnapshotPtr snapshot, virUUIDFormat(snapshot->domain->uuid, uuidstr); - xml = virDomainSnapshotDefFormat(uuidstr, snap->def, + xml = virDomainSnapshotDefFormat(uuidstr, snap->def, driver->caps, virDomainDefFormatConvertXMLFlags(flags), 0); @@ -15474,7 +15476,7 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot, if (vm->current_snapshot) { vm->current_snapshot->def->current = false; if (qemuDomainSnapshotWriteMetadata(vm, vm->current_snapshot, - cfg->snapshotDir) < 0) + driver->caps, cfg->snapshotDir) < 0) goto endjob; vm->current_snapshot = NULL; /* XXX Should we restore vm->current_snapshot after this point @@ -15709,7 +15711,7 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot, cleanup: if (ret == 0) { - if (qemuDomainSnapshotWriteMetadata(vm, snap, + if (qemuDomainSnapshotWriteMetadata(vm, snap, driver->caps, cfg->snapshotDir) < 0) ret = -1; else @@ -15736,6 +15738,7 @@ struct _virQEMUSnapReparent { virQEMUDriverConfigPtr cfg; virDomainSnapshotObjPtr parent; virDomainObjPtr vm; + virCapsPtr caps; int err; virDomainSnapshotObjPtr last; }; @@ -15764,7 +15767,7 @@ qemuDomainSnapshotReparentChildren(void *payload, if (!snap->sibling) rep->last = snap; - rep->err = qemuDomainSnapshotWriteMetadata(rep->vm, snap, + rep->err = qemuDomainSnapshotWriteMetadata(rep->vm, snap, rep->caps, rep->cfg->snapshotDir); } @@ -15833,7 +15836,7 @@ qemuDomainSnapshotDelete(virDomainSnapshotPtr snapshot, if (rem.current) { if (flags & VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN_ONLY) { snap->def->current = true; - if (qemuDomainSnapshotWriteMetadata(vm, snap, + if (qemuDomainSnapshotWriteMetadata(vm, snap, driver->caps, cfg->snapshotDir) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("failed to set snapshot '%s' as current"), @@ -15850,6 +15853,7 @@ qemuDomainSnapshotDelete(virDomainSnapshotPtr snapshot, rep.vm = vm; rep.err = 0; rep.last = NULL; + rep.caps = driver->caps; virDomainSnapshotForEachChild(snap, qemuDomainSnapshotReparentChildren, &rep); diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 89973f6782..fde5e2d653 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -6087,6 +6087,7 @@ testDomainSnapshotGetXMLDesc(virDomainSnapshotPtr snapshot, char *xml = NULL; virDomainSnapshotObjPtr snap = NULL; char uuidstr[VIR_UUID_STRING_BUFLEN]; + testDriverPtr privconn = snapshot->domain->conn->privateData; virCheckFlags(VIR_DOMAIN_XML_SECURE, NULL); @@ -6098,7 +6099,7 @@ testDomainSnapshotGetXMLDesc(virDomainSnapshotPtr snapshot, virUUIDFormat(snapshot->domain->uuid, uuidstr); - xml = virDomainSnapshotDefFormat(uuidstr, snap->def, + xml = virDomainSnapshotDefFormat(uuidstr, snap->def, privconn->caps, virDomainDefFormatConvertXMLFlags(flags), 0); diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c index cf38d2a373..d1eb09a143 100644 --- a/src/vbox/vbox_common.c +++ b/src/vbox/vbox_common.c @@ -5221,7 +5221,7 @@ vboxSnapshotRedefine(virDomainPtr dom, VIR_FREE(currentSnapshotXmlFilePath); if (virAsprintf(¤tSnapshotXmlFilePath, "%s%s.xml", machineLocationPath, snapshotMachineDesc->currentSnapshot) < 0) goto cleanup; - char *snapshotContent = virDomainSnapshotDefFormat(NULL, def, VIR_DOMAIN_DEF_FORMAT_SECURE, 0); + char *snapshotContent = virDomainSnapshotDefFormat(NULL, def, data->caps, VIR_DOMAIN_DEF_FORMAT_SECURE, 0); if (snapshotContent == NULL) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Unable to get snapshot content")); @@ -6146,7 +6146,7 @@ static char *vboxDomainSnapshotGetXMLDesc(virDomainSnapshotPtr snapshot, virUUIDFormat(dom->uuid, uuidstr); memcpy(def->dom->uuid, dom->uuid, VIR_UUID_BUFLEN); - ret = virDomainSnapshotDefFormat(uuidstr, def, + ret = virDomainSnapshotDefFormat(uuidstr, def, data->caps, virDomainDefFormatConvertXMLFlags(flags), 0); diff --git a/tests/domainsnapshotxml2xmltest.c b/tests/domainsnapshotxml2xmltest.c index cf91447f2d..714d64f25a 100644 --- a/tests/domainsnapshotxml2xmltest.c +++ b/tests/domainsnapshotxml2xmltest.c @@ -100,7 +100,7 @@ testCompareXMLToXMLFiles(const char *inxml, flags))) goto cleanup; - if (!(actual = virDomainSnapshotDefFormat(uuid, def, + if (!(actual = virDomainSnapshotDefFormat(uuid, def, driver.caps, VIR_DOMAIN_DEF_FORMAT_SECURE, internal))) goto cleanup;