[libvirt] [PATCH 1/2] Support booting from hostdev devices

Jiri Denemark jdenemar at redhat.com
Thu Feb 3 14:13:34 UTC 2011


---
 docs/formatdomain.html.in |   14 ++++++++++++--
 docs/schemas/domain.rng   |    3 +++
 src/conf/domain_conf.c    |   18 +++++++++++++++---
 src/conf/domain_conf.h    |    1 +
 4 files changed, 31 insertions(+), 5 deletions(-)

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 48f82ae..db0b762 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -109,8 +109,9 @@
         to consider. The <code>boot</code> element can be repeated multiple
         times to setup a priority list of boot devices to try in turn. The
         <code>boot</code> element cannot be used if per-device boot elements
-        are used (see <a href="#elementsDisks">disks</a> and
-        <a href="#elementsNICS">network interfaces</a> sections below.
+        are used (see <a href="#elementsDisks">disks</a>,
+        <a href="#elementsNICS">network interfaces</a>, and
+        <a href="#elementsUSB">USB and PCI devices</a> sections below).
         <span class="since">Since 0.1.3, per-device boot since 0.8.8</span>
       </dd>
       <dt><code>bootmenu</code></dt>
@@ -929,6 +930,7 @@
         <vendor id='0x1234'/>
         <product id='0xbeef'/>
       </source>
+      <boot order='2'/>
     </hostdev>
   </devices>
   ...</pre>
@@ -942,6 +944,7 @@
       <source>
         <address bus='0x06' slot='0x02' function='0x0'/>
       </source>
+      <boot order='1'/>
     </hostdev>
   </devices>
   ...</pre>
@@ -964,6 +967,13 @@
       <code>id</code> attribute that specifies the USB vendor and product id.
       The ids can be given in decimal, hexadecimal (starting with 0x) or
       octal (starting with 0) form.</dd>
+      <dt><code>boot</code></dt>
+      <dd>Specifies that the device is bootable. The <code>order</code>
+      attribute determines the order in which devices will be tried during
+      boot sequence. The per-device <code>boot</code> elements cannot be
+      used together with general boot elements in
+      <a href="#elementsOSBIOS">BIOS bootloader</a> section.
+      <span class="since">Since 0.8.8</span></dd>
       <dt><code>address</code></dt>
       <dd>The <code>address</code> element for USB devices has a
       <code>bus</code> and <code>device</code> attribute to specify the
diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng
index e4e7423..8a2e7c7 100644
--- a/docs/schemas/domain.rng
+++ b/docs/schemas/domain.rng
@@ -1693,6 +1693,9 @@
         </element>
       </group>
       <optional>
+        <ref name="deviceBoot"/>
+      </optional>
+      <optional>
         <ref name="address"/>
       </optional>
     </element>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index b1cc6c8..aba4223 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -4247,7 +4247,9 @@ out:
 
 static virDomainHostdevDefPtr
 virDomainHostdevDefParseXML(const xmlNodePtr node,
-                            int flags) {
+                            virBitmapPtr bootMap,
+                            int flags)
+{
 
     xmlNodePtr cur;
     virDomainHostdevDefPtr def;
@@ -4308,6 +4310,10 @@ virDomainHostdevDefParseXML(const xmlNodePtr node,
                 /* address is parsed as part of virDomainDeviceInfoParseXML */
             } else if (xmlStrEqual(cur->name, BAD_CAST "alias")) {
                 /* alias is parsed as part of virDomainDeviceInfoParseXML */
+            } else if (xmlStrEqual(cur->name, BAD_CAST "boot")) {
+                if (virDomainDeviceBootParseXML(cur, &def->bootIndex,
+                                                bootMap))
+                    goto error;
             } else {
                 virDomainReportError(VIR_ERR_INTERNAL_ERROR,
                                      _("unknown node %s"), cur->name);
@@ -4507,7 +4513,8 @@ virDomainDeviceDefPtr virDomainDeviceDefParse(virCapsPtr caps,
             goto error;
     } else if (xmlStrEqual(node->name, BAD_CAST "hostdev")) {
         dev->type = VIR_DOMAIN_DEVICE_HOSTDEV;
-        if (!(dev->data.hostdev = virDomainHostdevDefParseXML(node, flags)))
+        if (!(dev->data.hostdev = virDomainHostdevDefParseXML(node, NULL,
+                                                              flags)))
             goto error;
     } else if (xmlStrEqual(node->name, BAD_CAST "controller")) {
         dev->type = VIR_DOMAIN_DEVICE_CONTROLLER;
@@ -4767,7 +4774,8 @@ virDomainDefParseBootXML(xmlXPathContextPtr ctxt,
     unsigned long deviceBoot;
 
     if (virXPathULong("count(./devices/disk[boot]"
-                      "|./devices/interface[boot])", ctxt, &deviceBoot) < 0) {
+                      "|./devices/interface[boot]"
+                      "|./devices/hostdev[boot])", ctxt, &deviceBoot) < 0) {
         virDomainReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                              _("cannot count boot devices"));
         goto cleanup;
@@ -5506,6 +5514,7 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
         goto no_memory;
     for (i = 0 ; i < n ; i++) {
         virDomainHostdevDefPtr hostdev = virDomainHostdevDefParseXML(nodes[i],
+                                                                     bootMap,
                                                                      flags);
         if (!hostdev)
             goto error;
@@ -7280,6 +7289,9 @@ virDomainHostdevDefFormat(virBufferPtr buf,
 
     virBufferAddLit(buf, "      </source>\n");
 
+    if (def->bootIndex)
+        virBufferVSprintf(buf, "      <boot order='%d'/>\n", def->bootIndex);
+
     if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0)
         return -1;
 
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 871fa9a..feae203 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -678,6 +678,7 @@ struct _virDomainHostdevDef {
         } caps;
     } source;
     char* target;
+    int bootIndex;
     virDomainDeviceInfo info; /* Guest address */
 };
 
-- 
1.7.4




More information about the libvir-list mailing list