[libvirt] [RFC PATCHv2 3/n] snapshot: make cloning of domain definition easier

Eric Blake eblake at redhat.com
Tue Nov 20 00:09:14 UTC 2012


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.
---
 src/conf/domain_conf.c   | 37 +++++++++++++++++++++++--------------
 src/conf/domain_conf.h   |  2 ++
 src/libvirt_private.syms |  1 +
 src/qemu/qemu_driver.c   | 14 ++------------
 4 files changed, 28 insertions(+), 26 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index ed21f0f..be76c06 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 091879e..c3e8c16 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 5a07139..756d7bd 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 039cbf3..f5bbc52 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -12190,23 +12190,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;
     }
-- 
1.7.11.7




More information about the libvir-list mailing list