[libvirt] seg fault when running snapshot-create
Daniel P. Berrange
berrange at redhat.com
Thu Apr 22 13:55:44 UTC 2010
On Thu, Apr 22, 2010 at 09:39:57AM -0400, Chris Lalancette wrote:
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 5f4adfd..4ec4bd6 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -11034,18 +11040,18 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
> rc = qemuMonitorLoadSnapshot(priv->mon, snap->def->name);
> qemuDomainObjExitMonitorWithDriver(driver, vm);
> if (rc < 0)
> - goto cleanup;
> + goto endjob;
> }
> else {
> if (qemuDomainSnapshotSetActive(vm, driver->snapshotDir) < 0)
> - goto cleanup;
> + goto endjob;
>
> rc = qemudStartVMDaemon(snapshot->domain->conn, driver, vm, NULL,
> -1);
> if (qemuDomainSnapshotSetInactive(vm, driver->snapshotDir) < 0)
> - goto cleanup;
> + goto endjob;
> if (rc < 0)
> - goto cleanup;
> + goto endjob;
> }
>
> if (snap->def->state == VIR_DOMAIN_PAUSED) {
> @@ -11057,7 +11063,7 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
> rc = qemuMonitorStopCPUs(priv->mon);
> qemuDomainObjExitMonitorWithDriver(driver, vm);
> if (rc < 0)
> - goto cleanup;
> + goto endjob;
> }
>
> event = virDomainEventNewFromObj(vm,
> @@ -11083,17 +11089,18 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
> }
>
> if (qemuDomainSnapshotSetActive(vm, driver->snapshotDir) < 0)
> - goto cleanup;
> + goto endjob;
> }
>
> vm->state = snap->def->state;
>
> ret = 0;
>
> -cleanup:
> - if (vm && qemuDomainObjEndJob(vm) == 0)
> +endjob:
> + if (qemuDomainObjEndJob(vm) == 0)
> vm = NULL;
>
> +cleanup:
> if (event)
> qemuDomainEventQueue(driver, event);
> if (vm)
Getting rid of the check for vm being non-NULL actually makes me
notice another bug. The place a little further up where you call
qemudShutdownVMDaemon() is missing the followup code to clear up
transient guests
if (!vm->persistent) {
if (qemuDomainObjEndJob(vm) > 0)
virDomainRemoveInactive(&driver->domains,
vm);
vm = NULL;
}
With this added, you'd still need the NULL check
Daniel
--
|: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://deltacloud.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
More information about the libvir-list
mailing list