]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
conf: reject multiple panic devices of same model
authorDmitry Andreev <dandreev@virtuozzo.com>
Tue, 24 Nov 2015 12:26:38 +0000 (15:26 +0300)
committerJiri Denemark <jdenemar@redhat.com>
Wed, 25 Nov 2015 13:46:53 +0000 (14:46 +0100)
Only one panic device per model is allowed.

src/conf/domain_conf.c

index 2bddb67e0d26e2b8b349a93681c9c93bffc978ef..7ec6954ac5a098b54d69f81918984418ac1a46eb 100644 (file)
@@ -3747,6 +3747,28 @@ virDomainDefRejectDuplicateControllers(virDomainDefPtr def)
     return ret;
 }
 
+static int
+virDomainDefRejectDuplicatePanics(virDomainDefPtr def)
+{
+    bool exists[VIR_DOMAIN_PANIC_MODEL_LAST];
+    size_t i;
+
+    for (i = 0; i < VIR_DOMAIN_PANIC_MODEL_LAST; i++)
+         exists[i] = false;
+
+    for (i = 0; i < def->npanics; i++) {
+        virDomainPanicModel model = def->panics[i]->model;
+        if (exists[model]) {
+            virReportError(VIR_ERR_XML_ERROR,
+                           _("Multiple panic devices with model '%s'"),
+                           virDomainPanicModelTypeToString(model));
+            return -1;
+        }
+        exists[model] = true;
+    }
+
+    return 0;
+}
 
 /**
  * virDomainDefMetadataSanitize:
@@ -3976,6 +3998,9 @@ virDomainDefPostParseInternal(virDomainDefPtr def,
     if (virDomainDefRejectDuplicateControllers(def) < 0)
         return -1;
 
+    if (virDomainDefRejectDuplicatePanics(def) < 0)
+        return -1;
+
     /* verify settings of guest timers */
     for (i = 0; i < def->clock.ntimers; i++) {
         virDomainTimerDefPtr timer = def->clock.timers[i];