[PATCH v2] qemuDomainDiskChangeSupported: Add missing iothreads check

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Adam Julis <ajulis@xxxxxxxxxx>

GSList of iothreads is not allowed to be changed while the
virtual machine is running.

Resolves: https://issues.redhat.com/browse/RHEL-23607
Signed-off-by: Adam Julis <ajulis@xxxxxxxxxx>
Signed-off-by: Peter Krempa <pkrempa@xxxxxxxxxx>
---

Changes to v1:
 - extrac to separate function
 - improve readability of loops and handling of error
 - fix possibility of infinitely looping if first queue of both queue
   lists matches

 src/qemu/qemu_domain.c | 46 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 46 insertions(+)

diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 66ab4baa8b..153bd56e86 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -6591,6 +6591,49 @@ qemuDomainStorageSourceAccessAllow(virQEMUDriver *driver,
 }


+static bool
+qemuDomainDiskChangeSupportedIothreads(virDomainDiskDef *disk,
+                                       virDomainDiskDef *orig_disk)
+{
+    GSList *old = orig_disk->iothreads;
+    GSList *new = disk->iothreads;
+
+    while (true) {
+        virDomainDiskIothreadDef *old_def;
+        virDomainDiskIothreadDef *new_def;
+        size_t i;
+
+        /* match - both empty or both at the end */
+        if (!old && !new)
+            return true;
+
+        /* mismatched length of lists */
+        if (!old || !new)
+            goto fail;
+
+        old_def = old->data;
+        new_def = new->data;
+
+        if (old_def->id != new_def->id ||
+            old_def->nqueues != new_def->nqueues)
+            goto fail;
+
+        for (i = 0; i < old_def->nqueues; i++) {
+            if (old_def->queues[i] != new_def->queues[i])
+                goto fail;
+        }
+
+        new = new->next;
+        old = old->next;
+    }
+
+ fail:
+    virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
+                   _("cannot modify field '<iothreads>' (or it's parts) of the disk"));
+    return false;
+}
+
+
 /*
  * Makes sure the @disk differs from @orig_disk only by the source
  * path and nothing else.  Fields that are being checked and the
@@ -6735,6 +6778,9 @@ qemuDomainDiskChangeSupported(virDomainDiskDef *disk,
     CHECK_EQ(discard, "discard", true);
     CHECK_EQ(iothread, "iothread", true);

+    if (!qemuDomainDiskChangeSupportedIothreads(disk, orig_disk))
+        return false;
+
     CHECK_STREQ_NULLABLE(domain_name,
                          "backenddomain");

-- 
2.47.0




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux