}
static int
-virDomainVirtioOptionsParseXML(xmlXPathContextPtr ctxt,
+virDomainVirtioOptionsParseXML(xmlNodePtr driver,
virDomainVirtioOptionsPtr *virtio)
{
char *str = NULL;
int val;
virDomainVirtioOptionsPtr res;
+ if (*virtio || !driver)
+ return 0;
+
if (VIR_ALLOC(*virtio) < 0)
return -1;
res = *virtio;
- if ((str = virXPathString("string(./driver/@iommu)", ctxt))) {
+ if ((str = virXMLPropString(driver, "iommu"))) {
if ((val = virTristateSwitchTypeFromString(str)) <= 0) {
virReportError(VIR_ERR_XML_ERROR, "%s",
_("invalid iommu value"));
}
VIR_FREE(str);
- if ((str = virXPathString("string(./driver/@ats)", ctxt))) {
+ if ((str = virXMLPropString(driver, "ats"))) {
if ((val = virTristateSwitchTypeFromString(str)) <= 0) {
virReportError(VIR_ERR_XML_ERROR, "%s",
_("invalid ats value"));
}
} else if (!def->src->driverName &&
virXMLNodeNameEqual(cur, "driver")) {
+ if (virDomainVirtioOptionsParseXML(cur, &def->virtio) < 0)
+ goto error;
+
if (virDomainDiskDefDriverParseXML(def, cur) < 0)
goto error;
} else if (!def->mirror &&
}
}
- if (virDomainVirtioOptionsParseXML(ctxt, &def->virtio) < 0)
- goto error;
-
/* Disk volume types will have authentication information handled in
* virStorageTranslateDiskSourcePool
*/
max_sectors = virXMLPropString(cur, "max_sectors");
ioeventfd = virXMLPropString(cur, "ioeventfd");
iothread = virXMLPropString(cur, "iothread");
+
+ if (virDomainVirtioOptionsParseXML(cur, &def->virtio) < 0)
+ goto error;
} else if (virXMLNodeNameEqual(cur, "model")) {
if (processedModel) {
virReportError(VIR_ERR_XML_ERROR, "%s",
cur = cur->next;
}
- if (virDomainVirtioOptionsParseXML(ctxt, &def->virtio) < 0)
- goto error;
-
/* node is parsed differently from target attributes because
* someone thought it should be a subelement instead...
*/
wrpolicy = virXMLPropString(cur, "wrpolicy");
if (!format)
format = virXMLPropString(cur, "format");
+
+ if (virDomainVirtioOptionsParseXML(cur, &def->virtio) < 0)
+ goto error;
}
}
cur = cur->next;
goto error;
}
- if (virDomainVirtioOptionsParseXML(ctxt, &def->virtio) < 0)
- goto error;
-
def->src->path = source;
source = NULL;
def->dst = target;
queues = virXMLPropString(cur, "queues");
rx_queue_size = virXMLPropString(cur, "rx_queue_size");
tx_queue_size = virXMLPropString(cur, "tx_queue_size");
+
+ if (virDomainVirtioOptionsParseXML(cur, &def->virtio) < 0)
+ goto error;
} else if (virXMLNodeNameEqual(cur, "filterref")) {
if (filter) {
virReportError(VIR_ERR_XML_ERROR, "%s",
goto error;
}
- if (virDomainVirtioOptionsParseXML(ctxt, &def->virtio) < 0)
- goto error;
-
cleanup:
ctxt->node = oldnode;
VIR_FREE(macaddr);
goto error;
}
- if (virDomainVirtioOptionsParseXML(ctxt, &def->virtio) < 0)
+ if (virDomainVirtioOptionsParseXML(virXPathNode("./driver", ctxt),
+ &def->virtio) < 0)
goto error;
cleanup:
if (virDomainDeviceInfoParseXML(node, NULL, &def->info, flags) < 0)
goto error;
- if (virDomainVirtioOptionsParseXML(ctxt, &def->virtio) < 0)
+ if (virDomainVirtioOptionsParseXML(virXPathNode("./driver", ctxt),
+ &def->virtio) < 0)
goto error;
cleanup:
else if (virDomainDeviceInfoParseXML(node, NULL, &def->info, flags) < 0)
goto error;
- if (virDomainVirtioOptionsParseXML(ctxt, &def->virtio) < 0)
+ if (virDomainVirtioOptionsParseXML(virXPathNode("./driver", ctxt),
+ &def->virtio) < 0)
goto error;
cleanup:
def->accel = virDomainVideoAccelDefParseXML(cur);
}
+ if (virXMLNodeNameEqual(cur, "driver")) {
+ if (virDomainVirtioOptionsParseXML(cur, &def->virtio) < 0)
+ goto error;
+ }
}
cur = cur->next;
}
if (virDomainDeviceInfoParseXML(node, NULL, &def->info, flags) < 0)
goto error;
- if (virDomainVirtioOptionsParseXML(ctxt, &def->virtio) < 0)
- goto error;
-
def->driver = virDomainVideoDriverDefParseXML(node);
cleanup: