]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Forbid most duplicated watchdogs
authorMartin Kletzander <mkletzan@redhat.com>
Wed, 19 Apr 2023 12:20:24 +0000 (14:20 +0200)
committerMartin Kletzander <mkletzan@redhat.com>
Thu, 20 Apr 2023 08:17:35 +0000 (10:17 +0200)
Most of them are platform devices and only i6300esb can be plugged
multiple times into different PCI slots.

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/qemu/qemu_validate.c

index b2c3fd1785bc99b87b4a0770b052d56defef98c0..fdfb4c6407e2d1d0a291fb233d36c2643c823951 100644 (file)
@@ -26,6 +26,7 @@
 #include "qemu_domain.h"
 #include "qemu_process.h"
 #include "domain_conf.h"
+#include "virbitmap.h"
 #include "virlog.h"
 #include "virutil.h"
 
@@ -1110,18 +1111,24 @@ qemuValidateDomainDefTPMs(const virDomainDef *def)
 static int
 qemuValidateDomainDefWatchdogs(const virDomainDef *def)
 {
-    bool found_itco = false;
+    g_autoptr(virBitmap) watchdogs = virBitmapNew(VIR_DOMAIN_WATCHDOG_MODEL_LAST);
     size_t i = 0;
 
     for (i = 0; i < def->nwatchdogs; i++) {
+        if (def->watchdogs[i]->model == VIR_DOMAIN_WATCHDOG_MODEL_I6300ESB)
+            continue;
 
-        if (def->watchdogs[i]->model == VIR_DOMAIN_WATCHDOG_MODEL_ITCO) {
-            if (found_itco) {
-                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                               _("Multiple iTCO watchdogs are not supported"));
-                return -1;
-            }
-            found_itco = true;
+        if (virBitmapIsBitSet(watchdogs, def->watchdogs[i]->model)) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                           _("domain can only have one watchdog with model '%1$s'"),
+                           virDomainWatchdogModelTypeToString(def->watchdogs[i]->model));
+            return -1;
+        }
+
+        if (virBitmapSetBit(watchdogs, def->watchdogs[i]->model) < 0) {
+            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                           _("Integrity error in watchdog models"));
+            return -1;
         }
     }