1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2025-03-07 17:28:15 +00:00

snapshot: make cloning of domain definition easier

Upcoming patches for revert-and-clone branching of snapshots need
to be able to copy a domain definition; make this step reusable.

* src/conf/domain_conf.h (virDomainDefCopy): New prototype.
* src/conf/domain_conf.c (virDomainObjCopyPersistentDef): Split...
(virDomainDefCopy): ...into new function.
(virDomainObjSetDefTransient): Use it.
* src/libvirt_private.syms (domain_conf.h): Export it.
* src/qemu/qemu_driver.c (qemuDomainRevertToSnapshot): Use it.
This commit is contained in:
Eric Blake 2012-11-15 13:40:25 -07:00
parent 0f9b6ee42d
commit 0b5617a607
4 changed files with 28 additions and 26 deletions

View File

@ -1861,8 +1861,6 @@ virDomainObjSetDefTransient(virCapsPtr caps,
bool live) bool live)
{ {
int ret = -1; int ret = -1;
char *xml = NULL;
virDomainDefPtr newDef = NULL;
if (!virDomainObjIsActive(domain) && !live) if (!virDomainObjIsActive(domain) && !live)
return 0; return 0;
@ -1873,17 +1871,11 @@ virDomainObjSetDefTransient(virCapsPtr caps,
if (domain->newDef) if (domain->newDef)
return 0; return 0;
if (!(xml = virDomainDefFormat(domain->def, VIR_DOMAIN_XML_WRITE_FLAGS))) if (!(domain->newDef = virDomainDefCopy(caps, domain->def, false)))
goto out; goto out;
if (!(newDef = virDomainDefParseString(caps, xml, -1,
VIR_DOMAIN_XML_READ_FLAGS)))
goto out;
domain->newDef = newDef;
ret = 0; ret = 0;
out: out:
VIR_FREE(xml);
return ret; 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 virDomainDefPtr
virDomainObjCopyPersistentDef(virCapsPtr caps, virDomainObjPtr dom) virDomainDefCopy(virCapsPtr caps, virDomainDefPtr src, bool migratable)
{ {
char *xml; 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) if (!xml)
return NULL; return NULL;
ret = virDomainDefParseString(caps, xml, -1, VIR_DOMAIN_XML_READ_FLAGS); ret = virDomainDefParseString(caps, xml, -1, read_flags);
VIR_FREE(xml); VIR_FREE(xml);
return ret; return ret;
} }
virDomainDefPtr
virDomainObjCopyPersistentDef(virCapsPtr caps, virDomainObjPtr dom)
{
virDomainDefPtr cur;
cur = virDomainObjGetPersistentDef(caps, dom);
return virDomainDefCopy(caps, cur, false);
}
virDomainState virDomainState
virDomainObjGetState(virDomainObjPtr dom, int *reason) virDomainObjGetState(virDomainObjPtr dom, int *reason)

View File

@ -1943,6 +1943,8 @@ virDomainLiveConfigHelperMethod(virCapsPtr caps,
unsigned int *flags, unsigned int *flags,
virDomainDefPtr *persistentDef); virDomainDefPtr *persistentDef);
virDomainDefPtr virDomainDefCopy(virCapsPtr caps, virDomainDefPtr src,
bool migratable);
virDomainDefPtr virDomainDefPtr
virDomainObjCopyPersistentDef(virCapsPtr caps, virDomainObjPtr dom); virDomainObjCopyPersistentDef(virCapsPtr caps, virDomainObjPtr dom);

View File

@ -312,6 +312,7 @@ virDomainDefCheckABIStability;
virDomainDefClearDeviceAliases; virDomainDefClearDeviceAliases;
virDomainDefClearPCIAddresses; virDomainDefClearPCIAddresses;
virDomainDefCompatibleDevice; virDomainDefCompatibleDevice;
virDomainDefCopy;
virDomainDefFormat; virDomainDefFormat;
virDomainDefFormatInternal; virDomainDefFormatInternal;
virDomainDefFree; virDomainDefFree;

View File

@ -12189,23 +12189,13 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
} }
/* Prepare to copy the snapshot inactive xml as the config of this /* 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 * XXX Should domain snapshots track live xml rather
* than inactive xml? */ * than inactive xml? */
snap->def->current = true; snap->def->current = true;
if (snap->def->dom) { if (snap->def->dom) {
char *xml; config = virDomainDefCopy(driver->caps, snap->def->dom, true);
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);
if (!config) if (!config)
goto cleanup; goto cleanup;
} }