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
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 <jdenemar(a)redhat.com>
---
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 e15eb49a5c..b9927b727b 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -3794,12 +3794,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;
@@ -13472,7 +13472,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;
@@ -13485,6 +13485,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.17.0