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(a)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