summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPeter Krempa <pkrempa@redhat.com>2023-01-09 14:35:52 +0100
committerPeter Krempa <pkrempa@redhat.com>2023-01-09 14:40:39 +0100
commitd9193ff92bd8f846fb3a616f647bd53430a444b5 (patch)
tree261ed2e936394df7ca5238970c1da316c777d0c8 /src
parent64366c005693a2fc389e3f61dbc68259ead2c260 (diff)
downloadlibvirt-d9193ff92bd8f846fb3a616f647bd53430a444b5.tar.gz
qemu: Fix variable sizing issues with 'bandwidth' argument of qemuBlockCommit
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>
Diffstat (limited to 'src')
-rw-r--r--src/qemu/qemu_block.c15
-rw-r--r--src/qemu/qemu_block.h2
-rw-r--r--src/qemu/qemu_driver.c14
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;