[libvirt] [PATCH v2] qemu: return -1 on error paths in qemuDomainSaveImageStartVM
Maxim Nestratov
mnestratov at virtuozzo.com
Sat Jan 30 12:12:51 UTC 2016
29.01.2016 11:49, Nikolay Shirokovskiy пишет:
> Error paths after sending the event that domain is started written as if ret = -1
> which is set at the beginning of the function. It's common idioma to keep 'ret'
> equal to -1 until the end of function where it is set to 0. But here we use ret
> to keep result of restore operation too and thus breaks the idioma and its users :)
>
> Let's use different variable to hold restore result.
>
> Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy at virtuozzo.com>
> ---
> src/qemu/qemu_driver.c | 21 ++++++++++-----------
> 1 file changed, 10 insertions(+), 11 deletions(-)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 351e529..ced105b 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -6732,6 +6732,7 @@ qemuDomainSaveImageStartVM(virConnectPtr conn,
> qemuDomainAsyncJob asyncJob)
> {
> int ret = -1;
> + bool restored;
> virObjectEventPtr event;
> int intermediatefd = -1;
> virCommandPtr cmd = NULL;
> @@ -6758,13 +6759,13 @@ qemuDomainSaveImageStartVM(virConnectPtr conn,
> }
>
> /* Set the migration source and start it up. */
> - ret = qemuProcessStart(conn, driver, vm, asyncJob,
> - "stdio", *fd, path, NULL,
> - VIR_NETDEV_VPORT_PROFILE_OP_RESTORE,
> - VIR_QEMU_PROCESS_START_PAUSED);
> + restored = qemuProcessStart(conn, driver, vm, asyncJob,
> + "stdio", *fd, path, NULL,
> + VIR_NETDEV_VPORT_PROFILE_OP_RESTORE,
> + VIR_QEMU_PROCESS_START_PAUSED) >= 0;
>
> if (intermediatefd != -1) {
> - if (ret < 0) {
> + if (!restored) {
> /* if there was an error setting up qemu, the intermediate
> * process will wait forever to write to stdout, so we
> * must manually kill it.
> @@ -6775,7 +6776,7 @@ qemuDomainSaveImageStartVM(virConnectPtr conn,
>
> if (virCommandWait(cmd, NULL) < 0) {
> qemuProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_FAILED, 0);
> - ret = -1;
> + restored = false;
> }
> VIR_DEBUG("Decompression binary stderr: %s", NULLSTR(errbuf));
> }
> @@ -6783,18 +6784,16 @@ qemuDomainSaveImageStartVM(virConnectPtr conn,
>
> if (VIR_CLOSE(*fd) < 0) {
> virReportSystemError(errno, _("cannot close file: %s"), path);
> - ret = -1;
> + restored = false;
> }
>
> - if (ret < 0) {
> - virDomainAuditStart(vm, "restored", false);
> + virDomainAuditStart(vm, "restored", restored);
> + if (!restored)
> goto cleanup;
> - }
>
> event = virDomainEventLifecycleNewFromObj(vm,
> VIR_DOMAIN_EVENT_STARTED,
> VIR_DOMAIN_EVENT_STARTED_RESTORED);
> - virDomainAuditStart(vm, "restored", true);
> qemuDomainEventQueue(driver, event);
>
>
ACK.
More information about the libvir-list
mailing list