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 = ¶ms[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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list