https://bugzilla.redhat.com/show_bug.cgi?id=1135339 documents some confusing behavior when a user tries to start an inactive block commit in a second connection while there is already an on-going active commit from a first connection. Eventually, qemu will support multiple simultaneous block jobs, but as of now, it does not; furthermore, libvirt also needs an overhaul before we can support simultaneous jobs. So, the best way to avoid confusing ourselves is to quit relying on qemu to tell us about the situation (where we risk getting in weird states) and instead forbid a duplicate block commit ourselves.
Note that we are still relying on qemu to diagnose attempts to interrupt an inactive commit (since we only track XML of an active commit), but as inactive commit is less confusing for libvirt to manage, there is less that can go wrong by leaving that detection up to qemu. * src/qemu/qemu_driver.c (qemuDomainBlockCommit): Hoist check for active commit to occur earlier outside of conditions. Signed-off-by: Eric Blake <ebl...@redhat.com> --- src/qemu/qemu_driver.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index cdf4173..14cbb2b 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -1,7 +1,7 @@ /* * qemu_driver.c: core driver methods for managing qemu guests * - * Copyright (C) 2006-2014 Red Hat, Inc. + * Copyright (C) 2006-2015 Red Hat, Inc. * Copyright (C) 2006 Daniel P. Berrange * * This library is free software; you can redistribute it and/or @@ -16237,6 +16237,12 @@ qemuDomainBlockCommit(virDomainPtr dom, disk->dst); goto endjob; } + if (disk->mirror) { + virReportError(VIR_ERR_BLOCK_COPY_ACTIVE, + _("disk '%s' already in active block job"), + disk->dst); + goto endjob; + } if (qemuDomainDetermineDiskChain(driver, vm, disk, false, true) < 0) goto endjob; @@ -16261,12 +16267,6 @@ qemuDomainBlockCommit(virDomainPtr dom, disk->dst); goto endjob; } - if (disk->mirror) { - virReportError(VIR_ERR_BLOCK_COPY_ACTIVE, - _("disk '%s' already in active block job"), - disk->dst); - goto endjob; - } } else if (flags & VIR_DOMAIN_BLOCK_COMMIT_ACTIVE) { virReportError(VIR_ERR_INVALID_ARG, _("active commit requested but '%s' is not active"), -- 2.1.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list