From f78e7381ac369952197ffb23b02f56ee430214e7 Mon Sep 17 00:00:00 2001 Message-Id: From: Eric Blake Date: Thu, 21 Aug 2014 16:07:30 -0600 Subject: [PATCH] qemu: reject rather than hang on blockcommit of active layer 7.0.z: https://bugzilla.redhat.com/show_bug.cgi?id=1150379 7.1: https://bugzilla.redhat.com/show_bug.cgi?id=1062142 qemu 2.0 added the ability to commit the active layer, but slightly differently than what libvirt had been anticipating in its implementation of the virDomainBlockCommit call. As a result, if you attempt to do a 'virsh blockcommit $dom vda', qemu gets into a state where it is waiting on libvirt to end the job, while libvirt is waiting on qemu to end the job, and the guest is effectively hung with regards to further commands for that block device. I have patches coming down the pipeline that will add full support for blockcommit of the active layer when coupled with qemu 2.0 or later; but they depend on Peter's improvements to block job handling and form enough of a new feature that they are not ready for inclusion in the 1.2.5 release. So for now, just reject the attempt, rather than letting the user get stuck. This is no worse than the behavior of qemu 1.7 rejecting the job. * src/qemu/qemu_driver.c (qemuDomainBlockCommit): Reject active commit. Signed-off-by: Eric Blake (cherry picked from commit e6bcbcd32c70ae394e7b6a530012fe8b07a59b5d) Conflicts: src/qemu/qemu_driver.c - no refactoring of virStorageFileChainLookup Signed-off-by: Jiri Denemark --- src/qemu/qemu_driver.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 72d03b5..1ce4c39 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -15312,6 +15312,16 @@ qemuDomainBlockCommit(virDomainPtr dom, const char *path, const char *base, top, path); goto endjob; } + + /* FIXME: qemu 2.0 supports active commit, but as a two-stage + * process; qemu 2.1 is further improving active commit. We need + * to start supporting it in libvirt. */ + if (top_meta == disk->backingChain) { + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", + _("committing the active layer not supported yet")); + goto endjob; + } + if (!top_meta || !top_meta->backingStore) { virReportError(VIR_ERR_INVALID_ARG, _("top '%s' in chain for '%s' has no backing file"), -- 2.2.0