
On 01/20/2014 06:09 PM, Peter Krempa wrote:
We shouldn't access the domain definition while we are in the monitor section as the domain is unlocked. Additionaly after we exit from the monitor we need to check if the VM is still alive. Not doing so resulted into crash if qemu exits while attempting to do a external VM snapshot. ---
Notes: Version 1 was reported to break locking of a VM but withoit enough data to reproduce/trace. Version 2: - changed some of the conditions so that proper cleanup paths are taken - fixed returned error value in case the job can't be entered
src/qemu/qemu_driver.c | 53 ++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 41 insertions(+), 12 deletions(-)
@@ -12605,8 +12606,25 @@ qemuDomainSnapshotCreateSingleDiskActive(virQEMUDriverPtr driver, + if (!actions) { + qemuDomainObjExitMonitor(driver, vm); + if (!virDomainObjIsActive(vm)) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Domain crashed while taking the snapshot")); + ret = -1; + } + } +
You use 'Domain' here...
@@ -12724,24 +12739,36 @@ qemuDomainSnapshotCreateDiskActive(virQEMUDriverPtr driver, if (actions) { - if (ret == 0) - ret = qemuMonitorTransaction(priv->mon, actions); + if (ret == 0) { + if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) == 0) { + ret = qemuMonitorTransaction(priv->mon, actions); + qemuDomainObjExitMonitor(driver, vm); + if (!virDomainObjIsActive(vm)) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("domain crashed while taking the snapshot")); + ret = -1; + } + } else {
and 'domain' here. It would be better to be consistent, if only because translations are case-sensitive. I'd suggest going with lowercase, as it seems to be used in most of the snapshot errors. Jan