diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index ed21f0fbb5..be76c06d47 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -1861,8 +1861,6 @@ virDomainObjSetDefTransient(virCapsPtr caps, bool live) { int ret = -1; - char *xml = NULL; - virDomainDefPtr newDef = NULL; if (!virDomainObjIsActive(domain) && !live) return 0; @@ -1873,17 +1871,11 @@ virDomainObjSetDefTransient(virCapsPtr caps, if (domain->newDef) return 0; - if (!(xml = virDomainDefFormat(domain->def, VIR_DOMAIN_XML_WRITE_FLAGS))) + if (!(domain->newDef = virDomainDefCopy(caps, domain->def, false))) goto out; - if (!(newDef = virDomainDefParseString(caps, xml, -1, - VIR_DOMAIN_XML_READ_FLAGS))) - goto out; - - domain->newDef = newDef; ret = 0; out: - VIR_FREE(xml); return ret; } @@ -14917,24 +14909,41 @@ cleanup: } +/* Copy src into a new definition; with the quality of the copy + * depending on the migratable flag (false for transitions between + * persistent and active, true for transitions across save files or + * snapshots). */ virDomainDefPtr -virDomainObjCopyPersistentDef(virCapsPtr caps, virDomainObjPtr dom) +virDomainDefCopy(virCapsPtr caps, virDomainDefPtr src, bool migratable) { char *xml; - virDomainDefPtr cur, ret; + virDomainDefPtr ret; + unsigned int write_flags = VIR_DOMAIN_XML_WRITE_FLAGS; + unsigned int read_flags = VIR_DOMAIN_XML_READ_FLAGS; - cur = virDomainObjGetPersistentDef(caps, dom); + if (migratable) + write_flags |= VIR_DOMAIN_XML_INACTIVE | VIR_DOMAIN_XML_MIGRATABLE; - xml = virDomainDefFormat(cur, VIR_DOMAIN_XML_WRITE_FLAGS); + /* Easiest to clone via a round-trip through XML. */ + xml = virDomainDefFormat(src, write_flags); if (!xml) return NULL; - ret = virDomainDefParseString(caps, xml, -1, VIR_DOMAIN_XML_READ_FLAGS); + ret = virDomainDefParseString(caps, xml, -1, read_flags); VIR_FREE(xml); return ret; } +virDomainDefPtr +virDomainObjCopyPersistentDef(virCapsPtr caps, virDomainObjPtr dom) +{ + virDomainDefPtr cur; + + cur = virDomainObjGetPersistentDef(caps, dom); + return virDomainDefCopy(caps, cur, false); +} + virDomainState virDomainObjGetState(virDomainObjPtr dom, int *reason) diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 091879e5d0..c3e8c1604e 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1943,6 +1943,8 @@ virDomainLiveConfigHelperMethod(virCapsPtr caps, unsigned int *flags, virDomainDefPtr *persistentDef); +virDomainDefPtr virDomainDefCopy(virCapsPtr caps, virDomainDefPtr src, + bool migratable); virDomainDefPtr virDomainObjCopyPersistentDef(virCapsPtr caps, virDomainObjPtr dom); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 5a0713981d..756d7bd41e 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -312,6 +312,7 @@ virDomainDefCheckABIStability; virDomainDefClearDeviceAliases; virDomainDefClearPCIAddresses; virDomainDefCompatibleDevice; +virDomainDefCopy; virDomainDefFormat; virDomainDefFormatInternal; virDomainDefFree; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 595c452ddc..d4cafccd7e 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -12189,23 +12189,13 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot, } /* Prepare to copy the snapshot inactive xml as the config of this - * domain. Easiest way is by a round trip through xml. + * domain. * * XXX Should domain snapshots track live xml rather * than inactive xml? */ snap->def->current = true; if (snap->def->dom) { - char *xml; - if (!(xml = qemuDomainDefFormatXML(driver, - snap->def->dom, - VIR_DOMAIN_XML_INACTIVE | - VIR_DOMAIN_XML_SECURE | - VIR_DOMAIN_XML_MIGRATABLE))) - goto cleanup; - config = virDomainDefParseString(driver->caps, xml, - QEMU_EXPECTED_VIRT_TYPES, - VIR_DOMAIN_XML_INACTIVE); - VIR_FREE(xml); + config = virDomainDefCopy(driver->caps, snap->def->dom, true); if (!config) goto cleanup; }