|
|
9119d9 |
From 61fbb57d74cc44594b5bcb184c350ab18b963291 Mon Sep 17 00:00:00 2001
|
|
|
9119d9 |
Message-Id: <61fbb57d74cc44594b5bcb184c350ab18b963291@dist-git>
|
|
|
9119d9 |
From: Eric Blake <eblake@redhat.com>
|
|
|
9119d9 |
Date: Tue, 24 Feb 2015 11:59:51 +0100
|
|
|
9119d9 |
Subject: [PATCH] blockjob: shuffle block rebase code
|
|
|
9119d9 |
|
|
|
9119d9 |
https://bugzilla.redhat.com/show_bug.cgi?id=1196066
|
|
|
9119d9 |
|
|
|
9119d9 |
The existing virDomainBlockRebase code rejected the combination of
|
|
|
9119d9 |
_RELATIVE and _COPY flags, but only by accident. It makes sense
|
|
|
9119d9 |
to add support for the combination someday, at least for the case
|
|
|
9119d9 |
of _SHALLOW and not _REUSE_EXT; but to implement it, libvirt would
|
|
|
9119d9 |
have to pre-create the file with a relative backing name, and I'm
|
|
|
9119d9 |
not ready to code that in yet.
|
|
|
9119d9 |
|
|
|
9119d9 |
Meanwhile, the code to forward on to the block copy code is getting
|
|
|
9119d9 |
longer, and reorganizing the function to have the block pull done
|
|
|
9119d9 |
early makes it easier to add even more block copy prep code.
|
|
|
9119d9 |
|
|
|
9119d9 |
This patch should have no semantic difference other than the quality
|
|
|
9119d9 |
of the error message on the unsupported flag combination. Pre-patch:
|
|
|
9119d9 |
|
|
|
9119d9 |
error: unsupported flags (0x10) in function qemuDomainBlockCopy
|
|
|
9119d9 |
|
|
|
9119d9 |
Post-patch:
|
|
|
9119d9 |
|
|
|
9119d9 |
error: argument unsupported: Relative backing during copy not supported yet
|
|
|
9119d9 |
|
|
|
9119d9 |
* src/qemu/qemu_driver.c (qemuDomainBlockRebase): Reorder code,
|
|
|
9119d9 |
and improve error message of relative copy.
|
|
|
9119d9 |
|
|
|
9119d9 |
Signed-off-by: Eric Blake <eblake@redhat.com>
|
|
|
9119d9 |
(cherry picked from commit 02d2bd7d91c200d1ea1a5b3f78c8b41720cea832)
|
|
|
9119d9 |
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
|
|
9119d9 |
---
|
|
|
9119d9 |
src/qemu/qemu_driver.c | 47 ++++++++++++++++++++++++++++++++---------------
|
|
|
9119d9 |
1 file changed, 32 insertions(+), 15 deletions(-)
|
|
|
9119d9 |
|
|
|
9119d9 |
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
|
|
|
9119d9 |
index f3b909f..162e039 100644
|
|
|
9119d9 |
--- a/src/qemu/qemu_driver.c
|
|
|
9119d9 |
+++ b/src/qemu/qemu_driver.c
|
|
|
9119d9 |
@@ -15947,6 +15947,8 @@ qemuDomainBlockRebase(virDomainPtr dom, const char *path, const char *base,
|
|
|
9119d9 |
unsigned long bandwidth, unsigned int flags)
|
|
|
9119d9 |
{
|
|
|
9119d9 |
virDomainObjPtr vm;
|
|
|
9119d9 |
+ const char *format = NULL;
|
|
|
9119d9 |
+ int ret = -1;
|
|
|
9119d9 |
|
|
|
9119d9 |
virCheckFlags(VIR_DOMAIN_BLOCK_REBASE_SHALLOW |
|
|
|
9119d9 |
VIR_DOMAIN_BLOCK_REBASE_REUSE_EXT |
|
|
|
9119d9 |
@@ -15957,22 +15959,37 @@ qemuDomainBlockRebase(virDomainPtr dom, const char *path, const char *base,
|
|
|
9119d9 |
if (!(vm = qemuDomObjFromDomain(dom)))
|
|
|
9119d9 |
return -1;
|
|
|
9119d9 |
|
|
|
9119d9 |
- if (virDomainBlockRebaseEnsureACL(dom->conn, vm->def) < 0) {
|
|
|
9119d9 |
+ if (virDomainBlockRebaseEnsureACL(dom->conn, vm->def) < 0)
|
|
|
9119d9 |
+ goto cleanup;
|
|
|
9119d9 |
+
|
|
|
9119d9 |
+ /* For normal rebase (enhanced blockpull), the common code handles
|
|
|
9119d9 |
+ * everything, including vm cleanup. */
|
|
|
9119d9 |
+ if (!(flags & VIR_DOMAIN_BLOCK_REBASE_COPY))
|
|
|
9119d9 |
+ return qemuDomainBlockJobImpl(vm, dom->conn, path, base, bandwidth,
|
|
|
9119d9 |
+ NULL, BLOCK_JOB_PULL, flags);
|
|
|
9119d9 |
+
|
|
|
9119d9 |
+ /* If we got here, we are doing a block copy rebase. */
|
|
|
9119d9 |
+ if (flags & VIR_DOMAIN_BLOCK_REBASE_COPY_RAW)
|
|
|
9119d9 |
+ format = "raw";
|
|
|
9119d9 |
+
|
|
|
9119d9 |
+ /* XXX: If we are doing a shallow copy but not reusing an external
|
|
|
9119d9 |
+ * file, we should attempt to pre-create the destination with a
|
|
|
9119d9 |
+ * relative backing chain instead of qemu's default of absolute */
|
|
|
9119d9 |
+ if (flags & VIR_DOMAIN_BLOCK_REBASE_RELATIVE) {
|
|
|
9119d9 |
+ virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
|
|
|
9119d9 |
+ _("Relative backing during copy not supported yet"));
|
|
|
9119d9 |
+ goto cleanup;
|
|
|
9119d9 |
+ }
|
|
|
9119d9 |
+
|
|
|
9119d9 |
+ flags &= (VIR_DOMAIN_BLOCK_REBASE_SHALLOW |
|
|
|
9119d9 |
+ VIR_DOMAIN_BLOCK_REBASE_REUSE_EXT);
|
|
|
9119d9 |
+ ret = qemuDomainBlockCopy(vm, dom->conn, path, base, format,
|
|
|
9119d9 |
+ bandwidth, flags);
|
|
|
9119d9 |
+ vm = NULL;
|
|
|
9119d9 |
+ cleanup:
|
|
|
9119d9 |
+ if (vm)
|
|
|
9119d9 |
virObjectUnlock(vm);
|
|
|
9119d9 |
- return -1;
|
|
|
9119d9 |
- }
|
|
|
9119d9 |
-
|
|
|
9119d9 |
- if (flags & VIR_DOMAIN_BLOCK_REBASE_COPY) {
|
|
|
9119d9 |
- const char *format = NULL;
|
|
|
9119d9 |
- if (flags & VIR_DOMAIN_BLOCK_REBASE_COPY_RAW)
|
|
|
9119d9 |
- format = "raw";
|
|
|
9119d9 |
- flags &= ~(VIR_DOMAIN_BLOCK_REBASE_COPY |
|
|
|
9119d9 |
- VIR_DOMAIN_BLOCK_REBASE_COPY_RAW);
|
|
|
9119d9 |
- return qemuDomainBlockCopy(vm, dom->conn, path, base, format, bandwidth, flags);
|
|
|
9119d9 |
- }
|
|
|
9119d9 |
-
|
|
|
9119d9 |
- return qemuDomainBlockJobImpl(vm, dom->conn, path, base, bandwidth, NULL,
|
|
|
9119d9 |
- BLOCK_JOB_PULL, flags);
|
|
|
9119d9 |
+ return ret;
|
|
|
9119d9 |
}
|
|
|
9119d9 |
|
|
|
9119d9 |
static int
|
|
|
9119d9 |
--
|
|
|
9119d9 |
2.3.0
|
|
|
9119d9 |
|