[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] [PATCH 08/10] Consolidate "cont" into qemudMonitorSendCont()



The interface allows qemudMonitorSendCont() to report errors that are
not overridden by its callers.

Also fix a potential infinite loop in qemuDomainCoreDump() if sending
cont repeatedly fails.

Changes since the fourth submission:
- Replace the "error_reported" parameter by using virGetLastError() in
  callers

* src/qemu_driver.c (qemudMonitorSendCont): New function.
  (qemudAutostartConfigs): Reset error before each call to
  qemudStartVMDaemon().
  (qemudInitCpus, qemudDomainResume, qemudDomainCoreDump,
  qemudDomainRestore, qemudDomainMigratePerform,
  qemudDomainMigrateFinish2): Use qemudMonitorSendCont().
---
 src/qemu_driver.c |   79 +++++++++++++++++++++++++++-------------------------
 1 files changed, 41 insertions(+), 38 deletions(-)

diff --git a/src/qemu_driver.c b/src/qemu_driver.c
index 2a8e6d1..d8a98c0 100644
--- a/src/qemu_driver.c
+++ b/src/qemu_driver.c
@@ -28,6 +28,7 @@
 #include <dirent.h>
 #include <limits.h>
 #include <string.h>
+#include <stdbool.h>
 #include <stdio.h>
 #include <strings.h>
 #include <stdarg.h>
@@ -132,6 +133,8 @@ static int qemudMonitorCommandExtra(const virDomainObjPtr vm,
                                     const char *extraPrompt,
                                     int scm_fd,
                                     char **reply);
+static int qemudMonitorSendCont(virConnectPtr conn,
+                                const virDomainObjPtr vm);
 static int qemudDomainSetMemoryBalloon(virConnectPtr conn,
                                        virDomainObjPtr vm,
                                        unsigned long newmem);
