mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-02 09:55:18 +00:00
qemu: migration: fix race on cancelling drive mirror
0feebab2 adds calling qemuBlockNodeNamesDetect for completed job on updating block jobs. This affects cancelling drive mirror logic as this function drops vm lock. Now we have to recheck all disks before the disk with the completed block job before going to wait for block job events. Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
This commit is contained in:
parent
dd8e40790b
commit
bc82d1eaf6
@ -655,9 +655,11 @@ qemuMigrationDriveMirrorCancelled(virQEMUDriverPtr driver,
|
||||
{
|
||||
size_t i;
|
||||
size_t active = 0;
|
||||
size_t completed = 0;
|
||||
int status;
|
||||
bool failed = false;
|
||||
|
||||
retry:
|
||||
for (i = 0; i < vm->def->ndisks; i++) {
|
||||
virDomainDiskDefPtr disk = vm->def->disks[i];
|
||||
qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
|
||||
@ -684,6 +686,19 @@ qemuMigrationDriveMirrorCancelled(virQEMUDriverPtr driver,
|
||||
default:
|
||||
active++;
|
||||
}
|
||||
|
||||
if (status == VIR_DOMAIN_BLOCK_JOB_COMPLETED)
|
||||
completed++;
|
||||
}
|
||||
|
||||
/* Updating completed block job drops the lock thus we have to recheck
|
||||
* block jobs for disks that reside before the disk(s) with completed
|
||||
* block job.
|
||||
*/
|
||||
if (completed > 0) {
|
||||
completed = 0;
|
||||
active = 0;
|
||||
goto retry;
|
||||
}
|
||||
|
||||
if (failed) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user