From cdd5ef7b0776c5fa09a1b5bcb5d8adbc82b525bd Mon Sep 17 00:00:00 2001 From: Jiri Denemark Date: Tue, 4 Oct 2011 09:11:35 +0200 Subject: [PATCH] qemu: Fix migration with dname Destination libvirtd remembers the original name in the prepare phase and clears it in the finish phase. The original name is used when comparing domain name in migration cookie. --- src/qemu/qemu_domain.c | 1 + src/qemu/qemu_domain.h | 1 + src/qemu/qemu_migration.c | 19 ++++++++++++++++--- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index d3ad192064..65f721aae4 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -231,6 +231,7 @@ static void qemuDomainObjPrivateFree(void *data) qemuDomainObjFreeJob(priv); VIR_FREE(priv->vcpupids); VIR_FREE(priv->lockState); + VIR_FREE(priv->origname); /* This should never be non-NULL if we get here, but just in case... */ if (priv->mon) { diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index cdf1375d40..d9f323cc59 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -126,6 +126,7 @@ struct _qemuDomainObjPrivate { int jobs_queued; unsigned long migMaxBandwidth; + char *origname; }; struct qemuDomainWatchdogEvent diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 1122daba94..4516231feb 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -254,12 +254,18 @@ error: static qemuMigrationCookiePtr qemuMigrationCookieNew(virDomainObjPtr dom) { + qemuDomainObjPrivatePtr priv = dom->privateData; qemuMigrationCookiePtr mig = NULL; + const char *name; if (VIR_ALLOC(mig) < 0) goto no_memory; - if (!(mig->name = strdup(dom->def->name))) + if (priv->origname) + name = priv->origname; + else + name = dom->def->name; + if (!(mig->name = strdup(name))) goto no_memory; memcpy(mig->uuid, dom->def->uuid, VIR_UUID_BUFLEN); @@ -1064,6 +1070,7 @@ qemuMigrationPrepareAny(struct qemud_driver *driver, unsigned long long now; qemuMigrationCookiePtr mig = NULL; bool tunnel = !!st; + char *origname = NULL; if (virTimeMs(&now) < 0) return -1; @@ -1078,7 +1085,7 @@ qemuMigrationPrepareAny(struct qemud_driver *driver, /* Target domain name, maybe renamed. */ if (dname) { - VIR_FREE(def->name); + origname = def->name; def->name = strdup(dname); if (def->name == NULL) goto cleanup; @@ -1095,6 +1102,8 @@ qemuMigrationPrepareAny(struct qemud_driver *driver, } def = NULL; priv = vm->privateData; + priv->origname = origname; + origname = NULL; if (!(mig = qemuMigrationEatCookie(driver, vm, cookiein, cookieinlen, QEMU_MIGRATION_COOKIE_LOCKSTATE))) @@ -1175,6 +1184,7 @@ qemuMigrationPrepareAny(struct qemud_driver *driver, ret = 0; cleanup: + VIR_FREE(origname); virDomainDefFree(def); VIR_FORCE_CLOSE(dataFD[0]); VIR_FORCE_CLOSE(dataFD[1]); @@ -2542,6 +2552,7 @@ qemuMigrationFinish(struct qemud_driver *driver, qemuMigrationCookiePtr mig = NULL; virErrorPtr orig_err = NULL; int cookie_flags = 0; + qemuDomainObjPrivatePtr priv = vm->privateData; VIR_DEBUG("driver=%p, dconn=%p, vm=%p, cookiein=%s, cookieinlen=%d, " "cookieout=%p, cookieoutlen=%p, flags=%lx, retcode=%d", @@ -2695,8 +2706,10 @@ endjob: } cleanup: - if (vm) + if (vm) { + VIR_FREE(priv->origname); virDomainObjUnlock(vm); + } if (event) qemuDomainEventQueue(driver, event); qemuMigrationCookieFree(mig); -- 2.39.5