mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
qemuBackupJobTerminate: Fix job termination for inactive VMs
Commit cb29e4e801d didn't take into account that the VM can be inactive when it's destroyed. This means that the job would remain active also when the VM became inactive. To fix this properly: 1) Remove the bogus VM liveness check and early return (reverts the aforementioned commit) 2) Conditionalize the stats assignment only when the stats object is present (properly fix the crash when VM dies when reconnecting) 3) end the asyncjob only when it was already set (prevent corruption of priv->jobs_queued) Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1937598 Fixes: cb29e4e801d Signed-off-by: Peter Krempa <pkrempa@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
parent
aa372e5a01
commit
55d175c073
@ -583,27 +583,28 @@ qemuBackupJobTerminate(virDomainObjPtr vm,
|
||||
}
|
||||
}
|
||||
|
||||
if (!virDomainObjIsActive(vm))
|
||||
return;
|
||||
if (priv->job.current) {
|
||||
qemuDomainJobInfoUpdateTime(priv->job.current);
|
||||
|
||||
qemuDomainJobInfoUpdateTime(priv->job.current);
|
||||
g_clear_pointer(&priv->job.completed, qemuDomainJobInfoFree);
|
||||
priv->job.completed = qemuDomainJobInfoCopy(priv->job.current);
|
||||
|
||||
g_clear_pointer(&priv->job.completed, qemuDomainJobInfoFree);
|
||||
priv->job.completed = qemuDomainJobInfoCopy(priv->job.current);
|
||||
priv->job.completed->stats.backup.total = priv->backup->push_total;
|
||||
priv->job.completed->stats.backup.transferred = priv->backup->push_transferred;
|
||||
priv->job.completed->stats.backup.tmp_used = priv->backup->pull_tmp_used;
|
||||
priv->job.completed->stats.backup.tmp_total = priv->backup->pull_tmp_total;
|
||||
|
||||
priv->job.completed->stats.backup.total = priv->backup->push_total;
|
||||
priv->job.completed->stats.backup.transferred = priv->backup->push_transferred;
|
||||
priv->job.completed->stats.backup.tmp_used = priv->backup->pull_tmp_used;
|
||||
priv->job.completed->stats.backup.tmp_total = priv->backup->pull_tmp_total;
|
||||
priv->job.completed->status = jobstatus;
|
||||
priv->job.completed->errmsg = g_strdup(priv->backup->errmsg);
|
||||
|
||||
priv->job.completed->status = jobstatus;
|
||||
priv->job.completed->errmsg = g_strdup(priv->backup->errmsg);
|
||||
|
||||
qemuDomainEventEmitJobCompleted(priv->driver, vm);
|
||||
qemuDomainEventEmitJobCompleted(priv->driver, vm);
|
||||
}
|
||||
|
||||
virDomainBackupDefFree(priv->backup);
|
||||
priv->backup = NULL;
|
||||
qemuDomainObjEndAsyncJob(priv->driver, vm);
|
||||
|
||||
if (priv->job.asyncJob == QEMU_ASYNC_JOB_BACKUP)
|
||||
qemuDomainObjEndAsyncJob(priv->driver, vm);
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user