]> xenbits.xensource.com Git - libvirt.git/commitdiff
conf: introduce virDomainDefBootOrderPostParse
authorJán Tomko <jtomko@redhat.com>
Mon, 28 May 2018 12:31:50 +0000 (14:31 +0200)
committerJán Tomko <jtomko@redhat.com>
Tue, 29 May 2018 08:22:08 +0000 (10:22 +0200)
Move the check for boot elements into a separate function
and remove its dependency on the parser-supplied bootHash table.

Reconstructing the hash table from the domain definition
effectively duplicates the check for duplicate boot order
values, also present in virDomainDeviceBootParseXML.

Now it will also be run on domains created by other means than XML
parsing, since it will be run even for code paths that did not supply
the bootHash table before.

Signed-off-by: Ján Tomko <jtomko@redhat.com>
src/conf/domain_conf.c
tests/qemuargv2xmldata/nomachine-aarch64.xml
tests/qemuargv2xmldata/nomachine-ppc64.xml
tests/qemuargv2xmldata/nomachine-x86_64.xml
tests/sexpr2xmldata/sexpr2xml-fv-kernel.xml

index d6ac47c62935c9d41fae19422932cc7d5032c2e9..c29db147306ff229d9fed333fd0ba6598e1ac896 100644 (file)
@@ -4939,10 +4939,76 @@ virDomainDefPostParseCPU(virDomainDefPtr def)
 }
 
 
+static int
+virDomainDefCollectBootOrder(virDomainDefPtr def ATTRIBUTE_UNUSED,
+                             virDomainDeviceDefPtr dev ATTRIBUTE_UNUSED,
+                             virDomainDeviceInfoPtr info,
+                             void *data)
+{
+    virHashTablePtr bootHash = data;
+    char *order = NULL;
+    int ret = -1;
+
+    if (info->bootIndex == 0)
+        return 0;
+
+    if (virAsprintf(&order, "%u", info->bootIndex) < 0)
+        goto cleanup;
+
+    if (virHashLookup(bootHash, order)) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                       _("boot order '%s' used for more than one device"),
+                       order);
+        goto cleanup;
+    }
+
+    if (virHashAddEntry(bootHash, order, (void *) 1) < 0)
+        goto cleanup;
+
+    ret = 0;
+
+ cleanup:
+    VIR_FREE(order);
+    return ret;
+}
+
+
+static int
+virDomainDefBootOrderPostParse(virDomainDefPtr def)
+{
+    virHashTablePtr bootHash = NULL;
+    int ret = -1;
+
+    if (!(bootHash = virHashCreate(5, NULL)))
+        goto cleanup;
+
+    if (virDomainDeviceInfoIterate(def, virDomainDefCollectBootOrder, bootHash) < 0)
+        goto cleanup;
+
+    if (def->os.nBootDevs > 0 && virHashSize(bootHash) > 0) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                       _("per-device boot elements cannot be used"
+                         " together with os/boot elements"));
+        goto cleanup;
+    }
+
+    if (def->os.nBootDevs == 0 && virHashSize(bootHash) == 0) {
+        def->os.nBootDevs = 1;
+        def->os.bootDevs[0] = VIR_DOMAIN_BOOT_DISK;
+    }
+
+    ret = 0;
+
+ cleanup:
+    virHashFree(bootHash);
+    return ret;
+}
+
+
 static int
 virDomainDefPostParseCommon(virDomainDefPtr def,
                             struct virDomainDefPostParseDeviceIteratorData *data,
-                            virHashTablePtr bootHash)
+                            virHashTablePtr bootHash ATTRIBUTE_UNUSED)
 {
     size_t i;
 
@@ -4953,20 +5019,6 @@ virDomainDefPostParseCommon(virDomainDefPtr def,
         return -1;
     }
 
-    if (def->os.type == VIR_DOMAIN_OSTYPE_HVM && bootHash) {
-        if (def->os.nBootDevs > 0 && virHashSize(bootHash) > 0) {
-            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                           _("per-device boot elements cannot be used"
-                             " together with os/boot elements"));
-            return -1;
-        }
-
-        if (def->os.nBootDevs == 0 && virHashSize(bootHash) == 0) {
-            def->os.nBootDevs = 1;
-            def->os.bootDevs[0] = VIR_DOMAIN_BOOT_DISK;
-        }
-    }
-
     if (virDomainVcpuDefPostParse(def) < 0)
         return -1;
 
@@ -4979,6 +5031,11 @@ virDomainDefPostParseCommon(virDomainDefPtr def,
     if (virDomainDefRejectDuplicatePanics(def) < 0)
         return -1;
 
+    if (def->os.type == VIR_DOMAIN_OSTYPE_HVM &&
+        !(data->xmlopt->config.features & VIR_DOMAIN_DEF_FEATURE_NO_BOOT_ORDER) &&
+        virDomainDefBootOrderPostParse(def) < 0)
+        return -1;
+
     if (virDomainDefPostParseTimer(def) < 0)
         return -1;
 
index eb8f9db803c1a3a05068916e072f716e95d1facc..9492423389bb72c568f400d2ae894ded5524b43f 100644 (file)
@@ -6,6 +6,7 @@
   <vcpu placement='static'>1</vcpu>
   <os>
     <type arch='aarch64' machine='virt'>hvm</type>
+    <boot dev='hd'/>
   </os>
   <features>
     <gic version='2'/>
index 439f9e9ac6d0d6399bb2917a24c48763f938347b..1f15a950e3a8599f18cf2c8a975d1ba03d9a76b5 100644 (file)
@@ -6,6 +6,7 @@
   <vcpu placement='static'>1</vcpu>
   <os>
     <type arch='ppc64' machine='pseries'>hvm</type>
+    <boot dev='hd'/>
   </os>
   <clock offset='utc'/>
   <on_poweroff>destroy</on_poweroff>
index 71a36f0833ca9ef9350d469a579f740af0da5f78..33cde4c55a0fc66e60285545f20b08b088910b9b 100644 (file)
@@ -6,6 +6,7 @@
   <vcpu placement='static'>1</vcpu>
   <os>
     <type arch='x86_64' machine='pc-0.11'>hvm</type>
+    <boot dev='hd'/>
   </os>
   <features>
     <acpi/>
index afb90306815bdb80410b6fdc11a6ced7bbf0ebec..a3d54ae3c1a681a655f3c40114eacae5fdb0a77e 100644 (file)
@@ -10,6 +10,7 @@
     <kernel>/var/lib/xen/vmlinuz.2Dn2YT</kernel>
     <initrd>/var/lib/xen/initrd.img.0u-Vhq</initrd>
     <cmdline> method=http://download.fedora.devel.redhat.com/pub/fedora/linux/core/test/5.91/x86_64/os  </cmdline>
+    <boot dev='hd'/>
   </os>
   <clock offset='variable' adjustment='0' basis='utc'/>
   <on_poweroff>destroy</on_poweroff>