[libvirt] [PATCH 09/11] Fix vm usage after ExitMonitor in qemu driver

Ján Tomko jtomko at redhat.com
Tue Dec 16 16:41:33 UTC 2014


---
 src/qemu/qemu_driver.c | 28 +++++++++++++++++++++-------
 1 file changed, 21 insertions(+), 7 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 20b54cc..035a51d 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -2360,7 +2360,8 @@ static int qemuDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem,
             priv = vm->privateData;
             qemuDomainObjEnterMonitor(driver, vm);
             r = qemuMonitorSetBalloon(priv->mon, newmem);
-            qemuDomainObjExitMonitor(driver, vm);
+            if (qemuDomainObjExitMonitorAlive(driver, vm) < 0)
+                goto endjob;
             virDomainAuditMemory(vm, vm->def->mem.cur_balloon, newmem, "update",
                                  r == 1);
             if (r < 0)
@@ -2444,7 +2445,8 @@ static int qemuDomainSetMemoryStatsPeriod(virDomainPtr dom, int period,
 
         qemuDomainObjEnterMonitor(driver, vm);
         r = qemuMonitorSetMemoryStatsPeriod(priv->mon, period);
-        qemuDomainObjExitMonitor(driver, vm);
+        if (qemuDomainObjExitMonitorAlive(driver, vm) < 0)
+            goto endjob;
         if (r < 0) {
             virReportError(VIR_ERR_OPERATION_INVALID, "%s",
                            _("unable to set balloon driver collection period"));
@@ -4289,6 +4291,11 @@ processNicRxFilterChangedEvent(virQEMUDriverPtr driver,
     if (ret < 0)
         goto endjob;
 
+    if (!virDomainObjIsActive(vm)) {
+        VIR_WARN("Domain crashed");
+        goto endjob;
+    }
+
     if (virDomainNetGetActualType(def) == VIR_DOMAIN_NET_TYPE_DIRECT) {
 
         if (virNetDevGetRxFilter(def->ifname, &hostFilter)) {
@@ -10293,11 +10300,11 @@ qemuDomainBlockStatsFlags(virDomainPtr dom,
     int idx;
     int tmp, ret = -1;
     virDomainObjPtr vm;
-    virDomainDiskDefPtr disk = NULL;
     qemuDomainObjPrivatePtr priv;
     long long rd_req, rd_bytes, wr_req, wr_bytes, rd_total_times;
     long long wr_total_times, flush_req, flush_total_times, errs;
     virTypedParameterPtr param;
+    char *diskAlias = NULL;
 
     virCheckFlags(VIR_TYPED_PARAM_STRING_OKAY, -1);
 
@@ -10326,6 +10333,7 @@ qemuDomainBlockStatsFlags(virDomainPtr dom,
     }
 
     if (*nparams != 0) {
+        virDomainDiskDefPtr disk = NULL;
         if ((idx = virDomainDiskIndexByName(vm->def, path, false)) < 0) {
             virReportError(VIR_ERR_INVALID_ARG,
                            _("invalid path: %s"), path);
@@ -10339,6 +10347,8 @@ qemuDomainBlockStatsFlags(virDomainPtr dom,
                             disk->dst);
              goto endjob;
         }
+        if (VIR_STRDUP(diskAlias, disk->info.alias) < 0)
+            goto endjob;
     }
 
     priv = vm->privateData;
@@ -10354,7 +10364,7 @@ qemuDomainBlockStatsFlags(virDomainPtr dom,
     }
 
     ret = qemuMonitorGetBlockStatsInfo(priv->mon,
-                                       disk->info.alias,
+                                       diskAlias,
                                        &rd_req,
                                        &rd_bytes,
                                        &rd_total_times,
@@ -10453,6 +10463,7 @@ qemuDomainBlockStatsFlags(virDomainPtr dom,
  cleanup:
     if (vm)
         virObjectUnlock(vm);
+    VIR_FREE(diskAlias);
     return ret;
 }
 
@@ -16973,7 +16984,8 @@ qemuDomainSetBlockIoTune(virDomainPtr dom,
         qemuDomainObjEnterMonitor(driver, vm);
         ret = qemuMonitorSetBlockIoThrottle(priv->mon, device,
                                             &info, supportMaxOptions);
-        qemuDomainObjExitMonitor(driver, vm);
+        if (qemuDomainObjExitMonitorAlive(driver, vm) < 0)
+            goto endjob;
         if (ret < 0)
             goto endjob;
         vm->def->disks[idx]->blkdeviotune = info;
@@ -17270,7 +17282,8 @@ qemuDomainGetDiskErrors(virDomainPtr dom,
 
     qemuDomainObjEnterMonitor(driver, vm);
     table = qemuMonitorGetBlockInfo(priv->mon);
-    qemuDomainObjExitMonitor(driver, vm);
+    if (qemuDomainObjExitMonitorAlive(driver, vm) < 0)
+        goto endjob;
     if (!table)
         goto endjob;
 
@@ -18539,7 +18552,8 @@ qemuDomainGetStatsBlock(virQEMUDriverPtr driver,
         qemuDomainObjEnterMonitor(driver, dom);
         rc = qemuMonitorGetAllBlockStatsInfo(priv->mon, &stats);
         ignore_value(qemuMonitorBlockStatsUpdateCapacity(priv->mon, stats));
-        qemuDomainObjExitMonitor(driver, dom);
+        if (qemuDomainObjExitMonitorAlive(driver, dom) < 0)
+            goto cleanup;
 
         if (rc < 0) {
             virResetLastError();
-- 
2.0.4




More information about the libvir-list mailing list