Now that we are able to select images from the backing chain via indexed
access we should also convert possible network sources to
qemu-compatible strings before passing them to qemu.
---
 src/qemu/qemu_capabilities.c |  5 +++++
 src/qemu/qemu_capabilities.h |  1 +
 src/qemu/qemu_driver.c       | 33 +++++++++++++++++++++++++++++----
 3 files changed, 35 insertions(+), 4 deletions(-)

diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 03d8842..ccd9a93 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -256,6 +256,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
               "usb-kbd", /* 165 */
               "host-pci-multidomain",
               "msg-timestamp",
+              "block-commit-backing-name",
     );


@@ -3100,6 +3101,10 @@ virQEMUCapsInitQMPMonitor(virQEMUCapsPtr qemuCaps,
     if (virQEMUCapsProbeQMPCommandLine(qemuCaps, mon) < 0)
         goto cleanup;

+    /* TODO, WIP: We shall test this */
+    if (qemuCaps->version >= 2000000)
+        virQEMUCapsSet(qemuCaps, QEMU_CAPS_BLOCKPULL_BACKING_NAME);
+
     ret = 0;
  cleanup:
     VIR_FREE(package);
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index d755caa..773298d 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -206,6 +206,7 @@ enum virQEMUCapsFlags {
     QEMU_CAPS_DEVICE_USB_KBD     = 165, /* -device usb-kbd */
     QEMU_CAPS_HOST_PCI_MULTIDOMAIN = 166, /* support domain > 0 in host pci 
address */
     QEMU_CAPS_MSG_TIMESTAMP      = 167, /* -msg timestamp */
+    QEMU_CAPS_BLOCKPULL_BACKING_NAME = 168, /* support for backing name 
tweaking */

     QEMU_CAPS_LAST,                   /* this must always be the last item */
 };
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index e2eccee..1e7ad1a 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -15414,8 +15414,12 @@ qemuDomainBlockCommit(virDomainPtr dom,
     unsigned int baseIndex = 0;
     const char *top_parent = NULL;
     bool clean_access = false;
+    char *topPath = NULL;
+    char *basePath = NULL;
+    char *backingPath = NULL;

-    virCheckFlags(VIR_DOMAIN_BLOCK_COMMIT_SHALLOW, -1);
+    virCheckFlags(VIR_DOMAIN_BLOCK_COMMIT_SHALLOW |
+                  VIR_DOMAIN_BLOCK_COMMIT_RELATIVE, -1);

     if (!(vm = qemuDomObjFromDomain(dom)))
         goto cleanup;
@@ -15500,6 +15504,26 @@ qemuDomainBlockCommit(virDomainPtr dom,
                                                VIR_DISK_CHAIN_READ_WRITE) < 0))
         goto endjob;

+    if (qemuGetDriveSourceString(topSource, NULL, &topPath) < 0)
+        goto endjob;
+
+    if (qemuGetDriveSourceString(baseSource, NULL, &basePath) < 0)
+        goto endjob;
+
+    if (flags & VIR_DOMAIN_BLOCK_COMMIT_RELATIVE) {
+        if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKPULL_BACKING_NAME)) 
{
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                           _("this qemu doesn't support relative blockpull"));
+            goto endjob;
+        }
+
+        if (virStorageFileGetRelativeBackingPath(topSource, baseSource,
+                                                 &backingPath) < 0)
+            goto endjob;
+
+        /* XXX should we error out? */
+    }
+
     /* Start the commit operation.  Pass the user's original spelling,
      * if any, through to qemu, since qemu may behave differently
      * depending on whether the input was specified as relative or
@@ -15507,9 +15531,7 @@ qemuDomainBlockCommit(virDomainPtr dom,
      * thing if the user specified a relative name). */
     qemuDomainObjEnterMonitor(driver, vm);
     ret = qemuMonitorBlockCommit(priv->mon, device,
-                                 top && !topIndex ? top : topSource->path,
-                                 base && !baseIndex ? base : baseSource->path,
-                                 NULL,
+                                 topPath, basePath, backingPath,
                                  bandwidth);
     qemuDomainObjExitMonitor(driver, vm);

@@ -15527,6 +15549,9 @@ qemuDomainBlockCommit(virDomainPtr dom,
         vm = NULL;

  cleanup:
+    VIR_FREE(topPath);
+    VIR_FREE(basePath);
+    VIR_FREE(backingPath);
     VIR_FREE(device);
     if (vm)
         virObjectUnlock(vm);
-- 
1.9.3

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to