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;