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