]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
qemu: Keep track of what disks are being migrated
authorJiri Denemark <jdenemar@redhat.com>
Mon, 11 May 2015 18:10:06 +0000 (20:10 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Fri, 15 May 2015 06:05:31 +0000 (08:05 +0200)
Instead of redoing the same filtering over and over everytime we need to
walk through all disks which are being migrated.

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
src/qemu/qemu_domain.h
src/qemu/qemu_migration.c

index 53df1d31ad6d573654838023b8abb622de94df54..a6df199bee3a768167396da7867f59dbc8d68ef7 100644 (file)
@@ -218,6 +218,8 @@ struct _qemuDomainDiskPrivate {
     int blockJobType;   /* type of the block job from the event */
     int blockJobStatus; /* status of the finished block job */
     bool blockJobSync; /* the block job needs synchronized termination */
+
+    bool migrating; /* the disk is being migrated */
 };
 
 typedef enum {
index c71cc718360a90bbe3df6e17e35bcd329ef3c5b7..cf56a8be11a2b853e03b4f3b78b82085c7081cdb 100644 (file)
@@ -1745,13 +1745,7 @@ qemuMigrationCheckDriveMirror(virQEMUDriverPtr driver,
         virDomainDiskDefPtr disk = vm->def->disks[i];
         qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
 
-        /* skip shared, RO and source-less disks */
-        if (disk->src->shared || disk->src->readonly ||
-            !virDomainDiskGetSource(disk))
-            continue;
-
-        /* skip disks that didn't start mirroring */
-        if (!diskPriv->blockJobSync)
+        if (!diskPriv->migrating || !diskPriv->blockJobSync)
             continue;
 
         /* process any pending event */
@@ -1874,17 +1868,13 @@ qemuMigrationCancelDriveMirror(virQEMUDriverPtr driver,
         virDomainDiskDefPtr disk = vm->def->disks[i];
         qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
 
-        /* skip shared, RO and source-less disks */
-        if (disk->src->shared || disk->src->readonly ||
-            !virDomainDiskGetSource(disk))
-            continue;
-
-        /* skip disks that didn't start mirroring */
-        if (!diskPriv->blockJobSync)
+        if (!diskPriv->migrating || !diskPriv->blockJobSync)
             continue;
 
         if (qemuMigrationCancelOneDriveMirror(driver, vm, disk) < 0)
             return -1;
+
+        diskPriv->migrating = false;
     }
 
     return 0;
@@ -1945,6 +1935,7 @@ qemuMigrationDriveMirror(virQEMUDriverPtr driver,
 
     for (i = 0; i < vm->def->ndisks; i++) {
         virDomainDiskDefPtr disk = vm->def->disks[i];
+        qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
         int mon_ret;
 
         /* skip shared, RO and source-less disks */
@@ -1975,16 +1966,16 @@ qemuMigrationDriveMirror(virQEMUDriverPtr driver,
             qemuBlockJobSyncEnd(driver, vm, disk, NULL);
             goto cleanup;
         }
+        diskPriv->migrating = true;
     }
 
     /* Wait for each disk to become ready in turn, but check the status
      * for *all* mirrors to determine if any have aborted. */
     for (i = 0; i < vm->def->ndisks; i++) {
         virDomainDiskDefPtr disk = vm->def->disks[i];
+        qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
 
-        /* skip shared, RO and source-less disks */
-        if (disk->src->shared || disk->src->readonly ||
-            !virDomainDiskGetSource(disk))
+        if (!diskPriv->migrating)
             continue;
 
         while (disk->mirrorState != VIR_DOMAIN_DISK_MIRROR_STATE_READY) {