[libvirt] [PATCH] qemu: Make sure BeginJob is always followed by EndJob

Jiri Denemark jdenemar at redhat.com
Thu Oct 13 12:58:00 UTC 2011


Otherwise we can end up with a dangling job that can only be cleared by
restarting libvirtd.
---
 src/qemu/qemu_driver.c |   24 ++++++++++++------------
 1 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 0e307e1..98f4d7f 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -2010,42 +2010,42 @@ static int qemuDomainSendKey(virDomainPtr domain,
     if (!vm) {
         char uuidstr[VIR_UUID_STRING_BUFLEN];
         virUUIDFormat(domain->uuid, uuidstr);
         qemuReportError(VIR_ERR_NO_DOMAIN,
                         _("no domain with matching uuid '%s'"), uuidstr);
         goto cleanup;
     }
 
     priv = vm->privateData;
 
     if (qemuDomainObjBeginJobWithDriver(driver, vm, QEMU_JOB_MODIFY) < 0)
         goto cleanup;
 
     if (!virDomainObjIsActive(vm)) {
         qemuReportError(VIR_ERR_OPERATION_INVALID,
                         "%s", _("domain is not running"));
-        goto cleanup;
+        goto endjob;
     }
 
     qemuDomainObjEnterMonitorWithDriver(driver, vm);
     ret = qemuMonitorSendKey(priv->mon, holdtime, keycodes, nkeycodes);
     qemuDomainObjExitMonitorWithDriver(driver, vm);
-    if (qemuDomainObjEndJob(driver, vm) == 0) {
+
+endjob:
+    if (qemuDomainObjEndJob(driver, vm) == 0)
         vm = NULL;
-        goto cleanup;
-    }
 
 cleanup:
     if (vm)
         virDomainObjUnlock(vm);
     qemuDriverUnlock(driver);
     return ret;
 }
 
 static int qemudDomainGetInfo(virDomainPtr dom,
                               virDomainInfoPtr info)
 {
     struct qemud_driver *driver = dom->conn->privateData;
     virDomainObjPtr vm;
     int ret = -1;
     int err;
     unsigned long balloon;
@@ -7208,103 +7208,103 @@ qemudDomainBlockStatsFlags (virDomainPtr dom,
                                        &errs);
 
     qemuDomainObjExitMonitor(driver, vm);
 
     if (ret < 0)
         goto endjob;
 
     /* Field 'errs' is meaningless for QEMU, won't set it. */
     for (i = 0; i < *nparams; i++) {
         virTypedParameterPtr param = &params[i];
 
         switch (i) {
         case 0: /* fill write_bytes here */
             if (virStrcpyStatic(param->field, VIR_DOMAIN_BLOCK_STATS_WRITE_BYTES) == NULL) {
                 qemuReportError(VIR_ERR_INTERNAL_ERROR,
                                 "%s", _("Field write bytes too long for destination"));
-                goto cleanup;
+                goto endjob;
             }
             param->type = VIR_TYPED_PARAM_LLONG;
             param->value.l = wr_bytes;
             break;
 
         case 1: /* fill wr_operations here */
             if (virStrcpyStatic(param->field, VIR_DOMAIN_BLOCK_STATS_WRITE_REQ) == NULL) {
                 qemuReportError(VIR_ERR_INTERNAL_ERROR,
                                 "%s", _("Field write requests too long for destination"));
-                goto cleanup;
+                goto endjob;
             }
             param->type = VIR_TYPED_PARAM_LLONG;
             param->value.l = wr_req;
             break;
 
         case 2: /* fill read_bytes here */
             if (virStrcpyStatic(param->field, VIR_DOMAIN_BLOCK_STATS_READ_BYTES) == NULL) {
                 qemuReportError(VIR_ERR_INTERNAL_ERROR,
                                 "%s", _("Field read bytes too long for destination"));
-                goto cleanup;
+                goto endjob;
             }
             param->type = VIR_TYPED_PARAM_LLONG;
             param->value.l = rd_bytes;
             break;
 
         case 3: /* fill rd_operations here */
             if (virStrcpyStatic(param->field, VIR_DOMAIN_BLOCK_STATS_READ_REQ) == NULL) {
                 qemuReportError(VIR_ERR_INTERNAL_ERROR,
                                 "%s", _("Field read requests too long for destination"));
-                goto cleanup;
+                goto endjob;
             }
             param->type = VIR_TYPED_PARAM_LLONG;
             param->value.l = rd_req;
             break;
 
         case 4: /* fill flush_operations here */
             if (virStrcpyStatic(param->field, VIR_DOMAIN_BLOCK_STATS_FLUSH_REQ) == NULL) {
                 qemuReportError(VIR_ERR_INTERNAL_ERROR,
                                 "%s", _("Field flush requests too long for destination"));
-                goto cleanup;
+                goto endjob;
             }
             param->type = VIR_TYPED_PARAM_LLONG;
             param->value.l = flush_req;
             break;
 
         case 5: /* fill wr_total_times_ns here */
             if (virStrcpyStatic(param->field, VIR_DOMAIN_BLOCK_STATS_WRITE_TOTAL_TIMES) == NULL) {
                 qemuReportError(VIR_ERR_INTERNAL_ERROR,
                                 "%s", _("Field write total times too long for destination"));
-                goto cleanup;
+                goto endjob;
             }
             param->type = VIR_TYPED_PARAM_LLONG;
             param->value.l = wr_total_times;
             break;
 
         case 6: /* fill rd_total_times_ns here */
             if (virStrcpyStatic(param->field, VIR_DOMAIN_BLOCK_STATS_READ_TOTAL_TIMES) == NULL) {
                 qemuReportError(VIR_ERR_INTERNAL_ERROR,
                                 "%s", _("Field read total times too long for destination"));
-                goto cleanup;
+                goto endjob;
             }
             param->type = VIR_TYPED_PARAM_LLONG;
             param->value.l = rd_total_times;
             break;
 
         case 7: /* fill flush_total_times_ns here */
             if (virStrcpyStatic(param->field, VIR_DOMAIN_BLOCK_STATS_READ_TOTAL_TIMES) == NULL) {
                 qemuReportError(VIR_ERR_INTERNAL_ERROR,
                                 "%s", _("Field flush total times too long for destination"));
-                goto cleanup;
+                goto endjob;
             }
             param->type = VIR_TYPED_PARAM_LLONG;
             param->value.l = flush_total_times;
             break;
 
         default:
             break;
             /* should not hit here */
         }
     }
 
 endjob:
     if (qemuDomainObjEndJob(driver, vm) == 0)
         vm = NULL;
 
 cleanup:
-- 
1.7.7




More information about the libvir-list mailing list