]> xenbits.xensource.com Git - libvirt.git/commitdiff
blockjob: shuffle block rebase code
authorEric Blake <eblake@redhat.com>
Fri, 29 Aug 2014 19:27:18 +0000 (13:27 -0600)
committerEric Blake <eblake@redhat.com>
Thu, 4 Sep 2014 23:23:33 +0000 (17:23 -0600)
The existing virDomainBlockRebase code rejected the combination of
_RELATIVE and _COPY flags, but only by accident.  It makes sense
to add support for the combination someday, at least for the case
of _SHALLOW and not _REUSE_EXT; but to implement it, libvirt would
have to pre-create the file with a relative backing name, and I'm
not ready to code that in yet.

Meanwhile, the code to forward on to the block copy code is getting
longer, and reorganizing the function to have the block pull done
early makes it easier to add even more block copy prep code.

This patch should have no semantic difference other than the quality
of the error message on the unsupported flag combination.  Pre-patch:

error: unsupported flags (0x10) in function qemuDomainBlockCopy

Post-patch:

error: argument unsupported: Relative backing during copy not supported yet

* src/qemu/qemu_driver.c (qemuDomainBlockRebase): Reorder code,
and improve error message of relative copy.

Signed-off-by: Eric Blake <eblake@redhat.com>
src/qemu/qemu_driver.c

index 5121f855bbd4895db760815e327533e1702af36a..94d48fba143d6da51be9967d857ed0cd3d0c1367 100644 (file)
@@ -15467,6 +15467,8 @@ qemuDomainBlockRebase(virDomainPtr dom, const char *path, const char *base,
                       unsigned long bandwidth, unsigned int flags)
 {
     virDomainObjPtr vm;
+    const char *format = NULL;
+    int ret = -1;
 
     virCheckFlags(VIR_DOMAIN_BLOCK_REBASE_SHALLOW |
                   VIR_DOMAIN_BLOCK_REBASE_REUSE_EXT |
@@ -15477,22 +15479,37 @@ qemuDomainBlockRebase(virDomainPtr dom, const char *path, const char *base,
     if (!(vm = qemuDomObjFromDomain(dom)))
         return -1;
 
-    if (virDomainBlockRebaseEnsureACL(dom->conn, vm->def) < 0) {
-        virObjectUnlock(vm);
-        return -1;
-    }
+    if (virDomainBlockRebaseEnsureACL(dom->conn, vm->def) < 0)
+        goto cleanup;
+
+    /* For normal rebase (enhanced blockpull), the common code handles
+     * everything, including vm cleanup. */
+    if (!(flags & VIR_DOMAIN_BLOCK_REBASE_COPY))
+        return qemuDomainBlockJobImpl(vm, dom->conn, path, base, bandwidth,
+                                      NULL, BLOCK_JOB_PULL, flags);
+
+    /* If we got here, we are doing a block copy rebase. */
+    if (flags & VIR_DOMAIN_BLOCK_REBASE_COPY_RAW)
+        format = "raw";
 
-    if (flags & VIR_DOMAIN_BLOCK_REBASE_COPY) {
-        const char *format = NULL;
-        if (flags & VIR_DOMAIN_BLOCK_REBASE_COPY_RAW)
-            format = "raw";
-        flags &= ~(VIR_DOMAIN_BLOCK_REBASE_COPY |
-                   VIR_DOMAIN_BLOCK_REBASE_COPY_RAW);
-        return qemuDomainBlockCopy(vm, dom->conn, path, base, format, bandwidth, flags);
+    /* XXX: If we are doing a shallow copy but not reusing an external
+     * file, we should attempt to pre-create the destination with a
+     * relative backing chain instead of qemu's default of absolute */
+    if (flags & VIR_DOMAIN_BLOCK_REBASE_RELATIVE) {
+        virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
+                       _("Relative backing during copy not supported yet"));
+        goto cleanup;
     }
 
-    return qemuDomainBlockJobImpl(vm, dom->conn, path, base, bandwidth, NULL,
-                                  BLOCK_JOB_PULL, flags);
+    flags &= (VIR_DOMAIN_BLOCK_REBASE_SHALLOW |
+              VIR_DOMAIN_BLOCK_REBASE_REUSE_EXT);
+    ret = qemuDomainBlockCopy(vm, dom->conn, path, base, format,
+                              bandwidth, flags);
+    vm = NULL;
+ cleanup:
+    if (vm)
+        virObjectUnlock(vm);
+    return ret;
 }
 
 static int