[PATCH 02/13] conf: domain: Extract code for parsing and formatting iotrhead mapping definition

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The code will be also needed for 'virtio-scsi' controller definitions.

Signed-off-by: Peter Krempa <pkrempa@xxxxxxxxxx>
---
 src/conf/domain_conf.c | 143 +++++++++++++++++++++++------------------
 1 file changed, 81 insertions(+), 62 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 22b9dad9ee..1a52cda62d 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -7939,11 +7939,56 @@ virDomainDiskDefGeometryParse(virDomainDiskDef *def,


 static int
-virDomainDiskDefDriverParseXML(virDomainDiskDef *def,
-                               xmlNodePtr cur)
+virDomainIothreadMappingDefParse(xmlNodePtr driverNode,
+                                 GSList **iothreads)
 {
     xmlNodePtr iothreadsNode;
+    g_autoslist(virDomainIothreadMappingDef) ioth = NULL;
+    g_autoptr(GPtrArray) iothreadNodes = NULL;
+    size_t i;
+
+    if (!(iothreadsNode = virXMLNodeGetSubelement(driverNode, "iothreads")))
+        return 0;
+
+    if (!(iothreadNodes = virXMLNodeGetSubelementList(iothreadsNode, "iothread")))
+        return 0;
+
+    for (i = 0; i < iothreadNodes->len; i++) {
+        xmlNodePtr iothNode = g_ptr_array_index(iothreadNodes, i);
+        g_autoptr(virDomainIothreadMappingDef) iothdef = g_new0(virDomainIothreadMappingDef, 1);
+        g_autoptr(GPtrArray) queueNodes = NULL;
+
+        if (virXMLPropUInt(iothNode, "id", 10, VIR_XML_PROP_REQUIRED,
+                           &iothdef->id) < 0)
+            return -1;
+
+        if ((queueNodes = virXMLNodeGetSubelementList(iothNode, "queue"))) {
+            size_t q;
+
+            iothdef->queues = g_new0(unsigned int, queueNodes->len);
+            iothdef->nqueues = queueNodes->len;
+
+            for (q = 0; q < queueNodes->len; q++) {
+                xmlNodePtr queueNode = g_ptr_array_index(queueNodes, q);
+
+                if (virXMLPropUInt(queueNode, "id", 10, VIR_XML_PROP_REQUIRED,
+                                   &(iothdef->queues[q])) < 0)
+                    return -1;
+            }
+        }

+        ioth = g_slist_prepend(ioth, g_steal_pointer(&iothdef));
+    }
+
+    *iothreads = g_slist_reverse(g_steal_pointer(&ioth));
+    return 0;
+}
+
+
+static int
+virDomainDiskDefDriverParseXML(virDomainDiskDef *def,
+                               xmlNodePtr cur)
+{
     def->driverName = virXMLPropString(cur, "name");

     if (virXMLPropEnum(cur, "cache", virDomainDiskCacheTypeFromString,
@@ -7990,43 +8035,8 @@ virDomainDiskDefDriverParseXML(virDomainDiskDef *def,
     if (virXMLPropUInt(cur, "iothread", 10, VIR_XML_PROP_NONZERO, &def->iothread) < 0)
         return -1;

-    if ((iothreadsNode = virXMLNodeGetSubelement(cur, "iothreads"))) {
-        g_autoslist(virDomainIothreadMappingDef) ioth = NULL;
-        g_autoptr(GPtrArray) iothreadNodes = NULL;
-
-        if ((iothreadNodes = virXMLNodeGetSubelementList(iothreadsNode, "iothread"))) {
-            size_t i;
-
-            for (i = 0; i < iothreadNodes->len; i++) {
-                xmlNodePtr iothNode = g_ptr_array_index(iothreadNodes, i);
-                g_autoptr(virDomainIothreadMappingDef) iothdef = g_new0(virDomainIothreadMappingDef, 1);
-                g_autoptr(GPtrArray) queueNodes = NULL;
-
-                if (virXMLPropUInt(iothNode, "id", 10, VIR_XML_PROP_REQUIRED,
-                                   &iothdef->id) < 0)
-                    return -1;
-
-                if ((queueNodes = virXMLNodeGetSubelementList(iothNode, "queue"))) {
-                    size_t q;
-
-                    iothdef->queues = g_new0(unsigned int, queueNodes->len);
-                    iothdef->nqueues = queueNodes->len;
-
-                    for (q = 0; q < queueNodes->len; q++) {
-                        xmlNodePtr queueNode = g_ptr_array_index(queueNodes, q);
-
-                        if (virXMLPropUInt(queueNode, "id", 10, VIR_XML_PROP_REQUIRED,
-                                           &(iothdef->queues[q])) < 0)
-                            return -1;
-                    }
-                }
-
-                ioth = g_slist_prepend(ioth, g_steal_pointer(&iothdef));
-            }
-
-            def->iothreads = g_slist_reverse(g_steal_pointer(&ioth));
-        }
-    }
+    if (virDomainIothreadMappingDefParse(cur, &def->iothreads) < 0)
+        return -1;

     if (virXMLPropEnum(cur, "detect_zeroes",
                        virDomainDiskDetectZeroesTypeFromString,
@@ -23161,6 +23171,37 @@ virDomainDiskDefFormatIotune(virBuffer *buf,
 #undef FORMAT_IOTUNE


+static void
+virDomainIothreadMappingDefFormat(virBuffer *buf,
+                                  GSList *iothreads)
+{
+    g_auto(virBuffer) iothreadsChildBuf = VIR_BUFFER_INIT_CHILD(buf);
+    GSList *n;
+
+    if (!iothreads)
+        return;
+
+    for (n = iothreads; n; n = n->next) {
+        virDomainIothreadMappingDef *iothDef = n->data;
+        g_auto(virBuffer) iothreadAttrBuf = VIR_BUFFER_INITIALIZER;
+        g_auto(virBuffer) iothreadChildBuf = VIR_BUFFER_INIT_CHILD(&iothreadsChildBuf);
+
+        virBufferAsprintf(&iothreadAttrBuf, " id='%u'", iothDef->id);
+
+        if (iothDef->queues) {
+            size_t q;
+
+            for (q = 0; q < iothDef->nqueues; q++)
+                virBufferAsprintf(&iothreadChildBuf, "<queue id='%u'/>\n", iothDef->queues[q]);
+        }
+
+        virXMLFormatElement(&iothreadsChildBuf, "iothread", &iothreadAttrBuf, &iothreadChildBuf);
+    }
+
+    virXMLFormatElement(buf, "iothreads", NULL, &iothreadsChildBuf);
+}
+
+
 static void
 virDomainDiskDefFormatDriver(virBuffer *buf,
                              virDomainDiskDef *disk)
@@ -23235,29 +23276,7 @@ virDomainDiskDefFormatDriver(virBuffer *buf,
         virXMLFormatElement(&childBuf, "metadata_cache", NULL, &metadataCacheChildBuf);
     }

-    if (disk->iothreads) {
-        g_auto(virBuffer) iothreadsChildBuf = VIR_BUFFER_INIT_CHILD(&childBuf);
-        GSList *n;
-
-        for (n = disk->iothreads; n; n = n->next) {
-            virDomainIothreadMappingDef *iothDef = n->data;
-            g_auto(virBuffer) iothreadAttrBuf = VIR_BUFFER_INITIALIZER;
-            g_auto(virBuffer) iothreadChildBuf = VIR_BUFFER_INIT_CHILD(&iothreadsChildBuf);
-
-            virBufferAsprintf(&iothreadAttrBuf, " id='%u'", iothDef->id);
-
-            if (iothDef->queues) {
-                size_t q;
-
-                for (q = 0; q < iothDef->nqueues; q++)
-                    virBufferAsprintf(&iothreadChildBuf, "<queue id='%u'/>\n", iothDef->queues[q]);
-            }
-
-            virXMLFormatElement(&iothreadsChildBuf, "iothread", &iothreadAttrBuf, &iothreadChildBuf);
-        }
-
-        virXMLFormatElement(&childBuf, "iothreads", NULL, &iothreadsChildBuf);
-    }
+    virDomainIothreadMappingDefFormat(&childBuf, disk->iothreads);

     virXMLFormatElement(buf, "driver", &attrBuf, &childBuf);
 }
-- 
2.48.1




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux