mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
qemu: Keep track of what disks are being migrated
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>
This commit is contained in:
parent
46a7a49535
commit
5139924b8d
@ -218,6 +218,8 @@ struct _qemuDomainDiskPrivate {
|
|||||||
int blockJobType; /* type of the block job from the event */
|
int blockJobType; /* type of the block job from the event */
|
||||||
int blockJobStatus; /* status of the finished block job */
|
int blockJobStatus; /* status of the finished block job */
|
||||||
bool blockJobSync; /* the block job needs synchronized termination */
|
bool blockJobSync; /* the block job needs synchronized termination */
|
||||||
|
|
||||||
|
bool migrating; /* the disk is being migrated */
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
@ -1745,13 +1745,7 @@ qemuMigrationCheckDriveMirror(virQEMUDriverPtr driver,
|
|||||||
virDomainDiskDefPtr disk = vm->def->disks[i];
|
virDomainDiskDefPtr disk = vm->def->disks[i];
|
||||||
qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
|
qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
|
||||||
|
|
||||||
/* skip shared, RO and source-less disks */
|
if (!diskPriv->migrating || !diskPriv->blockJobSync)
|
||||||
if (disk->src->shared || disk->src->readonly ||
|
|
||||||
!virDomainDiskGetSource(disk))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* skip disks that didn't start mirroring */
|
|
||||||
if (!diskPriv->blockJobSync)
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* process any pending event */
|
/* process any pending event */
|
||||||
@ -1874,17 +1868,13 @@ qemuMigrationCancelDriveMirror(virQEMUDriverPtr driver,
|
|||||||
virDomainDiskDefPtr disk = vm->def->disks[i];
|
virDomainDiskDefPtr disk = vm->def->disks[i];
|
||||||
qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
|
qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
|
||||||
|
|
||||||
/* skip shared, RO and source-less disks */
|
if (!diskPriv->migrating || !diskPriv->blockJobSync)
|
||||||
if (disk->src->shared || disk->src->readonly ||
|
|
||||||
!virDomainDiskGetSource(disk))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* skip disks that didn't start mirroring */
|
|
||||||
if (!diskPriv->blockJobSync)
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (qemuMigrationCancelOneDriveMirror(driver, vm, disk) < 0)
|
if (qemuMigrationCancelOneDriveMirror(driver, vm, disk) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
diskPriv->migrating = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -1945,6 +1935,7 @@ qemuMigrationDriveMirror(virQEMUDriverPtr driver,
|
|||||||
|
|
||||||
for (i = 0; i < vm->def->ndisks; i++) {
|
for (i = 0; i < vm->def->ndisks; i++) {
|
||||||
virDomainDiskDefPtr disk = vm->def->disks[i];
|
virDomainDiskDefPtr disk = vm->def->disks[i];
|
||||||
|
qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
|
||||||
int mon_ret;
|
int mon_ret;
|
||||||
|
|
||||||
/* skip shared, RO and source-less disks */
|
/* skip shared, RO and source-less disks */
|
||||||
@ -1975,16 +1966,16 @@ qemuMigrationDriveMirror(virQEMUDriverPtr driver,
|
|||||||
qemuBlockJobSyncEnd(driver, vm, disk, NULL);
|
qemuBlockJobSyncEnd(driver, vm, disk, NULL);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
diskPriv->migrating = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Wait for each disk to become ready in turn, but check the status
|
/* Wait for each disk to become ready in turn, but check the status
|
||||||
* for *all* mirrors to determine if any have aborted. */
|
* for *all* mirrors to determine if any have aborted. */
|
||||||
for (i = 0; i < vm->def->ndisks; i++) {
|
for (i = 0; i < vm->def->ndisks; i++) {
|
||||||
virDomainDiskDefPtr disk = vm->def->disks[i];
|
virDomainDiskDefPtr disk = vm->def->disks[i];
|
||||||
|
qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
|
||||||
|
|
||||||
/* skip shared, RO and source-less disks */
|
if (!diskPriv->migrating)
|
||||||
if (disk->src->shared || disk->src->readonly ||
|
|
||||||
!virDomainDiskGetSource(disk))
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
while (disk->mirrorState != VIR_DOMAIN_DISK_MIRROR_STATE_READY) {
|
while (disk->mirrorState != VIR_DOMAIN_DISK_MIRROR_STATE_READY) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user