]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Fix variable sizing issues with 'bandwidth' argument of qemuBlockCommit
authorPeter Krempa <pkrempa@redhat.com>
Mon, 9 Jan 2023 13:35:52 +0000 (14:35 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 9 Jan 2023 13:40:39 +0000 (14:40 +0100)
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@redhat.com>
src/qemu/qemu_block.c
src/qemu/qemu_block.h
src/qemu/qemu_driver.c

index 7ea42961b660a597300335b573a0046c8717fea6..9bfb06ac08424900528048ef28d0babb91df8b8a 100644 (file)
@@ -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;
 
index a8079c22074fea62e19e2af480088bbe869f3b00..eac986e0f0d28cc87d23535cd766f661fdabf29a 100644 (file)
@@ -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);
index 3ea48c9049398a6dc0223bc54538c1eeb849c09c..d9f7ce234e6a89bccfaa8299075e82d14c08379b 100644 (file)
@@ -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;