[libvirt] [PATCH 1/3] qemu: Remove support for legacy block jobs

Peter Krempa pkrempa at redhat.com
Wed Sep 13 13:52:01 UTC 2017


Block job QMP commands with underscores rather than dashes were never
released in upstream qemu, (they were added, but modified in the same
release [1]), but a certain distro managed to backport the version in the
middle.

The change also slightly modified semantics for the abort command, which
made us have a lot of code which was only ever present in certain
downstream distros.

Clean the upstream code from the legacy cruft and support only the
upstream implementations.

[1] See qemu commit v1.0-2176-gdb58f9c060
---
 src/qemu/qemu_domain.c | 13 +++--------
 src/qemu/qemu_domain.h |  2 +-
 src/qemu/qemu_driver.c | 60 +++++++++++++-------------------------------------
 3 files changed, 19 insertions(+), 56 deletions(-)

diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 664366b9d..05f8e9488 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -6434,29 +6434,22 @@ qemuDomainGetMonitor(virDomainObjPtr vm)
 /**
  * qemuDomainSupportsBlockJobs:
  * @vm: domain object
- * @modern: pointer to bool that returns whether modern block jobs are supported
  *
  * Returns -1 in case when qemu does not support block jobs at all. Otherwise
- * returns 0 and optionally fills @modern to denote that modern (async) block
- * jobs are supported.
+ * returns 0.
  */
 int
-qemuDomainSupportsBlockJobs(virDomainObjPtr vm,
-                            bool *modern)
+qemuDomainSupportsBlockJobs(virDomainObjPtr vm)
 {
     qemuDomainObjPrivatePtr priv = vm->privateData;
     bool asynchronous = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKJOB_ASYNC);
-    bool synchronous = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKJOB_SYNC);

-    if (!synchronous && !asynchronous) {
+    if (!asynchronous) {
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                        _("block jobs not supported with this QEMU binary"));
         return -1;
     }

-    if (modern)
-        *modern = asynchronous;
-
     return 0;
 }

diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index 468308e4b..b291dc308 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -715,7 +715,7 @@ int qemuDomainJobInfoToParams(qemuDomainJobInfoPtr jobInfo,
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
     ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4);

-int qemuDomainSupportsBlockJobs(virDomainObjPtr vm, bool *modern)
+int qemuDomainSupportsBlockJobs(virDomainObjPtr vm)
     ATTRIBUTE_NONNULL(1);
 bool qemuDomainDiskBlockJobIsActive(virDomainDiskDefPtr disk);
 bool qemuDomainHasBlockjob(virDomainObjPtr vm, bool copy_only)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index e95683965..c7d93dcb2 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -16413,7 +16413,6 @@ qemuDomainBlockPullCommon(virQEMUDriverPtr driver,
 {
     qemuDomainObjPrivatePtr priv = vm->privateData;
     char *device = NULL;
-    bool modern;
     virDomainDiskDefPtr disk;
     virStorageSourcePtr baseSource = NULL;
     unsigned int baseIndex = 0;
@@ -16438,25 +16437,9 @@ qemuDomainBlockPullCommon(virQEMUDriverPtr driver,
         goto endjob;
     }

-    if (qemuDomainSupportsBlockJobs(vm, &modern) < 0)
+    if (qemuDomainSupportsBlockJobs(vm) < 0)
         goto endjob;

-    if (!modern) {
-        if (base) {
-            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                           _("partial block pull not supported with this "
-                             "QEMU binary"));
-            goto endjob;
-        }
-
-        if (bandwidth) {
-            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                           _("setting bandwidth at start of block pull not "
-                             "supported with this QEMU binary"));
-            goto endjob;
-        }
-    }
-
     if (!(disk = qemuDomainDiskByName(vm->def, path)))
         goto endjob;

@@ -16511,7 +16494,7 @@ qemuDomainBlockPullCommon(virQEMUDriverPtr driver,
                                              baseSource);
     if (!baseSource || basePath)
         ret = qemuMonitorBlockStream(priv->mon, device, basePath, backingPath,
-                                     speed, modern);
+                                     speed, true);
     if (qemuDomainObjExitMonitor(driver, vm) < 0)
         ret = -1;

