]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: allow restore with non-migratable XML input
authorJán Tomko <jtomko@redhat.com>
Tue, 11 Jun 2013 13:03:17 +0000 (15:03 +0200)
committerCole Robinson <crobinso@redhat.com>
Thu, 11 Jul 2013 21:47:39 +0000 (17:47 -0400)
Convert input XML to migratable before using it in
qemuDomainSaveImageOpen.

XML in the save image is migratable, i.e. doesn't contain implicit
controllers. If these controllers were in a non-default order in the
input XML, the ABI check would fail. Removing and re-adding these
controllers fixes it.

https://bugzilla.redhat.com/show_bug.cgi?id=834196
(cherry picked from commit 07966f6a8b5ccb5bb4c716b25deb8ba2e572cc67)

src/qemu/qemu_domain.c
src/qemu/qemu_domain.h
src/qemu/qemu_driver.c

index 7bde0e41873ff3056a66a012f4a846811e6bb2b0..e5fc29b708abcaba1160067f8628b39263c3271c 100644 (file)
@@ -1267,6 +1267,35 @@ void qemuDomainObjExitRemote(virDomainObjPtr obj)
 }
 
 
+virDomainDefPtr
+qemuDomainDefCopy(virQEMUDriverPtr driver,
+                  virDomainDefPtr src,
+                  unsigned int flags)
+{
+    virBuffer buf = VIR_BUFFER_INITIALIZER;
+    virDomainDefPtr ret = NULL;
+    virCapsPtr caps = NULL;
+    const char *xml = NULL;
+
+    if (qemuDomainDefFormatBuf(driver, src, flags, &buf) < 0)
+        goto cleanup;
+
+    xml = virBufferContentAndReset(&buf);
+
+    if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
+        goto cleanup;
+
+    if (!(ret = virDomainDefParseString(xml, caps, driver->xmlopt,
+                                        QEMU_EXPECTED_VIRT_TYPES,
+                                        VIR_DOMAIN_XML_INACTIVE)))
+        goto cleanup;
+
+cleanup:
+    VIR_FREE(xml);
+    virObjectUnref(caps);
+    return ret;
+}
+
 int
 qemuDomainDefFormatBuf(virQEMUDriverPtr driver,
                        virDomainDefPtr def,
index 042e57d9a63f4c03f3a41f501556023596a614f2..d0ae6494068e591c7acf7ed21ab96d1a89cde0b0 100644 (file)
@@ -241,6 +241,10 @@ void qemuDomainObjEnterRemote(virDomainObjPtr obj)
 void qemuDomainObjExitRemote(virDomainObjPtr obj)
     ATTRIBUTE_NONNULL(1);
 
+virDomainDefPtr qemuDomainDefCopy(virQEMUDriverPtr driver,
+                                  virDomainDefPtr src,
+                                  unsigned int flags);
+
 int qemuDomainDefFormatBuf(virQEMUDriverPtr driver,
                            virDomainDefPtr vm,
                            unsigned int flags,
index cb24e2b8bfdf8ce48fa5462ab90976d1ec393f5d..53ad478c8a12a54faf7fc5f7661328cc84a91a0d 100644 (file)
@@ -4688,17 +4688,24 @@ qemuDomainSaveImageOpen(virQEMUDriverPtr driver,
         goto error;
     if (xmlin) {
         virDomainDefPtr def2 = NULL;
+        virDomainDefPtr newdef = NULL;
 
         if (!(def2 = virDomainDefParseString(xmlin, caps, driver->xmlopt,
                                              QEMU_EXPECTED_VIRT_TYPES,
                                              VIR_DOMAIN_XML_INACTIVE)))
             goto error;
-        if (!virDomainDefCheckABIStability(def, def2)) {
-            virDomainDefFree(def2);
+
+        newdef = qemuDomainDefCopy(driver, def2, VIR_DOMAIN_XML_MIGRATABLE);
+        virDomainDefFree(def2);
+        if (!newdef)
+            goto error;
+
+        if (!virDomainDefCheckABIStability(def, newdef)) {
+            virDomainDefFree(newdef);
             goto error;
         }
         virDomainDefFree(def);
-        def = def2;
+        def = newdef;
     }
 
     VIR_FREE(xml);