]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
qemu: monitor: Add support for backing name specification for block-stream
authorPeter Krempa <pkrempa@redhat.com>
Fri, 16 May 2014 15:51:21 +0000 (17:51 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Fri, 4 Jul 2014 11:00:17 +0000 (13:00 +0200)
To allow changing the name that is recorded in the top of the current
image chain used in a block pull/rebase operation, we need to specify
the backing name to qemu. This is done via the "backing-file" attribute
to the block-stream commad.

src/qemu/qemu_driver.c
src/qemu/qemu_migration.c
src/qemu/qemu_monitor.c
src/qemu/qemu_monitor.h
src/qemu/qemu_monitor_json.c
src/qemu/qemu_monitor_json.h

index ec9b7a69bb738c05d5fb79407278b0771de7397d..2d1aa9ebd81411d5487a80311b76b2c0a6d25819 100644 (file)
@@ -14873,7 +14873,7 @@ qemuDomainBlockPivot(virConnectPtr conn,
     /* Probe the status, if needed.  */
     if (!disk->mirroring) {
         qemuDomainObjEnterMonitor(driver, vm);
-        rc = qemuMonitorBlockJob(priv->mon, device, NULL, 0, &info,
+        rc = qemuMonitorBlockJob(priv->mon, device, NULL, NULL, 0, &info,
                                   BLOCK_JOB_INFO, true);
         qemuDomainObjExitMonitor(driver, vm);
         if (rc < 0)
@@ -15090,7 +15090,7 @@ qemuDomainBlockJobImpl(virDomainObjPtr vm,
     qemuDomainObjEnterMonitor(driver, vm);
     ret = qemuMonitorBlockJob(priv->mon, device,
                               baseIndex ? baseSource->path : base,
-                              bandwidth, info, mode, async);
+                              NULL, bandwidth, info, mode, async);
     qemuDomainObjExitMonitor(driver, vm);
     if (ret < 0)
         goto endjob;
@@ -15135,8 +15135,8 @@ qemuDomainBlockJobImpl(virDomainObjPtr vm,
                 virDomainBlockJobInfo dummy;
 
                 qemuDomainObjEnterMonitor(driver, vm);
-                ret = qemuMonitorBlockJob(priv->mon, device, NULL, 0, &dummy,
-                                          BLOCK_JOB_INFO, async);
+                ret = qemuMonitorBlockJob(priv->mon, device, NULL, NULL, 0,
+                                          &dummy, BLOCK_JOB_INFO, async);
                 qemuDomainObjExitMonitor(driver, vm);
 
                 if (ret <= 0)
index dc25242d69e45c5f187ea05d73d81bca4b1cc724..7aa772a8df9ce88a57679eba830933d02500e7cb 100644 (file)
@@ -1305,7 +1305,7 @@ qemuMigrationDriveMirror(virQEMUDriverPtr driver,
                                _("canceled by client"));
                 goto error;
             }
-            mon_ret = qemuMonitorBlockJob(priv->mon, diskAlias, NULL, 0,
+            mon_ret = qemuMonitorBlockJob(priv->mon, diskAlias, NULL, NULL, 0,
                                           &info, BLOCK_JOB_INFO, true);
             qemuDomainObjExitMonitor(driver, vm);
 
@@ -1357,7 +1357,7 @@ qemuMigrationDriveMirror(virQEMUDriverPtr driver,
             continue;
         if (qemuDomainObjEnterMonitorAsync(driver, vm,
                                            QEMU_ASYNC_JOB_MIGRATION_OUT) == 0) {
-            if (qemuMonitorBlockJob(priv->mon, diskAlias, NULL, 0,
+            if (qemuMonitorBlockJob(priv->mon, diskAlias, NULL, NULL, 0,
                                     NULL, BLOCK_JOB_ABORT, true) < 0) {
                 VIR_WARN("Unable to cancel block-job on '%s'", diskAlias);
             }
@@ -1423,7 +1423,7 @@ qemuMigrationCancelDriveMirror(qemuMigrationCookiePtr mig,
                                            QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
             goto cleanup;
 
-        if (qemuMonitorBlockJob(priv->mon, diskAlias, NULL, 0,
+        if (qemuMonitorBlockJob(priv->mon, diskAlias, NULL, NULL, 0,
                                 NULL, BLOCK_JOB_ABORT, true) < 0)
             VIR_WARN("Unable to stop block job on %s", diskAlias);
         qemuDomainObjExitMonitor(driver, vm);
index 08db6cda4c13fee60d8c415dad9fad692e6c2938..db3dd730bc0771c9692b43770782bdebb815ce58 100644 (file)
@@ -3362,6 +3362,7 @@ int qemuMonitorScreendump(qemuMonitorPtr mon,
 int qemuMonitorBlockJob(qemuMonitorPtr mon,
                         const char *device,
                         const char *base,
+                        const char *backingName,
                         unsigned long bandwidth,
                         virDomainBlockJobInfoPtr info,
                         qemuMonitorBlockJobCmd mode,
@@ -3370,9 +3371,10 @@ int qemuMonitorBlockJob(qemuMonitorPtr mon,
     int ret = -1;
     unsigned long long speed;
 
-    VIR_DEBUG("mon=%p, device=%s, base=%s, bandwidth=%luM, info=%p, mode=%o, "
-              "modern=%d", mon, device, NULLSTR(base), bandwidth, info, mode,
-              modern);
+    VIR_DEBUG("mon=%p, device=%s, base=%s, backingName=%s, bandwidth=%luM, "
+              "info=%p, mode=%o, modern=%d",
+              mon, device, NULLSTR(base), NULLSTR(backingName),
+              bandwidth, info, mode, modern);
 
     /* Convert bandwidth MiB to bytes - unfortunately the JSON QMP protocol is
      * limited to LLONG_MAX also for unsigned values */
@@ -3386,8 +3388,8 @@ int qemuMonitorBlockJob(qemuMonitorPtr mon,
     speed <<= 20;
 
     if (mon->json)
-        ret = qemuMonitorJSONBlockJob(mon, device, base, speed, info, mode,
-                                      modern);
+        ret = qemuMonitorJSONBlockJob(mon, device, base, backingName,
+                                      speed, info, mode, modern);
     else
         virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
                        _("block jobs require JSON monitor"));
index 4652ea5e75183caf21f6c64c549712b9bc1e8ed7..8a23267c1c5527d7b2a06ec489e2e1cd8668c1e2 100644 (file)
@@ -692,7 +692,8 @@ typedef enum {
 
 int qemuMonitorBlockJob(qemuMonitorPtr mon,
                         const char *device,
-                        const char *back,
+                        const char *base,
+                        const char *backingName,
                         unsigned long bandwidth,
                         virDomainBlockJobInfoPtr info,
                         qemuMonitorBlockJobCmd mode,
index 7af5b79e1cb929d02cc5806d27ba014a0d12baf8..bef6a14144f7ecb876bcfb6a60960003cb26f967 100644 (file)
@@ -3789,6 +3789,7 @@ int
 qemuMonitorJSONBlockJob(qemuMonitorPtr mon,
                         const char *device,
                         const char *base,
+                        const char *backingName,
                         unsigned long long speed,
                         virDomainBlockJobInfoPtr info,
                         qemuMonitorBlockJobCmd mode,
@@ -3804,6 +3805,19 @@ qemuMonitorJSONBlockJob(qemuMonitorPtr mon,
                        _("only modern block pull supports base: %s"), base);
         return -1;
     }
+
+    if (backingName && mode != BLOCK_JOB_PULL) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("backing name is supported only for block pull"));
+        return -1;
+    }
+
+    if (backingName && !base) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("backing name requires a base image"));
+        return -1;
+    }
+
     if (speed && mode == BLOCK_JOB_PULL && !modern) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("only modern block pull supports speed: %llu"),
@@ -3838,6 +3852,7 @@ qemuMonitorJSONBlockJob(qemuMonitorPtr mon,
                                          "s:device", device,
                                          "P:speed", speed,
                                          "S:base", base,
+                                         "S:backing-file", backingName,
                                          NULL);
         break;
     }
index 652a4b65e4599dd2b4a2bd1b991087aa44e187ed..385211c421cebb6ba7d5593413f645226dbdf53a 100644 (file)
@@ -283,6 +283,7 @@ int qemuMonitorJSONScreendump(qemuMonitorPtr mon,
 int qemuMonitorJSONBlockJob(qemuMonitorPtr mon,
                             const char *device,
                             const char *base,
+                            const char *backingName,
                             unsigned long long speed,
                             virDomainBlockJobInfoPtr info,
                             qemuMonitorBlockJobCmd mode,