@@ -16542,7 +16525,6 @@ qemuDomainBlockJobAbort(virDomainPtr dom,
     virDomainDiskDefPtr disk = NULL;
     virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
     bool save = false;
-    bool modern;
     bool pivot = !!(flags & VIR_DOMAIN_BLOCK_JOB_ABORT_PIVOT);
     bool async = !!(flags & VIR_DOMAIN_BLOCK_JOB_ABORT_ASYNC);
     virDomainObjPtr vm;
@@ -16566,7 +16548,7 @@ qemuDomainBlockJobAbort(virDomainPtr dom,
         goto endjob;
     }

-    if (qemuDomainSupportsBlockJobs(vm, &modern) < 0)
+    if (qemuDomainSupportsBlockJobs(vm) < 0)
         goto endjob;

     if (!(disk = qemuDomainDiskByName(vm->def, path)))
@@ -16583,7 +16565,7 @@ qemuDomainBlockJobAbort(virDomainPtr dom,
         goto endjob;
     }

-    if (modern && !async)
+    if (!async)
         qemuBlockJobSyncBegin(disk);

     if (pivot) {
@@ -16596,7 +16578,7 @@ qemuDomainBlockJobAbort(virDomainPtr dom,
         }

         qemuDomainObjEnterMonitor(driver, vm);
-        ret = qemuMonitorBlockJobCancel(qemuDomainGetMonitor(vm), device, modern);
+        ret = qemuMonitorBlockJobCancel(qemuDomainGetMonitor(vm), device, true);
         if (qemuDomainObjExitMonitor(driver, vm) < 0) {
             ret = -1;
             goto endjob;
@@ -16623,25 +16605,14 @@ qemuDomainBlockJobAbort(virDomainPtr dom,
      * while still holding the VM job, to prevent newly scheduled
      * block jobs from confusing us.  */
     if (!async) {
-        if (!modern) {
-            /* Older qemu that lacked async reporting also lacked
-             * blockcopy and active commit, so we can hardcode the
-             * event to pull and let qemuBlockJobEventProcess() handle
-             * the rest as usual */
-            qemuBlockJobEventProcess(driver, vm, disk,
-                                     QEMU_ASYNC_JOB_NONE,
-                                     VIR_DOMAIN_BLOCK_JOB_TYPE_PULL,
-                                     VIR_DOMAIN_BLOCK_JOB_CANCELED);
-        } else {
-            qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
-            qemuBlockJobUpdate(driver, vm, QEMU_ASYNC_JOB_NONE, disk);
-            while (diskPriv->blockjob) {
-                if (virDomainObjWait(vm) < 0) {
-                    ret = -1;
-                    goto endjob;
-                }
-                qemuBlockJobUpdate(driver, vm, QEMU_ASYNC_JOB_NONE, disk);
+        qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
+        qemuBlockJobUpdate(driver, vm, QEMU_ASYNC_JOB_NONE, disk);
+        while (diskPriv->blockjob) {
+            if (virDomainObjWait(vm) < 0) {
+                ret = -1;
+                goto endjob;
             }
+            qemuBlockJobUpdate(driver, vm, QEMU_ASYNC_JOB_NONE, disk);
         }
     }

@@ -16728,7 +16699,7 @@ qemuDomainGetBlockJobInfo(virDomainPtr dom,
         goto endjob;
     }

-    if (qemuDomainSupportsBlockJobs(vm, NULL) < 0)
+    if (qemuDomainSupportsBlockJobs(vm) < 0)
         goto endjob;

     if (!(disk = virDomainDiskByName(vm->def, path, true))) {
@@ -16784,7 +16755,6 @@ qemuDomainBlockJobSetSpeed(virDomainPtr dom,
     virDomainDiskDefPtr disk;
     int ret = -1;
     virDomainObjPtr vm;
-    bool modern;
     const char *device;
     unsigned long long speed = bandwidth;

@@ -16816,7 +16786,7 @@ qemuDomainBlockJobSetSpeed(virDomainPtr dom,
         goto endjob;
     }

-    if (qemuDomainSupportsBlockJobs(vm, &modern) < 0)
+    if (qemuDomainSupportsBlockJobs(vm) < 0)
         goto endjob;

     if (!(disk = qemuDomainDiskByName(vm->def, path)))
@@ -16829,7 +16799,7 @@ qemuDomainBlockJobSetSpeed(virDomainPtr dom,
     ret = qemuMonitorBlockJobSetSpeed(qemuDomainGetMonitor(vm),
                                       device,
                                       speed,
-                                      modern);
+                                      true);
     if (qemuDomainObjExitMonitor(driver, vm) < 0)
         ret = -1;

-- 
2.14.1




More information about the libvir-list mailing list