[libvirt] [PATCH 2/3] qemu: unlock qemu driver and vm before returning from processWatchdogEvent()

Wen Congyang wency at cn.fujitsu.com
Wed Apr 6 07:57:33 UTC 2011


When the function processWatchdogEvent() failed, we only free wdEvent, but
forget to unlock qemu driver and vm, free dumpfile.

---
 src/qemu/qemu_driver.c |   28 +++++++++++++++++++---------
 1 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index dd84f65..628cfe3 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -2400,19 +2400,22 @@ static void processWatchdogEvent(void *data, void *opaque)
                             wdEvent->vm->def->name,
                             (unsigned int)time(NULL)) < 0) {
                 virReportOOMError();
-                break;
+                goto cleanup;
             }
 
             qemuDriverLock(driver);
             virDomainObjLock(wdEvent->vm);
 
-            if (qemuDomainObjBeginJobWithDriver(driver, wdEvent->vm) < 0)
-                break;
+            if (qemuDomainObjBeginJobWithDriver(driver, wdEvent->vm) < 0) {
+                VIR_FREE(dumpfile);
+                goto unlock;
+            }
 
             if (!virDomainObjIsActive(wdEvent->vm)) {
                 qemuReportError(VIR_ERR_OPERATION_INVALID,
                                 "%s", _("domain is not running"));
-                break;
+                VIR_FREE(dumpfile);
+                goto endjob;
             }
 
             ret = doCoreDump(driver,
@@ -2429,16 +2432,23 @@ static void processWatchdogEvent(void *data, void *opaque)
                 qemuReportError(VIR_ERR_OPERATION_FAILED,
                                 "%s", _("Resuming after dump failed"));
 
-            if (qemuDomainObjEndJob(wdEvent->vm) > 0)
-                virDomainObjUnlock(wdEvent->vm);
-
-            qemuDriverUnlock(driver);
-
             VIR_FREE(dumpfile);
         }
         break;
+    default:
+        goto cleanup;
     }
 
+endjob:
+    if (qemuDomainObjEndJob(wdEvent->vm) == 0)
+        wdEvent->vm = NULL;
+
+unlock:
+    if (wdEvent->vm)
+        virDomainObjUnlock(wdEvent->vm);
+    qemuDriverUnlock(driver);
+
+cleanup:
     VIR_FREE(wdEvent);
 }
 
-- 
1.7.1




More information about the libvir-list mailing list