
On 7/24/19 10:40 AM, Peter Krempa wrote:
On Wed, Jul 24, 2019 at 00:56:09 -0500, Eric Blake wrote:
Earlier patches mentioned that the initial implementation will prevent snapshots and checkpoints from being used on the same domain at once. However, the actual restriction is done in this separate patch to make it easier to lift that restriction via a revert, when we are finally ready to tackle that integration in the future.
Signed-off-by: Eric Blake <eblake@redhat.com>
if (virDomainSnapshotCreateXMLEnsureACL(domain->conn, vm->def, flags) < 0)
Note that also any of the block jobs (block pull, block commit) will mess up the bitmaps thus should be forbidden with checkpoints. Also block copy has the same problem, but it's questionable whether we'll want to copy over the bitmaps (which is way easier than with snapshots, which break if you use that API). If the idea is to eventually be able to copy bitmaps, then we should also forbid that one until it's implemented.
Here's what I'm squashing in to this patch. I've made a few other adjustments through the series based on review comments and my last-minute once-over, and am now pushing this series; any further changes will need to be followup patches. diff --git i/src/qemu/qemu_driver.c w/src/qemu/qemu_driver.c index 3e29e54cea..8fa928afc1 100644 --- i/src/qemu/qemu_driver.c +++ w/src/qemu/qemu_driver.c @@ -18476,6 +18476,12 @@ qemuDomainBlockRebase(virDomainPtr dom, const char *path, const char *base, if (virDomainBlockRebaseEnsureACL(dom->conn, vm->def) < 0) goto cleanup; + if (virDomainListCheckpoints(vm->checkpoints, NULL, dom, NULL, 0) > 0) { + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", + _("cannot perform block rebase while checkpoint exists")); + goto cleanup; + } + /* For normal rebase (enhanced blockpull), the common code handles * everything, including vm cleanup. */ if (!(flags & VIR_DOMAIN_BLOCK_REBASE_COPY)) @@ -18560,6 +18566,12 @@ qemuDomainBlockCopy(virDomainPtr dom, const char *disk, const char *destxml, if (virDomainBlockCopyEnsureACL(dom->conn, vm->def) < 0) goto cleanup; + if (virDomainListCheckpoints(vm->checkpoints, NULL, dom, NULL, 0) > 0) { + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", + _("cannot perform block copy while checkpoint exists")); + goto cleanup; + } + for (i = 0; i < nparams; i++) { virTypedParameterPtr param = ¶ms[i]; @@ -18622,6 +18634,13 @@ qemuDomainBlockPull(virDomainPtr dom, const char *path, unsigned long bandwidth, return -1; } + if (virDomainListCheckpoints(vm->checkpoints, NULL, dom, NULL, 0) > 0) { + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", + _("cannot perform block pull while checkpoint exists")); + virDomainObjEndAPI(&vm); + return -1; + } + return qemuDomainBlockPullCommon(dom->conn->privateData, vm, path, NULL, bandwidth, flags); } @@ -18668,6 +18687,12 @@ qemuDomainBlockCommit(virDomainPtr dom, if (virDomainBlockCommitEnsureACL(dom->conn, vm->def) < 0) goto cleanup; + if (virDomainListCheckpoints(vm->checkpoints, NULL, dom, NULL, 0) > 0) { + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", + _("cannot perform block commit while checkpoint exists")); + goto cleanup; + } + if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0) goto cleanup; -- Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3226 Virtualization: qemu.org | libvirt.org