]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Fix migration with dname
authorJiri Denemark <jdenemar@redhat.com>
Tue, 4 Oct 2011 07:11:35 +0000 (09:11 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Tue, 4 Oct 2011 13:43:14 +0000 (15:43 +0200)
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
src/qemu/qemu_domain.h
src/qemu/qemu_migration.c

index d3ad192064e5ffe9b2d3d0e77b2dbd1807e86866..65f721aae4176ae6d0429a0f44eaa00e7d744a88 100644 (file)
@@ -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) {
index cdf1375d40f5bb01f6d20053b7cad558fbab77bf..d9f323cc5954bc3a3fe959f371212dbb89fadd4e 100644 (file)
@@ -126,6 +126,7 @@ struct _qemuDomainObjPrivate {
     int jobs_queued;
 
     unsigned long migMaxBandwidth;
+    char *origname;
 };
 
 struct qemuDomainWatchdogEvent
index 1122daba949de90014169e00d27f3b401ed735ea..4516231feb6f381867baf16750c4bb2c646a3002 100644 (file)
@@ -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);