Blob Blame History Raw
From 83f771b2e5a114d84af3519125408a2da9579391 Mon Sep 17 00:00:00 2001
Message-Id: <83f771b2e5a114d84af3519125408a2da9579391@dist-git>
From: Jiri Denemark <jdenemar@redhat.com>
Date: Fri, 8 Jul 2016 16:44:02 +0200
Subject: [PATCH] qemu: Copy complete domain def in qemuDomainDefFormatBuf

Playing directly with our live definition, updating it, and reverting it
back once we are done is very nice and it's quite dangerous too. Let's
just make a copy of the domain definition if needed and do all tricks on
the copy.

https://bugzilla.redhat.com/show_bug.cgi?id=1320470

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
(cherry picked from commit b1305a6b8fcb807296a00458c5495ef321553cd0)
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
---
 src/conf/domain_conf.c | 10 ++++++----
 src/qemu/qemu_domain.c | 44 ++++++++++++++++++++++++--------------------
 2 files changed, 30 insertions(+), 24 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 78e394d..bb297f6 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -21032,10 +21032,12 @@ virDomainChrSourceDefFormat(virBufferPtr buf,
         break;
 
     case VIR_DOMAIN_CHR_TYPE_UNIX:
-        virBufferAsprintf(buf, "<source mode='%s'",
-                          def->data.nix.listen ? "bind" : "connect");
-        virBufferEscapeString(buf, " path='%s'", def->data.nix.path);
-        virDomainSourceDefFormatSeclabel(buf, nseclabels, seclabels, flags);
+        if (def->data.nix.path) {
+            virBufferAsprintf(buf, "<source mode='%s'",
+                              def->data.nix.listen ? "bind" : "connect");
+            virBufferEscapeString(buf, " path='%s'", def->data.nix.path);
+            virDomainSourceDefFormatSeclabel(buf, nseclabels, seclabels, flags);
+        }
         break;
 
     case VIR_DOMAIN_CHR_TYPE_SPICEPORT:
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 2a42b1b..e81e63f 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -3061,19 +3061,25 @@ qemuDomainDefFormatBuf(virQEMUDriverPtr driver,
                        virBuffer *buf)
 {
     int ret = -1;
-    virCPUDefPtr cpu = NULL;
-    virCPUDefPtr def_cpu = def->cpu;
-    virDomainControllerDefPtr *controllers = NULL;
-    int ncontrollers = 0;
+    virDomainDefPtr copy = NULL;
     virCapsPtr caps = NULL;
 
     if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
         goto cleanup;
 
+    if (!(flags & (VIR_DOMAIN_XML_UPDATE_CPU | VIR_DOMAIN_XML_MIGRATABLE)))
+        goto format;
+
+    if (!(copy = virDomainDefCopy(def, caps, driver->xmlopt,
+                                  flags & VIR_DOMAIN_XML_MIGRATABLE)))
+        goto cleanup;
+
+    def = copy;
+
     /* Update guest CPU requirements according to host CPU */
     if ((flags & VIR_DOMAIN_XML_UPDATE_CPU) &&
-        def_cpu &&
-        (def_cpu->mode != VIR_CPU_MODE_CUSTOM || def_cpu->model)) {
+        def->cpu &&
+        (def->cpu->mode != VIR_CPU_MODE_CUSTOM || def->cpu->model)) {
         if (!caps->host.cpu ||
             !caps->host.cpu->model) {
             virReportError(VIR_ERR_OPERATION_FAILED,
@@ -3081,10 +3087,8 @@ qemuDomainDefFormatBuf(virQEMUDriverPtr driver,
             goto cleanup;
         }
 
-        if (!(cpu = virCPUDefCopy(def_cpu)) ||
-            cpuUpdate(cpu, caps->host.cpu) < 0)
+        if (cpuUpdate(def->cpu, caps->host.cpu) < 0)
             goto cleanup;
-        def->cpu = cpu;
     }
 
     if ((flags & VIR_DOMAIN_XML_MIGRATABLE)) {
@@ -3141,10 +3145,11 @@ qemuDomainDefFormatBuf(virQEMUDriverPtr driver,
         }
 
         if (toremove) {
-            controllers = def->controllers;
-            ncontrollers = def->ncontrollers;
+            virDomainControllerDefPtr *controllers = def->controllers;
+            int ncontrollers = def->ncontrollers;
+
             if (VIR_ALLOC_N(def->controllers, ncontrollers - toremove) < 0) {
-                controllers = NULL;
+                def->controllers = controllers;
                 goto cleanup;
             }
 
@@ -3153,23 +3158,22 @@ qemuDomainDefFormatBuf(virQEMUDriverPtr driver,
                 if (controllers[i] != usb && controllers[i] != pci)
                     def->controllers[def->ncontrollers++] = controllers[i];
             }
+
+            VIR_FREE(controllers);
+            virDomainControllerDefFree(pci);
+            virDomainControllerDefFree(usb);
         }
 
 
     }
 
-    ret = virDomainDefFormatInternal(def, driver->caps,
+ format:
+    ret = virDomainDefFormatInternal(def, caps,
                                      virDomainDefFormatConvertXMLFlags(flags),
                                      buf);
 
  cleanup:
-    def->cpu = def_cpu;
-    virCPUDefFree(cpu);
-    if (controllers) {
-        VIR_FREE(def->controllers);
-        def->controllers = controllers;
-        def->ncontrollers = ncontrollers;
-    }
+    virDomainDefFree(copy);
     virObjectUnref(caps);
     return ret;
 }
-- 
2.9.2