[libvirt] [PATCH v3 03/18] blockjob: split out block info driver handling
Eric Blake
eblake at redhat.com
Thu Sep 4 23:37:55 UTC 2014
On 09/04/2014 09:11 AM, Peter Krempa wrote:
>> modify command. Technically, there is one case where getting
>> block job info can modify domain XML - we do snooping to see if
>> a 2-phase job has transitioned into the second phase, for an
>> optimization in the case of old qemu that lacked an event for
>> the transition. But I think that optimization is safe; and if
>> it proves to be a problem, we could use the difference between
>> QEMU_CAPS_BLOCKJOB_{ASYNC,SYNC} to determine whether we even
>> need snooping, and request a modifying job in that case.
>>
>> +
>> + if (info->type == VIR_DOMAIN_BLOCK_JOB_TYPE_COMMIT &&
>> + disk->mirrorJob == VIR_DOMAIN_BLOCK_JOB_TYPE_ACTIVE_COMMIT)
>> + info->type = disk->mirrorJob;
>> +
>> + /* Snoop block copy operations, so future cancel operations can
>> + * avoid checking if pivot is safe. Save the change to XML, but
>> + * we can ignore failure because it is only an optimization. */
>> + if (ret == 1 && disk->mirror &&
>> + info->cur == info->end && !disk->mirrorState) {
>> + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
>> +
>> + disk->mirrorState = VIR_DOMAIN_DISK_MIRROR_STATE_READY;
>
> Atomicity is guaranteed by holding the domain lock here. We should
> document that the mirrorState field can change even when the _MODIFY job
> is held though.
>
> Otherwise I don't see a problem currently with this as long as it is
> stated somewhere. Possibly even in a comment here.
>
> ACK
Here's what I squashed in.
diff --git i/src/qemu/qemu_driver.c w/src/qemu/qemu_driver.c
index e7bd504..fb13169 100644
--- i/src/qemu/qemu_driver.c
+++ w/src/qemu/qemu_driver.c
@@ -15289,7 +15289,9 @@ qemuDomainGetBlockJobInfo(virDomainPtr dom,
const char *path,
/* Snoop block copy operations, so future cancel operations can
* avoid checking if pivot is safe. Save the change to XML, but
- * we can ignore failure because it is only an optimization. */
+ * we can ignore failure because it is only an optimization. We
+ * hold the vm lock, so modifying the in-memory representation
+ * even though we are a query rather than a modify job, is safe. */
if (ret == 1 && disk->mirror &&
info->cur == info->end && !disk->mirrorState) {
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 539 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20140904/84ab0247/attachment-0001.sig>
More information about the libvir-list
mailing list