From: Daniel P. Berrange Date: Fri, 20 May 2011 12:29:42 +0000 (-0400) Subject: Fix resume on destination when doing non-live tunnelled migration X-Git-Tag: CVE-2011-2178~95 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=73b3e0b70b731a0c08a5a8570dde8810d3644d38;p=thirdparty%2Flibvirt.git Fix resume on destination when doing non-live tunnelled migration Before running perform in peer-2-peer migration, the current guest state must be recorded, so that non-live migration can currently unpause a running guest on completion. * src/qemu/qemu_migration.c: Move check for offline guest to fix non-live migration --- diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 2e2ccd59a7..d0e8e142d6 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -1313,6 +1313,13 @@ static int doNativeMigrate(struct qemud_driver *driver, goto cleanup; } + /* Before EnterMonitor, since qemuProcessStopCPUs already does that */ + if (!(flags & VIR_MIGRATE_LIVE) && + virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING) { + if (qemuMigrationSetOffline(driver, vm) < 0) + goto cleanup; + } + qemuDomainObjEnterMonitorWithDriver(driver, vm); if (resource > 0 && qemuMonitorSetMigrationSpeed(priv->mon, resource) < 0) { @@ -1540,6 +1547,13 @@ static int doTunnelMigrate(struct qemud_driver *driver, VIR_WARN("unable to provide data for graphics client relocation"); /* 3. start migration on source */ + /* Before EnterMonitor, since qemuProcessStopCPUs already does that */ + if (!(flags & VIR_MIGRATE_LIVE) && + virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING) { + if (qemuMigrationSetOffline(driver, vm) < 0) + goto cleanup; + } + qemuDomainObjEnterMonitorWithDriver(driver, vm); if (resource > 0 && qemuMonitorSetMigrationSpeed(priv->mon, resource) < 0) { @@ -2048,11 +2062,6 @@ int qemuMigrationPerform(struct qemud_driver *driver, priv->jobInfo.type = VIR_DOMAIN_JOB_UNBOUNDED; resume = virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING; - if (!(flags & VIR_MIGRATE_LIVE) && - virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING) { - if (qemuMigrationSetOffline(driver, vm) < 0) - goto endjob; - } if ((flags & (VIR_MIGRATE_TUNNELLED | VIR_MIGRATE_PEER2PEER))) { if (cookieinlen) {