Since there's at least SRIOV and MDEV sub-capabilities to be parsed,
let's make the code more readable by splitting it to several logical
blocks.
Signed-off-by: Erik Skultety
---
src/conf/node_device_conf.c | 130 ++--
1 file changed, 77 insertions(+), 53 deletions(-)
diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c
index 85cfd8396..d70d9942c 100644
--- a/src/conf/node_device_conf.c
+++ b/src/conf/node_device_conf.c
@@ -1286,76 +1286,102 @@ virPCIEDeviceInfoParseXML(xmlXPathContextPtr ctxt,
static int
-virNodeDevPCICapabilityParseXML(xmlXPathContextPtr ctxt,
-xmlNodePtr node,
-virNodeDevCapPCIDevPtr pci_dev)
+virNodeDevPCICapSRIOVPhysicalParseXML(xmlXPathContextPtr ctxt,
+ virNodeDevCapPCIDevPtr pci_dev)
{
-char *maxFuncsStr = virXMLPropString(node, "maxCount");
-char *type = virXMLPropString(node, "type");
-xmlNodePtr *addresses = NULL;
-xmlNodePtr orignode = ctxt->node;
-int ret = -1;
-size_t i = 0;
-
-ctxt->node = node;
-
-if (!type) {
-virReportError(VIR_ERR_XML_ERROR, "%s", _("Missing capability type"));
-goto out;
-}
-
-if (STREQ(type, "phys_function")) {
-xmlNodePtr address = virXPathNode("./address[1]", ctxt);
+xmlNodePtr address = virXPathNode("./address[1]", ctxt);
if (VIR_ALLOC(pci_dev->physical_function) < 0)
-goto out;
+return -1;
if (!address) {
virReportError(VIR_ERR_XML_ERROR, "%s",
_("Missing address in 'phys_function' capability"));
-goto out;
+return -1;
}
if (virPCIDeviceAddressParseXML(address,
pci_dev->physical_function) < 0)
-goto out;
+return -1;
pci_dev->flags |= VIR_NODE_DEV_CAP_FLAG_PCI_PHYSICAL_FUNCTION;
-} else if (STREQ(type, "virt_functions")) {
-int naddresses;
-
-if ((naddresses = virXPathNodeSet("./address", ctxt, &addresses)) < 0)
-goto out;
-
-if (maxFuncsStr &&
-virStrToLong_uip(maxFuncsStr, NULL, 10,
- &pci_dev->max_virtual_functions) < 0) {
-virReportError(VIR_ERR_XML_ERROR, "%s",
- _("Malformed 'maxCount' parameter"));
-goto out;
-}
-if (VIR_ALLOC_N(pci_dev->virtual_functions, naddresses) < 0)
-goto out;
+return 0;
+}
+
+
+static int
+virNodeDevPCICapSRIOVVirtualParseXML(xmlXPathContextPtr ctxt,
+ virNodeDevCapPCIDevPtr pci_dev)
+{
+int ret = -1;
+xmlNodePtr *addresses = NULL;
+int naddresses = virXPathNodeSet("./address", ctxt, &addresses);
+char *maxFuncsStr = virXPathString("string(./@maxCount)", ctxt);
+size_t i;
-for (i = 0; i < naddresses; i++) {
-virPCIDeviceAddressPtr addr = NULL;
+if (naddresses < 0)
+goto cleanup;
-if (VIR_ALLOC(addr) < 0)
-goto out;
+if (maxFuncsStr &&
+virStrToLong_uip(maxFuncsStr, NULL, 10,
+ &pci_dev->max_virtual_functions) < 0) {
+virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("Malformed 'maxCount' parameter"));
+goto cleanup;
+}
-if (virPCIDeviceAddressParseXML(addresses[i], addr) < 0) {
-VIR_FREE(addr);
-goto out;
-}
+if (VIR_ALLOC_N(pci_dev->virtual_functions, naddresses) < 0)
+goto cleanup;
-if (VIR_APPEND_ELEMENT(pci_dev->virtual_functions,
- pci_dev->num_virtual_functions,
- addr) < 0)
-goto out;
+for (i = 0; i < naddresses; i++) {
+virPCIDeviceAddressPtr addr = NULL;
+
+if (VIR_ALLOC(addr) < 0)
+goto cleanup;
+
+if (virPCIDeviceAddressParseXML(addresses[i], addr) < 0) {
+VIR_FREE(addr);
+goto cleanup;
}
-pci_dev->flags |= VIR_NODE_DEV_CAP_FLAG_PCI_VIRTUAL_FUNCTION;
+if (VIR_APPEND_ELEMENT(pci_dev->virtual_functions,
+ pci_dev->num_virtual_functions,
+ addr) < 0)
+goto cleanup;
+}
+
+pci_dev->flags |= VIR_NODE_DEV_CAP_FLAG_PCI_VIRTUAL_FUNCTION;
+ret = 0;
+ cleanup:
+VIR_FREE(addresses);
+VIR_FREE(maxFuncsStr);
+return ret;
+}
+
+
+static int
+virNodeDevPCICapabilityParseXML(xmlXPathContextPtr ctxt,
+xmlNodePtr node,
+virNodeDevCapPCIDevPtr pci_dev)
+{
+char *type = virXMLPropString(node, "type");
+xmlNodePtr orignode = ctxt->node;
+int ret = -1;
+
+ctxt->node = node;
+
+if (!type) {
+virReportError(V