]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Limit maximum block device I/O tune values
authorMartin Kletzander <mkletzan@redhat.com>
Wed, 20 Apr 2016 14:14:02 +0000 (16:14 +0200)
committerCole Robinson <crobinso@redhat.com>
Wed, 4 May 2016 22:45:50 +0000 (18:45 -0400)
The values are currently limited to LLONG_MAX which causes some
problems.  QEMU conveniently changed their maximum to 1e15 (1 PB) which
is enough for some time and we need to adapt to that so that we don't
throw "Unknown error" messages.  Strictly limiting these values actually
fixes some corner case values (off-by-one checks in QEMU probably).

Since values out of the new specified range do not overflow anything,
change the type of error as well.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1317531

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
(cherry picked from commit 2d04f6de77d437fa60361950e5f18fac8c1c922d)

src/qemu/qemu_command.c
src/qemu/qemu_command.h
src/qemu/qemu_driver.c

index 03f9a6c092f126bd7c63ea138fadb276b26fb775..78e0cabc3e07df0b736a8864997597e8b90091cc 100644 (file)
@@ -1400,22 +1400,22 @@ qemuBuildDriveStr(virConnectPtr conn,
         goto error;
     }
 
-    if (disk->blkdeviotune.total_bytes_sec > LLONG_MAX ||
-        disk->blkdeviotune.read_bytes_sec > LLONG_MAX ||
-        disk->blkdeviotune.write_bytes_sec > LLONG_MAX ||
-        disk->blkdeviotune.total_iops_sec > LLONG_MAX ||
-        disk->blkdeviotune.read_iops_sec > LLONG_MAX ||
-        disk->blkdeviotune.write_iops_sec > LLONG_MAX ||
-        disk->blkdeviotune.total_bytes_sec_max > LLONG_MAX ||
-        disk->blkdeviotune.read_bytes_sec_max > LLONG_MAX ||
-        disk->blkdeviotune.write_bytes_sec_max > LLONG_MAX ||
-        disk->blkdeviotune.total_iops_sec_max > LLONG_MAX ||
-        disk->blkdeviotune.read_iops_sec_max > LLONG_MAX ||
-        disk->blkdeviotune.write_iops_sec_max > LLONG_MAX ||
-        disk->blkdeviotune.size_iops_sec > LLONG_MAX) {
-        virReportError(VIR_ERR_OVERFLOW,
+    if (disk->blkdeviotune.total_bytes_sec > QEMU_BLOCK_IOTUNE_MAX ||
+        disk->blkdeviotune.read_bytes_sec > QEMU_BLOCK_IOTUNE_MAX ||
+        disk->blkdeviotune.write_bytes_sec > QEMU_BLOCK_IOTUNE_MAX ||
+        disk->blkdeviotune.total_iops_sec > QEMU_BLOCK_IOTUNE_MAX ||
+        disk->blkdeviotune.read_iops_sec > QEMU_BLOCK_IOTUNE_MAX ||
+        disk->blkdeviotune.write_iops_sec > QEMU_BLOCK_IOTUNE_MAX ||
+        disk->blkdeviotune.total_bytes_sec_max > QEMU_BLOCK_IOTUNE_MAX ||
+        disk->blkdeviotune.read_bytes_sec_max > QEMU_BLOCK_IOTUNE_MAX ||
+        disk->blkdeviotune.write_bytes_sec_max > QEMU_BLOCK_IOTUNE_MAX ||
+        disk->blkdeviotune.total_iops_sec_max > QEMU_BLOCK_IOTUNE_MAX ||
+        disk->blkdeviotune.read_iops_sec_max > QEMU_BLOCK_IOTUNE_MAX ||
+        disk->blkdeviotune.write_iops_sec_max > QEMU_BLOCK_IOTUNE_MAX ||
+        disk->blkdeviotune.size_iops_sec > QEMU_BLOCK_IOTUNE_MAX) {
+        virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED,
                       _("block I/O throttle limit must "
-                        "be less than %llu using QEMU"), LLONG_MAX);
+                        "be less than %llu using QEMU"), QEMU_BLOCK_IOTUNE_MAX);
         goto error;
     }
 
index 7c13d459f8c5ceab9902bf2b40c6d064699b99e1..1d027a5120f129506a2a6768ba7438a4b4c43842 100644 (file)
@@ -40,6 +40,8 @@
 # define QEMU_DRIVE_HOST_PREFIX "drive-"
 # define QEMU_FSDEV_HOST_PREFIX "fsdev-"
 
+# define QEMU_BLOCK_IOTUNE_MAX 1000000000000000LL
+
 VIR_ENUM_DECL(qemuVideo)
 
 typedef struct _qemuBuildCommandLineCallbacks qemuBuildCommandLineCallbacks;
index 0434438b28ec9d6571fb7a3be2ebb1ea339e0895..1290f3f5c13407c8c9396820610bba50252abbac 100644 (file)
@@ -17506,10 +17506,10 @@ qemuDomainSetBlockIoTune(virDomainPtr dom,
     for (i = 0; i < nparams; i++) {
         virTypedParameterPtr param = &params[i];
 
-        if (param->value.ul > LLONG_MAX) {
-            virReportError(VIR_ERR_OVERFLOW,
+        if (param->value.ul > QEMU_BLOCK_IOTUNE_MAX) {
+            virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED,
                            _("block I/O throttle limit value must"
-                             " be less than %llu"), LLONG_MAX);
+                             " be less than %llu"), QEMU_BLOCK_IOTUNE_MAX);
             goto endjob;
         }