]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Copy complete domain def in qemuDomainDefFormatBuf
authorJiri Denemark <jdenemar@redhat.com>
Fri, 8 Jul 2016 14:44:02 +0000 (16:44 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Mon, 18 Jul 2016 07:05:12 +0000 (09:05 +0200)
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>
src/conf/domain_conf.c
src/qemu/qemu_domain.c

index 1fd826dd859a57ac531ee60ac42c02db09682278..13a059e21ddad236944bb166b292d8c39bbc962b 100644 (file)
@@ -21149,10 +21149,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:
index 286f096952189330d2eab2131ede25874b7bd5de..26ce12474b04b87bd7c5629e28c41ddf0b1d0a0a 100644 (file)
@@ -3167,19 +3167,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,
@@ -3187,10 +3193,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)) {
@@ -3247,10 +3251,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;
             }
 
@@ -3259,23 +3264,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;
 }