6d3351
From 1cf501e2f4cb1e6840ddb8a8f7b051936f0f8b18 Mon Sep 17 00:00:00 2001
6d3351
Message-Id: <1cf501e2f4cb1e6840ddb8a8f7b051936f0f8b18@dist-git>
6d3351
From: Peter Krempa <pkrempa@redhat.com>
6d3351
Date: Thu, 20 Apr 2017 11:33:10 +0200
6d3351
Subject: [PATCH] qemu: hotplug: Don't save status XML when monitor is closed
6d3351
6d3351
In the vcpu hotplug code if exit from the monitor failed we would still
6d3351
attempt to save the status XML. When the daemon is terminated the
6d3351
monitor socket is closed. In such case, the written status XML would not
6d3351
contain the monitor path and thus be invalid.
6d3351
6d3351
Avoid this issue by only saving status XML on success of the monitor
6d3351
command.
6d3351
6d3351
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1439452
6d3351
(cherry picked from commit 355f5ab998994d40e011cec491483506bbefe04f)
6d3351
---
6d3351
 src/qemu/qemu_hotplug.c | 29 ++++++++++++++++-------------
6d3351
 1 file changed, 16 insertions(+), 13 deletions(-)
6d3351
6d3351
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
6d3351
index 79d0dc94e..120bcdc62 100644
6d3351
--- a/src/qemu/qemu_hotplug.c
6d3351
+++ b/src/qemu/qemu_hotplug.c
6d3351
@@ -5386,6 +5386,7 @@ qemuDomainRemoveVcpuAlias(virQEMUDriverPtr driver,
6d3351
 
6d3351
 static int
6d3351
 qemuDomainHotplugDelVcpu(virQEMUDriverPtr driver,
6d3351
+                         virQEMUDriverConfigPtr cfg,
6d3351
                          virDomainObjPtr vm,
6d3351
                          unsigned int vcpu)
6d3351
 {
6d3351
@@ -5427,6 +5428,11 @@ qemuDomainHotplugDelVcpu(virQEMUDriverPtr driver,
6d3351
     if (qemuDomainRemoveVcpu(driver, vm, vcpu) < 0)
6d3351
         goto cleanup;
6d3351
 
6d3351
+    qemuDomainVcpuPersistOrder(vm->def);
6d3351
+
6d3351
+    if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0)
6d3351
+        goto cleanup;
6d3351
+
6d3351
     ret = 0;
6d3351
 
6d3351
  cleanup:
6d3351
@@ -5437,6 +5443,7 @@ qemuDomainHotplugDelVcpu(virQEMUDriverPtr driver,
6d3351
 
6d3351
 static int
6d3351
 qemuDomainHotplugAddVcpu(virQEMUDriverPtr driver,
6d3351
+                         virQEMUDriverConfigPtr cfg,
6d3351
                          virDomainObjPtr vm,
6d3351
                          unsigned int vcpu)
6d3351
 {
6d3351
@@ -5497,6 +5504,11 @@ qemuDomainHotplugAddVcpu(virQEMUDriverPtr driver,
6d3351
     if (qemuDomainValidateVcpuInfo(vm) < 0)
6d3351
         goto cleanup;
6d3351
 
6d3351
+    qemuDomainVcpuPersistOrder(vm->def);
6d3351
+
6d3351
+    if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0)
6d3351
+        goto cleanup;
6d3351
+
6d3351
     ret = 0;
6d3351
 
6d3351
  cleanup:
6d3351
@@ -5611,7 +5623,6 @@ qemuDomainSetVcpusLive(virQEMUDriverPtr driver,
6d3351
     qemuDomainObjPrivatePtr priv = vm->privateData;
6d3351
     qemuCgroupEmulatorAllNodesDataPtr emulatorCgroup = NULL;
6d3351
     ssize_t nextvcpu = -1;
6d3351
-    int rc = 0;
6d3351
     int ret = -1;
6d3351
 
6d3351
     if (qemuCgroupEmulatorAllNodesAllow(priv->cgroup, &emulatorCgroup) < 0)
6d3351
@@ -5619,27 +5630,19 @@ qemuDomainSetVcpusLive(virQEMUDriverPtr driver,
6d3351
 
6d3351
     if (enable) {
6d3351
         while ((nextvcpu = virBitmapNextSetBit(vcpumap, nextvcpu)) != -1) {
6d3351
-            if ((rc = qemuDomainHotplugAddVcpu(driver, vm, nextvcpu)) < 0)
6d3351
-                break;
6d3351
+            if (qemuDomainHotplugAddVcpu(driver, cfg, vm, nextvcpu) < 0)
6d3351
+                goto cleanup;
6d3351
         }
6d3351
     } else {
6d3351
         for (nextvcpu = virDomainDefGetVcpusMax(vm->def) - 1; nextvcpu >= 0; nextvcpu--) {
6d3351
             if (!virBitmapIsBitSet(vcpumap, nextvcpu))
6d3351
                 continue;
6d3351
 
6d3351
-            if ((rc = qemuDomainHotplugDelVcpu(driver, vm, nextvcpu)) < 0)
6d3351
-                break;
6d3351
+            if (qemuDomainHotplugDelVcpu(driver, cfg, vm, nextvcpu) < 0)
6d3351
+                goto cleanup;
6d3351
         }
6d3351
     }
6d3351
 
6d3351
-    qemuDomainVcpuPersistOrder(vm->def);
6d3351
-
6d3351
-    if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0)
6d3351
-        goto cleanup;
6d3351
-
6d3351
-    if (rc < 0)
6d3351
-        goto cleanup;
6d3351
-
6d3351
     ret = 0;
6d3351
 
6d3351
  cleanup:
6d3351
-- 
6d3351
2.12.2
6d3351