From: Michael Chapman Date: Mon, 30 Mar 2015 02:41:00 +0000 (+1100) Subject: qemu: fix race between disk mirror fail and cancel X-Git-Tag: v1.2.13.1~18 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9a0e0d3f176b198d4fcec9f00b278c152091d0dd;p=thirdparty%2Flibvirt.git qemu: fix race between disk mirror fail and cancel If a VM migration is aborted, a disk mirror may be failed by QEMU before libvirt has a chance to cancel it. The disk->mirrorState remains at _ABORT in this case, and this breaks subsequent mirrorings of that disk. We should instead check the mirrorState directly and transition to _NONE if it is already aborted. Do the check *after* aborting the block job in QEMU to avoid a race. Signed-off-by: Michael Chapman (cherry picked from commit e5d729ba42d86eb3afa9799bca2944700fde41bb) --- diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 21432c0b98..39ca37c1a2 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -1852,6 +1852,10 @@ qemuMigrationDriveMirror(virQEMUDriverPtr driver, } else { VIR_WARN("Unable to enter monitor. No block job cancelled"); } + + /* If disk mirror is already aborted, clear the mirror state now */ + if (disk->mirrorState == VIR_DOMAIN_DISK_MIRROR_STATE_ABORT) + disk->mirrorState = VIR_DOMAIN_DISK_MIRROR_STATE_NONE; } if (err) virSetError(err); @@ -1920,6 +1924,10 @@ qemuMigrationCancelDriveMirror(qemuMigrationCookiePtr mig, ret = -1; goto cleanup; } + + /* If disk mirror is already aborted, clear the mirror state now */ + if (disk->mirrorState == VIR_DOMAIN_DISK_MIRROR_STATE_ABORT) + disk->mirrorState = VIR_DOMAIN_DISK_MIRROR_STATE_NONE; } cleanup: