From a5bc7130f3acb47636aea45a27e068b315d2d618 Mon Sep 17 00:00:00 2001 From: Jiri Denemark Date: Wed, 4 Apr 2018 12:11:38 +0200 Subject: [PATCH] qemu: Properly avoid cancelling memory-only dump MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit migrate_cancel QMP command cannot be used for cancelling memory-only dumps and priv->job.dump_memory_only is used for reporting an error if someone calls virDomainAbortJob when memory-only dump job is running. Since commit 150930e3098 the dump_memory_only flag is set only if dump-guest-memory command was called without the detach parameter. This would incorrectly allow libvirt to send migrate_cancel while the detached memory-only dump is running. Signed-off-by: Jiri Denemark Reviewed-by: Ján Tomko --- src/qemu/qemu_driver.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 256050e9ed..814ae9622e 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -3772,12 +3772,12 @@ qemuDumpToFd(virQEMUDriverPtr driver, if (qemuSecuritySetImageFDLabel(driver->securityManager, vm->def, fd) < 0) return -1; - if (detach) { + priv->job.dump_memory_only = true; + + if (detach) priv->job.current->statsType = QEMU_DOMAIN_JOB_STATS_TYPE_MEMDUMP; - } else { + else VIR_FREE(priv->job.current); - priv->job.dump_memory_only = true; - } if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0) return -1; @@ -13450,7 +13450,7 @@ static int qemuDomainAbortJob(virDomainPtr dom) priv = vm->privateData; - if (!priv->job.asyncJob || priv->job.dump_memory_only) { + if (!priv->job.asyncJob) { virReportError(VIR_ERR_OPERATION_INVALID, "%s", _("no job is active on the domain")); goto endjob; @@ -13463,6 +13463,13 @@ static int qemuDomainAbortJob(virDomainPtr dom) goto endjob; } + if (priv->job.asyncJob == QEMU_ASYNC_JOB_DUMP && + priv->job.dump_memory_only) { + virReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("cannot abort memory-only dump")); + goto endjob; + } + if (priv->job.asyncJob == QEMU_ASYNC_JOB_MIGRATION_OUT && (priv->job.current->status == QEMU_DOMAIN_JOB_STATUS_POSTCOPY || (virDomainObjGetState(vm, &reason) == VIR_DOMAIN_PAUSED && -- 2.47.2