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: f5a77198bf
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
This commit is contained in:
Peter Krempa 2023-01-09 14:35:52 +01:00
parent 64366c0056
commit d9193ff92b
3 changed files with 16 additions and 15 deletions

View 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;

View 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);

View 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;