[PATCH (pushed)] qemu: Fix variable sizing issues with 'bandwidth' argument of qemuBlockCommit

Peter Krempa pkrempa at redhat.com
Mon Jan 9 13:42:44 UTC 2023


The patch moving the code didn't faithfully represent the typecasting
of the 'bandwidth' variable needed to properly convert from the legacy
'unsigned long' argument which resulted in a build failure on 32 bit
systems:

../src/qemu/qemu_block.c: In function ‘qemuBlockCommit’:
../src/qemu/qemu_block.c:3249:23: error: comparison is always false due to limited range of data type [-Werror=type-limits]
 3249 |         if (bandwidth > LLONG_MAX >> 20) {
      |                       ^

Fix it by returning the check into qemuDomainBlockCommit as it's needed
only because of the legacy argument type in the old API and use
'unsigned long long' for qemuBlockCommit.

Fixes: f5a77198bf9
Signed-off-by: Peter Krempa <pkrempa at redhat.com>
---

Pushed under the build-breaker rule.

 src/qemu/qemu_block.c  | 15 ++-------------
 src/qemu/qemu_block.h  |  2 +-
 src/qemu/qemu_driver.c | 14 +++++++++++++-
 3 files changed, 16 insertions(+), 15 deletions(-)

diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c
index 7ea42961b6..9bfb06ac08 100644
--- a/src/qemu/qemu_block.c
+++ b/src/qemu/qemu_block.c
@@ -3205,7 +3205,7 @@ qemuBlockExportAddNBD(virDomainObj *vm,
  * @baseSource: disk source within backing chain to commit data into
  * @topSource: disk source within backing chain with data we will commit
  * @top_parent: disk source that has @topSource as backing disk
- * @bandwidth: bandwidth limit, flags determine the unit
+ * @bandwidth: bandwidth limit in bytes/s
  * @asyncJob: qemu async job type
  * @autofinalize: virTristateBool controlling qemu block job finalization
  * @flags: bitwise-OR of virDomainBlockCommitFlags
@@ -3227,7 +3227,7 @@ qemuBlockCommit(virDomainObj *vm,
                 virStorageSource *baseSource,
                 virStorageSource *topSource,
                 virStorageSource *top_parent,
-                unsigned long bandwidth,
+                unsigned long long bandwidth,
                 virDomainAsyncJob asyncJob,
                 virTristateBool autofinalize,
                 unsigned int flags)
@@ -3244,17 +3244,6 @@ qemuBlockCommit(virDomainObj *vm,
     if (virDomainObjCheckActive(vm) < 0)
         return NULL;

-    /* Convert bandwidth MiB to bytes, if necessary */
-    if (!(flags & VIR_DOMAIN_BLOCK_COMMIT_BANDWIDTH_BYTES)) {
-        if (bandwidth > LLONG_MAX >> 20) {
-            virReportError(VIR_ERR_OVERFLOW,
-                           _("bandwidth must be less than %llu"),
-                           LLONG_MAX >> 20);
-            return NULL;
-        }
-        bandwidth <<= 20;
-    }
-
     if (!qemuDomainDiskBlockJobIsSupported(disk))
         return NULL;

diff --git a/src/qemu/qemu_block.h b/src/qemu/qemu_block.h
index a8079c2207..eac986e0f0 100644
--- a/src/qemu/qemu_block.h
+++ b/src/qemu/qemu_block.h
@@ -283,7 +283,7 @@ qemuBlockCommit(virDomainObj *vm,
                 virStorageSource *baseSource,
                 virStorageSource *topSource,
                 virStorageSource *top_parent,
-                unsigned long bandwidth,
+                unsigned long long bandwidth,
                 virDomainAsyncJob asyncJob,
                 virTristateBool autofinalize,
                 unsigned int flags);
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 3ea48c9049..d9f7ce234e 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -14994,6 +14994,7 @@ qemuDomainBlockCommit(virDomainPtr dom,
     virStorageSource *topSource;
     virStorageSource *baseSource = NULL;
     virStorageSource *top_parent = NULL;
+    unsigned long long speed = bandwidth;
     g_autoptr(qemuBlockJobData) job = NULL;

     virCheckFlags(VIR_DOMAIN_BLOCK_COMMIT_SHALLOW |
@@ -15011,6 +15012,17 @@ qemuDomainBlockCommit(virDomainPtr dom,
     if (virDomainObjBeginJob(vm, VIR_JOB_MODIFY) < 0)
         goto cleanup;

+    /* Convert bandwidth MiB to bytes, if necessary */
+    if (!(flags & VIR_DOMAIN_BLOCK_COMMIT_BANDWIDTH_BYTES)) {
+        if (speed > LLONG_MAX >> 20) {
+            virReportError(VIR_ERR_OVERFLOW,
+                           _("bandwidth must be less than %llu"),
+                           LLONG_MAX >> 20);
+            goto endjob;
+        }
+        speed <<= 20;
+    }
+
     if (!(disk = qemuDomainDiskByName(vm->def, path)))
         goto endjob;

@@ -15027,7 +15039,7 @@ qemuDomainBlockCommit(virDomainPtr dom,
         goto endjob;

     job = qemuBlockCommit(vm, disk, baseSource, topSource, top_parent,
-                          bandwidth, VIR_ASYNC_JOB_NONE, VIR_TRISTATE_BOOL_YES,
+                          speed, VIR_ASYNC_JOB_NONE, VIR_TRISTATE_BOOL_YES,
                           flags);
     if (job)
         ret = 0;
-- 
2.38.1



More information about the libvir-list mailing list