@@ -247,7 +250,10 @@ qemudAutostartConfigs(struct qemud_driver *driver) {
         virDomainObjLock(vm);
         if (vm->autostart &&
             !virDomainIsActive(vm)) {
-            int ret = qemudStartVMDaemon(conn, driver, vm, NULL, -1);
+            int ret;
+
+            virResetLastError();
+            ret = qemudStartVMDaemon(conn, driver, vm, NULL, -1);
             if (ret < 0) {
                 virErrorPtr err = virGetLastError();
                 VIR_ERROR(_("Failed to autostart VM '%s': %s\n"),
@@ -1308,7 +1314,6 @@ static int
 qemudInitCpus(virConnectPtr conn,
               virDomainObjPtr vm,
               const char *migrateFrom) {
-    char *info = NULL;
 #if HAVE_SCHED_GETAFFINITY
     cpu_set_t mask;
     int i, maxcpu = QEMUD_CPUMASK_LEN;
@@ -1344,12 +1349,12 @@ qemudInitCpus(virConnectPtr conn,
 
     if (migrateFrom == NULL) {
         /* Allow the CPUS to start executing */
-        if (qemudMonitorCommand(vm, "cont", &info) < 0) {
-            qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
-                             "%s", _("resume operation failed"));
+        if (qemudMonitorSendCont(conn, vm) < 0) {
+            if (virGetLastError() == NULL)
+                qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
+                                 "%s", _("resume operation failed"));
             return -1;
         }
-        VIR_FREE(info);
     }
 
     return 0;
@@ -2651,6 +2656,18 @@ qemudMonitorCommand(const virDomainObjPtr vm,
     return qemudMonitorCommandWithFd(vm, cmd, -1, reply);
 }
 
+static int
+qemudMonitorSendCont(virConnectPtr conn ATTRIBUTE_UNUSED,
+                     const virDomainObjPtr vm) {
+    char *reply;
+
+    if (qemudMonitorCommand(vm, "cont", &reply) < 0)
+        return -1;
+    qemudDebug ("%s: cont reply: %s", vm->def->name, info);
+    VIR_FREE(reply);
+    return 0;
+}
+
 static virDrvOpenStatus qemudOpen(virConnectPtr conn,
                                   virConnectAuthPtr auth ATTRIBUTE_UNUSED,
                                   int flags ATTRIBUTE_UNUSED) {
@@ -3135,7 +3152,6 @@ cleanup:
 
 static int qemudDomainResume(virDomainPtr dom) {
     struct qemud_driver *driver = dom->conn->privateData;
-    char *info;
     virDomainObjPtr vm;
     int ret = -1;
     virDomainEventPtr event = NULL;
@@ -3156,17 +3172,16 @@ static int qemudDomainResume(virDomainPtr dom) {
         goto cleanup;
     }
     if (vm->state == VIR_DOMAIN_PAUSED) {
-        if (qemudMonitorCommand(vm, "cont", &info) < 0) {
-            qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
-                             "%s", _("resume operation failed"));
+        if (qemudMonitorSendCont(dom->conn, vm) < 0) {
+            if (virGetLastError() == NULL)
+                qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
+                                 "%s", _("resume operation failed"));
             goto cleanup;
         }
         vm->state = VIR_DOMAIN_RUNNING;
-        qemudDebug("Reply %s", info);
         event = virDomainEventNewFromObj(vm,
                                          VIR_DOMAIN_EVENT_RESUMED,
                                          VIR_DOMAIN_EVENT_RESUMED_UNPAUSED);
-        VIR_FREE(info);
     }
     if (virDomainSaveStatus(dom->conn, driver->stateDir, vm) < 0)
         goto cleanup;
@@ -3906,13 +3921,11 @@ cleanup:
        will support synchronous operations so we always get here after
        the migration is complete.  */
     if (resume && paused) {
-        if (qemudMonitorCommand(vm, "cont", &info) < 0) {
-            qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
-                             "%s", _("resuming after dump failed"));
-            goto cleanup;
+        if (qemudMonitorSendCont(dom->conn, vm) < 0) {
+            if (virGetLastError() == NULL)
+                qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
+                                 "%s", _("resuming after dump failed"));
         }
-        DEBUG ("%s: cont reply: %s", vm->def->name, info);
-        VIR_FREE(info);
     }
     if (vm)
         virDomainObjUnlock(vm);
@@ -4428,13 +4441,12 @@ static int qemudDomainRestore(virConnectPtr conn,
 
     /* If it was running before, resume it now. */
     if (header.was_running) {
-        char *info;
-        if (qemudMonitorCommand(vm, "cont", &info) < 0) {
-            qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
-                             "%s", _("failed to resume domain"));
+        if (qemudMonitorSendCont(conn, vm) < 0) {
+            if (virGetLastError() == NULL)
+                qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
+                                 "%s", _("failed to resume domain"));
             goto cleanup;
         }
-        VIR_FREE(info);
         vm->state = VIR_DOMAIN_RUNNING;
         virDomainSaveStatus(conn, driver->stateDir, vm);
     }
@@ -7144,14 +7156,9 @@ qemudDomainMigratePerform (virDomainPtr dom,
     ret = 0;
 
 cleanup:
-    /* Note that we have to free info *first*, since we are re-using the
-     * variable below (and otherwise might cause a memory leak)
-     */
-    VIR_FREE(info);
-
     if (paused) {
         /* we got here through some sort of failure; start the domain again */
-        if (qemudMonitorCommand (vm, "cont", &info) < 0) {
+        if (qemudMonitorSendCont(dom->conn, vm) < 0) {
             /* Hm, we already know we are in error here.  We don't want to
              * overwrite the previous error, though, so we just throw something
              * to the logs and hope for the best
@@ -7159,16 +7166,13 @@ cleanup:
             VIR_ERROR(_("Failed to resume guest %s after failure\n"),
                       vm->def->name);
         }
-        else {
-            DEBUG ("%s: cont reply: %s", vm->def->name, info);
-            VIR_FREE(info);
-        }
 
         event = virDomainEventNewFromObj(vm,
                                          VIR_DOMAIN_EVENT_RESUMED,
                                          VIR_DOMAIN_EVENT_RESUMED_MIGRATED);
     }
 
+    VIR_FREE(info);
     if (vm)
         virDomainObjUnlock(vm);
     if (event)
@@ -7191,7 +7195,6 @@ qemudDomainMigrateFinish2 (virConnectPtr dconn,
     virDomainObjPtr vm;
     virDomainPtr dom = NULL;
     virDomainEventPtr event = NULL;
-    char *info = NULL;
 
     qemuDriverLock(driver);
     vm = virDomainFindByName(&driver->domains, dname);
@@ -7211,12 +7214,12 @@ qemudDomainMigrateFinish2 (virConnectPtr dconn,
          * >= 0.10.6 to work properly.  This isn't strictly necessary on
          * older qemu's, but it also doesn't hurt anything there
          */
-        if (qemudMonitorCommand(vm, "cont", &info) < 0) {
-            qemudReportError(dconn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
-                             "%s", _("resume operation failed"));
+        if (qemudMonitorSendCont(dconn, vm) < 0) {
+            if (virGetLastError() == NULL)
+                qemudReportError(dconn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
+                                 "%s", _("resume operation failed"));
             goto cleanup;
         }
-        VIR_FREE(info);
 
         vm->state = VIR_DOMAIN_RUNNING;
         event = virDomainEventNewFromObj(vm,
-- 
1.6.2.5


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]