mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-16 09:35:16 +00:00
qemu: Fix possible race when pausing guest
When pausing the guest while migration is running (to speed up convergence) the virDomainSuspend API checks if the migration job is active before entering the job. This could cause a possible race if the virDomainSuspend is called while the job is active but ends before the Suspend API enters the job (this would require that the migration is aborted). This would cause a incorrect event to be emitted. (cherry picked from commit d0fc6dc8315b3172501e6fe09c8aed12598de47e)
This commit is contained in:
parent
d3fd617699
commit
beb086f638
@ -1570,14 +1570,6 @@ static int qemudDomainSuspend(virDomainPtr dom) {
|
|||||||
|
|
||||||
priv = vm->privateData;
|
priv = vm->privateData;
|
||||||
|
|
||||||
if (priv->job.asyncJob == QEMU_ASYNC_JOB_MIGRATION_OUT) {
|
|
||||||
reason = VIR_DOMAIN_PAUSED_MIGRATION;
|
|
||||||
eventDetail = VIR_DOMAIN_EVENT_SUSPENDED_MIGRATED;
|
|
||||||
} else {
|
|
||||||
reason = VIR_DOMAIN_PAUSED_USER;
|
|
||||||
eventDetail = VIR_DOMAIN_EVENT_SUSPENDED_PAUSED;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (qemuDomainObjBeginJobWithDriver(driver, vm, QEMU_JOB_SUSPEND) < 0)
|
if (qemuDomainObjBeginJobWithDriver(driver, vm, QEMU_JOB_SUSPEND) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
@ -1587,6 +1579,14 @@ static int qemudDomainSuspend(virDomainPtr dom) {
|
|||||||
goto endjob;
|
goto endjob;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (priv->job.asyncJob == QEMU_ASYNC_JOB_MIGRATION_OUT) {
|
||||||
|
reason = VIR_DOMAIN_PAUSED_MIGRATION;
|
||||||
|
eventDetail = VIR_DOMAIN_EVENT_SUSPENDED_MIGRATED;
|
||||||
|
} else {
|
||||||
|
reason = VIR_DOMAIN_PAUSED_USER;
|
||||||
|
eventDetail = VIR_DOMAIN_EVENT_SUSPENDED_PAUSED;
|
||||||
|
}
|
||||||
|
|
||||||
state = virDomainObjGetState(vm, NULL);
|
state = virDomainObjGetState(vm, NULL);
|
||||||
if (state == VIR_DOMAIN_PMSUSPENDED) {
|
if (state == VIR_DOMAIN_PMSUSPENDED) {
|
||||||
virReportError(VIR_ERR_OPERATION_INVALID,
|
virReportError(VIR_ERR_OPERATION_INVALID,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user