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-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=e5d729ba42d86eb3afa9799bca2944700fde41bb;p=libvirt.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 --- diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 724e3ff24b..155333ea6f 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -1853,6 +1853,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); @@ -1921,6 +1925,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: