...
<devices>
<hostdev mode='subsystem' type='usb'>
- <source>
+ <source startupPolicy='optional'>
<vendor id='0x1234'/>
<product id='0xbeef'/>
</source>
<dd>The source element describes the device as seen from the host.
The USB device can either be addressed by vendor / product id using the
<code>vendor</code> and <code>product</code> elements or by the device's
- address on the hosts using the <code>address</code> element.
- PCI devices on the other hand can only be described by their
- <code>address</code></dd>
+ address on the hosts using the <code>address</code> element. PCI devices
+ on the other hand can only be described by their <code>address</code>.
+
+ <span class="since">Since 0.10.3</span>, the <code>source</code> element
+ of USB devices may contain <code>startupPolicy</code> attribute which can
+ be used to define policy what to do if the specified host USB device is
+ not found. The attribute accepts the following values:
+ <table class="top_table">
+ <tr>
+ <td> mandatory </td>
+ <td> fail if missing for any reason (the default) </td>
+ </tr>
+ <tr>
+ <td> requisite </td>
+ <td> fail if missing on boot up,
+ drop if missing on migrate/restore/revert </td>
+ </tr>
+ <tr>
+ <td> optional </td>
+ <td> drop if missing at any start attempt </td>
+ </tr>
+ </table>
+ </dd>
<dt><code>vendor</code>, <code>product</code></dt>
<dd>The <code>vendor</code> and <code>product</code> elements each have an
<code>id</code> attribute that specifies the USB vendor and product id.
int ret = -1;
int got_product, got_vendor;
xmlNodePtr cur;
+ char *startupPolicy = NULL;
+
+ if ((startupPolicy = virXMLPropString(node, "startupPolicy"))) {
+ def->startupPolicy =
+ virDomainStartupPolicyTypeFromString(startupPolicy);
+ if (def->startupPolicy <= 0) {
+ virReportError(VIR_ERR_XML_ERROR,
+ _("Unknown startup policy '%s'"),
+ startupPolicy);
+ VIR_FREE(startupPolicy);
+ goto out;
+ }
+ VIR_FREE(startupPolicy);
+ }
/* Product can validly be 0, so we need some extra help to determine
* if it is uninitialized*/
_("Missing <source> element in hostdev device"));
goto error;
}
+
+ if (def->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB &&
+ virXPathBoolean("boolean(./source/@startupPolicy)", ctxt)) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("Setting startupPolicy is only allowed for USB"
+ " devices"));
+ goto error;
+ }
+
switch (def->source.subsys.type) {
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
if (virDomainHostdevSubsysPciDefParseXML(sourcenode, def, flags) < 0)
unsigned int flags,
bool includeTypeInAddr)
{
- virBufferAddLit(buf, "<source>\n");
+ virBufferAddLit(buf, "<source");
+ if (def->startupPolicy) {
+ const char *policy;
+ policy = virDomainStartupPolicyTypeToString(def->startupPolicy);
+ virBufferAsprintf(buf, " startupPolicy='%s'", policy);
+ }
+ virBufferAddLit(buf, ">\n");
+
virBufferAdjustIndent(buf, 2);
switch (def->source.subsys.type)
{