
On Fri, May 20, 2011 at 09:36:12AM +0100, Daniel P. Berrange wrote:
On Fri, May 20, 2011 at 03:09:09PM +0800, Wen Congyang wrote:
If we use p2p migration and the vm is transient, vm will be deleted in qemuDomainMigrateConfirm3(). But the caller(doPeer2PeerMigrate() and qemuMigrationPerform()) still access it, and it will cause libvirtd crashed.
--- src/qemu/qemu_migration.c | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-)
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 4d7bc38..ab28416 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -1971,6 +1971,11 @@ int qemuMigrationPerform(struct qemud_driver *driver, goto cleanup; priv->jobActive = QEMU_JOB_MIGRATION_OUT;
+ /* Hold an extra reference because we can't allow 'vm' to be deleted in + * qemuDomainMigrateConfirm3(). + */ + virDomainObjRef(vm); + if (!virDomainObjIsActive(vm)) { qemuReportError(VIR_ERR_OPERATION_INVALID, "%s", _("domain is not running")); @@ -2045,7 +2050,7 @@ endjob: vm = NULL;
cleanup: - if (vm) + if (vm && virDomainObjUnref(vm) > 0) virDomainObjUnlock(vm); if (event) qemuDomainEventQueue(driver, event);
This is just working around a bug in qemuMigrationConfirm, which should not have been deleting the 'vm' at all. So I am changing that latter method to fix the issue
Try this patch to fix the problems: http://www.redhat.com/archives/libvir-list/2011-May/msg01335.html Transient VMs can be succesfully migrated normally, or with --p2p, or with the --p2p and --tunnelled flags set. Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|