[libvirt] [PATCH v1 01/35] util: conf: add bootHash to virDomainParseTotalParam

add bootHash to virDomainParseTotalParam --- src/conf/domain_conf.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 1e949ea..1a8248d 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -18516,6 +18516,7 @@ struct _virDomainParseTotalParam{ virCapsPtr caps; virDomainXMLOptionPtr xmlopt; void *parseOpaque; + virHashTablePtr bootHash; unsigned int flags; //internal parameters @@ -19816,6 +19817,7 @@ virDomainDefParseXML(xmlDocPtr xml, caps, xmlopt, parseOpaque, + NULL, flags, false, false, @@ -19861,7 +19863,11 @@ virDomainDefParseXML(xmlDocPtr xml, if (!(def = virDomainDefNew())) return NULL; + if (!(bootHash = virHashCreate(5, NULL))) + goto error; + param.def = def; + param.bootHash = bootHash; while (parse_funs[fun_index]) { if (parse_funs[fun_index](¶m) < 0) -- 2.8.3

separate virDomainDefParseBootOptionsInfo from virDomainDefParseXML --- src/conf/domain_conf.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 1a8248d..92a6522 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -18169,8 +18169,7 @@ virDomainVcpuParse(virDomainDefPtr def, static int virDomainDefParseBootOptions(virDomainDefPtr def, - xmlXPathContextPtr ctxt, - virHashTablePtr *bootHash) + xmlXPathContextPtr ctxt) { xmlNodePtr *nodes = NULL; char *tmp = NULL; @@ -18302,8 +18301,6 @@ virDomainDefParseBootOptions(virDomainDefPtr def, if (virDomainDefParseBootXML(ctxt, def) < 0) goto error; - if (!(*bootHash = virHashCreate(5, NULL))) - goto error; } ret = 0; @@ -19786,6 +19783,16 @@ virDomainDefParseClockInfo(virDomainParseTotalParamPtr param) return ret; } + +static int +virDomainDefParseBootOptionsInfo(virDomainParseTotalParamPtr param) +{ + if (virDomainDefParseBootOptions(param->def, param->ctxt) < 0) + return -1; + + return 0; +} + static virDomainDefPtr virDomainDefParseXML(xmlDocPtr xml, xmlNodePtr root, @@ -19844,6 +19851,7 @@ virDomainDefParseXML(xmlDocPtr xml, virDomainDefParsePMStateInfo, virDomainDefParsePerfEventInfo, virDomainDefParseClockInfo, + virDomainDefParseBootOptionsInfo, NULL }; @@ -19875,9 +19883,6 @@ virDomainDefParseXML(xmlDocPtr xml, fun_index++; } - if (virDomainDefParseBootOptions(def, ctxt, &bootHash) < 0) - goto error; - /* analysis of the disk devices */ if ((n = virXPathNodeSet("./devices/disk", ctxt, &nodes)) < 0) goto error; -- 2.8.3

beacause virDomainDefParseXML is too long, and all domain xml parse in this function, it's difficulty to maintain this function so separate virDomainDefParseXML into serial parts use virDomainPreaseInfoFunc. then it will easy to maintain --- src/conf/domain_conf.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 34aae82..e36783b 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -18527,6 +18527,28 @@ virDomainCachetuneDefParse(virDomainDefPtr def, } +typedef struct _virDomainParseTotalParam virDomainParseTotalParam; +typedef virDomainParseTotalParam *virDomainParseTotalParamPtr; + +struct _virDomainParseTotalParam{ + //input parameters + virDomainDefPtr def; + xmlDocPtr xml; + xmlNodePtr root; + xmlXPathContextPtr ctxt; + virCapsPtr caps; + virDomainXMLOptionPtr xmlopt; + void *parseOpaque; + unsigned int flags; + + //internal parameters + bool usb_none; + bool usb_other; + bool usb_master; + bool uuid_generated; +}; + + static virDomainDefPtr virDomainDefParseXML(xmlDocPtr xml, xmlNodePtr root, @@ -18536,11 +18558,14 @@ virDomainDefParseXML(xmlDocPtr xml, void *parseOpaque, unsigned int flags) { + typedef int (*virDomainPreaseInfoFunc)(virDomainParseTotalParamPtr params); + xmlNodePtr *nodes = NULL, node = NULL; char *tmp = NULL; size_t i, j; int n, virtType, gic_version; long id = -1; + size_t fun_index = 0; virDomainDefPtr def; bool uuid_generated = false; virHashTablePtr bootHash = NULL; @@ -18548,6 +18573,25 @@ virDomainDefParseXML(xmlDocPtr xml, bool usb_other = false; bool usb_master = false; char *netprefix = NULL; + virDomainParseTotalParam param = { + NULL, + xml, + root, + ctxt, + caps, + xmlopt, + parseOpaque, + flags, + false, + false, + false, + false + + }; + + virDomainPreaseInfoFunc parse_funs[] = { + NULL + }; if (flags & VIR_DOMAIN_DEF_PARSE_VALIDATE_SCHEMA) { char *schema = virFileFindResource("domain.rng", @@ -18565,6 +18609,14 @@ virDomainDefParseXML(xmlDocPtr xml, if (!(def = virDomainDefNew())) return NULL; + param.def = def; + + while (parse_funs[fun_index]) { + if (parse_funs[fun_index](¶m) < 0) + goto error; + fun_index++; + } + if (!(flags & VIR_DOMAIN_DEF_PARSE_INACTIVE)) if (virXPathLong("string(./@id)", ctxt, &id) < 0) id = -1; -- 2.8.3

separate virDomainDefParseBootOptionsInfo from virDomainDefParseXML --- src/conf/domain_conf.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 1a8248d..92a6522 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -18169,8 +18169,7 @@ virDomainVcpuParse(virDomainDefPtr def, static int virDomainDefParseBootOptions(virDomainDefPtr def, - xmlXPathContextPtr ctxt, - virHashTablePtr *bootHash) + xmlXPathContextPtr ctxt) { xmlNodePtr *nodes = NULL; char *tmp = NULL; @@ -18302,8 +18301,6 @@ virDomainDefParseBootOptions(virDomainDefPtr def, if (virDomainDefParseBootXML(ctxt, def) < 0) goto error; - if (!(*bootHash = virHashCreate(5, NULL))) - goto error; } ret = 0; @@ -19786,6 +19783,16 @@ virDomainDefParseClockInfo(virDomainParseTotalParamPtr param) return ret; } + +static int +virDomainDefParseBootOptionsInfo(virDomainParseTotalParamPtr param) +{ + if (virDomainDefParseBootOptions(param->def, param->ctxt) < 0) + return -1; + + return 0; +} + static virDomainDefPtr virDomainDefParseXML(xmlDocPtr xml, xmlNodePtr root, @@ -19844,6 +19851,7 @@ virDomainDefParseXML(xmlDocPtr xml, virDomainDefParsePMStateInfo, virDomainDefParsePerfEventInfo, virDomainDefParseClockInfo, + virDomainDefParseBootOptionsInfo, NULL }; @@ -19875,9 +19883,6 @@ virDomainDefParseXML(xmlDocPtr xml, fun_index++; } - if (virDomainDefParseBootOptions(def, ctxt, &bootHash) < 0) - goto error; - /* analysis of the disk devices */ if ((n = virXPathNodeSet("./devices/disk", ctxt, &nodes)) < 0) goto error; -- 2.8.3

separate virDomainDefParseDeviceInfo from virDomainDefParseXML, separate virDomainDefParseControllerInfo from virDomainDefParseXML, move virDomainDefParseControllerInfo into virDomainDefParseDeviceInfo --- src/conf/domain_conf.c | 153 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 101 insertions(+), 52 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 92a6522..22db391 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -19793,6 +19793,106 @@ virDomainDefParseBootOptionsInfo(virDomainParseTotalParamPtr param) return 0; } + +static int +virDomainDefParseControllerInfo(virDomainParseTotalParamPtr param) + +{ + virDomainDefPtr def = param->def; + virDomainXMLOptionPtr xmlopt = param->xmlopt; + xmlXPathContextPtr ctxt = param->ctxt; + unsigned int flags = param->flags; + + int ret = -1; + int n = 0; + size_t i; + xmlNodePtr *nodes = NULL; + + /* analysis of the controller devices */ + if ((n = virXPathNodeSet("./devices/controller", ctxt, &nodes)) < 0) + goto cleanup; + + if (n && VIR_ALLOC_N(def->controllers, n) < 0) + goto cleanup; + + for (i = 0; i < n; i++) { + virDomainControllerDefPtr controller = virDomainControllerDefParseXML(xmlopt, + nodes[i], + ctxt, + flags); + + if (!controller) + goto cleanup; + + /* sanitize handling of "none" usb controller */ + if (controller->type == VIR_DOMAIN_CONTROLLER_TYPE_USB) { + if (controller->model == VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE) { + if (param->usb_other || param->usb_none) { + virDomainControllerDefFree(controller); + virReportError(VIR_ERR_XML_DETAIL, "%s", + _("Can't add another USB controller: " + "USB is disabled for this domain")); + goto cleanup; + } + param->usb_none = true; + } else { + if (param->usb_none) { + virDomainControllerDefFree(controller); + virReportError(VIR_ERR_XML_DETAIL, "%s", + _("Can't add another USB controller: " + "USB is disabled for this domain")); + goto cleanup; + } + param->usb_other = true; + } + + if (controller->info.mastertype == VIR_DOMAIN_CONTROLLER_MASTER_NONE) + param->usb_master = true; + } + + virDomainControllerInsertPreAlloced(def, controller); + } + VIR_FREE(nodes); + + if (param->usb_other && !param->usb_master) { + virReportError(VIR_ERR_XML_DETAIL, "%s", + _("No master USB controller specified")); + goto cleanup; + } + + ret = 0; + + cleanup: + VIR_FREE(nodes); + return ret; +} + + +static int +virDomainDefParseDeviceInfo(virDomainParseTotalParamPtr param) +{ + typedef int (*virDomainPreaseDeviceFuc)(virDomainParseTotalParamPtr param); + int ret = -1; + size_t i = 0; + + virDomainPreaseDeviceFuc parseFuc[] = { + virDomainDefParseControllerInfo, + NULL + }; + + while (parseFuc[i]) { + if (parseFuc[i](param) < 0) + goto out; + i++; + } + ret = 0; + + out: + return ret; + + +} + static virDomainDefPtr virDomainDefParseXML(xmlDocPtr xml, xmlNodePtr root, @@ -19813,8 +19913,6 @@ virDomainDefParseXML(xmlDocPtr xml, bool uuid_generated = false; virHashTablePtr bootHash = NULL; bool usb_none = false; - bool usb_other = false; - bool usb_master = false; char *netprefix = NULL; virDomainParseTotalParam param = { NULL, @@ -19852,6 +19950,7 @@ virDomainDefParseXML(xmlDocPtr xml, virDomainDefParsePerfEventInfo, virDomainDefParseClockInfo, virDomainDefParseBootOptionsInfo, + virDomainDefParseDeviceInfo, NULL }; @@ -19905,57 +20004,7 @@ virDomainDefParseXML(xmlDocPtr xml, } VIR_FREE(nodes); - /* analysis of the controller devices */ - if ((n = virXPathNodeSet("./devices/controller", ctxt, &nodes)) < 0) - goto error; - - if (n && VIR_ALLOC_N(def->controllers, n) < 0) - goto error; - - for (i = 0; i < n; i++) { - virDomainControllerDefPtr controller = virDomainControllerDefParseXML(xmlopt, - nodes[i], - ctxt, - flags); - - if (!controller) - goto error; - - /* sanitize handling of "none" usb controller */ - if (controller->type == VIR_DOMAIN_CONTROLLER_TYPE_USB) { - if (controller->model == VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE) { - if (usb_other || usb_none) { - virDomainControllerDefFree(controller); - virReportError(VIR_ERR_XML_DETAIL, "%s", - _("Can't add another USB controller: " - "USB is disabled for this domain")); - goto error; - } - usb_none = true; - } else { - if (usb_none) { - virDomainControllerDefFree(controller); - virReportError(VIR_ERR_XML_DETAIL, "%s", - _("Can't add another USB controller: " - "USB is disabled for this domain")); - goto error; - } - usb_other = true; - } - - if (controller->info.mastertype == VIR_DOMAIN_CONTROLLER_MASTER_NONE) - usb_master = true; - } - - virDomainControllerInsertPreAlloced(def, controller); - } - VIR_FREE(nodes); - if (usb_other && !usb_master) { - virReportError(VIR_ERR_XML_DETAIL, "%s", - _("No master USB controller specified")); - goto error; - } /* analysis of the resource leases */ if ((n = virXPathNodeSet("./devices/lease", ctxt, &nodes)) < 0) { -- 2.8.3

separate virDomainDefParseIdInfo from virDomainDefParseXML --- src/conf/domain_conf.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index e36783b..055404e 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -18549,6 +18549,22 @@ struct _virDomainParseTotalParam{ }; +static int +virDomainDefParseIdInfo(virDomainParseTotalParamPtr param) +{ + unsigned int flags = param->flags; + xmlXPathContextPtr ctxt = param->ctxt; + virDomainDefPtr def = param->def; + long id = -1; + + if (!(flags & VIR_DOMAIN_DEF_PARSE_INACTIVE)) + if (virXPathLong("string(./@id)", ctxt, &id) < 0) + id = -1; + def->id = (int)id; + return 0; +} + + static virDomainDefPtr virDomainDefParseXML(xmlDocPtr xml, xmlNodePtr root, @@ -18564,7 +18580,6 @@ virDomainDefParseXML(xmlDocPtr xml, char *tmp = NULL; size_t i, j; int n, virtType, gic_version; - long id = -1; size_t fun_index = 0; virDomainDefPtr def; bool uuid_generated = false; @@ -18590,6 +18605,7 @@ virDomainDefParseXML(xmlDocPtr xml, }; virDomainPreaseInfoFunc parse_funs[] = { + virDomainDefParseIdInfo, NULL }; @@ -18617,11 +18633,6 @@ virDomainDefParseXML(xmlDocPtr xml, fun_index++; } - if (!(flags & VIR_DOMAIN_DEF_PARSE_INACTIVE)) - if (virXPathLong("string(./@id)", ctxt, &id) < 0) - id = -1; - def->id = (int)id; - /* Find out what type of virtualization to use */ if (!(tmp = virXMLPropString(ctxt->node, "type"))) { virReportError(VIR_ERR_INTERNAL_ERROR, -- 2.8.3

separate virDomainDefParseDeviceInfo from virDomainDefParseXML, separate virDomainDefParseControllerInfo from virDomainDefParseXML, move virDomainDefParseControllerInfo into virDomainDefParseDeviceInfo --- src/conf/domain_conf.c | 153 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 101 insertions(+), 52 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 92a6522..22db391 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -19793,6 +19793,106 @@ virDomainDefParseBootOptionsInfo(virDomainParseTotalParamPtr param) return 0; } + +static int +virDomainDefParseControllerInfo(virDomainParseTotalParamPtr param) + +{ + virDomainDefPtr def = param->def; + virDomainXMLOptionPtr xmlopt = param->xmlopt; + xmlXPathContextPtr ctxt = param->ctxt; + unsigned int flags = param->flags; + + int ret = -1; + int n = 0; + size_t i; + xmlNodePtr *nodes = NULL; + + /* analysis of the controller devices */ + if ((n = virXPathNodeSet("./devices/controller", ctxt, &nodes)) < 0) + goto cleanup; + + if (n && VIR_ALLOC_N(def->controllers, n) < 0) + goto cleanup; + + for (i = 0; i < n; i++) { + virDomainControllerDefPtr controller = virDomainControllerDefParseXML(xmlopt, + nodes[i], + ctxt, + flags); + + if (!controller) + goto cleanup; + + /* sanitize handling of "none" usb controller */ + if (controller->type == VIR_DOMAIN_CONTROLLER_TYPE_USB) { + if (controller->model == VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE) { + if (param->usb_other || param->usb_none) { + virDomainControllerDefFree(controller); + virReportError(VIR_ERR_XML_DETAIL, "%s", + _("Can't add another USB controller: " + "USB is disabled for this domain")); + goto cleanup; + } + param->usb_none = true; + } else { + if (param->usb_none) { + virDomainControllerDefFree(controller); + virReportError(VIR_ERR_XML_DETAIL, "%s", + _("Can't add another USB controller: " + "USB is disabled for this domain")); + goto cleanup; + } + param->usb_other = true; + } + + if (controller->info.mastertype == VIR_DOMAIN_CONTROLLER_MASTER_NONE) + param->usb_master = true; + } + + virDomainControllerInsertPreAlloced(def, controller); + } + VIR_FREE(nodes); + + if (param->usb_other && !param->usb_master) { + virReportError(VIR_ERR_XML_DETAIL, "%s", + _("No master USB controller specified")); + goto cleanup; + } + + ret = 0; + + cleanup: + VIR_FREE(nodes); + return ret; +} + + +static int +virDomainDefParseDeviceInfo(virDomainParseTotalParamPtr param) +{ + typedef int (*virDomainPreaseDeviceFuc)(virDomainParseTotalParamPtr param); + int ret = -1; + size_t i = 0; + + virDomainPreaseDeviceFuc parseFuc[] = { + virDomainDefParseControllerInfo, + NULL + }; + + while (parseFuc[i]) { + if (parseFuc[i](param) < 0) + goto out; + i++; + } + ret = 0; + + out: + return ret; + + +} + static virDomainDefPtr virDomainDefParseXML(xmlDocPtr xml, xmlNodePtr root, @@ -19813,8 +19913,6 @@ virDomainDefParseXML(xmlDocPtr xml, bool uuid_generated = false; virHashTablePtr bootHash = NULL; bool usb_none = false; - bool usb_other = false; - bool usb_master = false; char *netprefix = NULL; virDomainParseTotalParam param = { NULL, @@ -19852,6 +19950,7 @@ virDomainDefParseXML(xmlDocPtr xml, virDomainDefParsePerfEventInfo, virDomainDefParseClockInfo, virDomainDefParseBootOptionsInfo, + virDomainDefParseDeviceInfo, NULL }; @@ -19905,57 +20004,7 @@ virDomainDefParseXML(xmlDocPtr xml, } VIR_FREE(nodes); - /* analysis of the controller devices */ - if ((n = virXPathNodeSet("./devices/controller", ctxt, &nodes)) < 0) - goto error; - - if (n && VIR_ALLOC_N(def->controllers, n) < 0) - goto error; - - for (i = 0; i < n; i++) { - virDomainControllerDefPtr controller = virDomainControllerDefParseXML(xmlopt, - nodes[i], - ctxt, - flags); - - if (!controller) - goto error; - - /* sanitize handling of "none" usb controller */ - if (controller->type == VIR_DOMAIN_CONTROLLER_TYPE_USB) { - if (controller->model == VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE) { - if (usb_other || usb_none) { - virDomainControllerDefFree(controller); - virReportError(VIR_ERR_XML_DETAIL, "%s", - _("Can't add another USB controller: " - "USB is disabled for this domain")); - goto error; - } - usb_none = true; - } else { - if (usb_none) { - virDomainControllerDefFree(controller); - virReportError(VIR_ERR_XML_DETAIL, "%s", - _("Can't add another USB controller: " - "USB is disabled for this domain")); - goto error; - } - usb_other = true; - } - - if (controller->info.mastertype == VIR_DOMAIN_CONTROLLER_MASTER_NONE) - usb_master = true; - } - - virDomainControllerInsertPreAlloced(def, controller); - } - VIR_FREE(nodes); - if (usb_other && !usb_master) { - virReportError(VIR_ERR_XML_DETAIL, "%s", - _("No master USB controller specified")); - goto error; - } /* analysis of the resource leases */ if ((n = virXPathNodeSet("./devices/lease", ctxt, &nodes)) < 0) { -- 2.8.3

separate virDomainDefParseDisksInfo from virDomainDefParseXML, move virDomainDefParseDisksInfo into virDomainDefParseDeviceInfo --- src/conf/domain_conf.c | 78 +++++++++++++++++++++++++++++++------------------- 1 file changed, 49 insertions(+), 29 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 22db391..903dfec 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -18506,17 +18506,17 @@ typedef virDomainParseTotalParam *virDomainParseTotalParamPtr; struct _virDomainParseTotalParam{ //input parameters - virDomainDefPtr def; xmlDocPtr xml; xmlNodePtr root; xmlXPathContextPtr ctxt; virCapsPtr caps; virDomainXMLOptionPtr xmlopt; void *parseOpaque; - virHashTablePtr bootHash; unsigned int flags; - //internal parameters + //internal parameters, must assignment before use it + virDomainDefPtr def; + virHashTablePtr bootHash; bool usb_none; bool usb_other; bool usb_master; @@ -19869,6 +19869,48 @@ virDomainDefParseControllerInfo(virDomainParseTotalParamPtr param) static int +virDomainDefParseDisksInfo(virDomainParseTotalParamPtr param) +{ + virDomainDefPtr def = param->def; + virDomainXMLOptionPtr xmlopt = param->xmlopt; + xmlXPathContextPtr ctxt = param->ctxt; + unsigned int flags = param->flags; + virHashTablePtr bootHash = param->bootHash; + + int ret = -1; + int n = 0; + size_t i; + xmlNodePtr *nodes = NULL; + + /* analysis of the disk devices */ + if ((n = virXPathNodeSet("./devices/disk", ctxt, &nodes)) < 0) + goto cleanup; + + if (n && VIR_ALLOC_N(def->disks, n) < 0) + goto cleanup; + + for (i = 0; i < n; i++) { + virDomainDiskDefPtr disk = virDomainDiskDefParseXML(xmlopt, + nodes[i], + ctxt, + bootHash, + def->seclabels, + def->nseclabels, + flags); + if (!disk) + goto cleanup; + + virDomainDiskInsertPreAlloced(def, disk); + } + ret = 0; + + cleanup: + VIR_FREE(nodes); + return ret; +} + + +static int virDomainDefParseDeviceInfo(virDomainParseTotalParamPtr param) { typedef int (*virDomainPreaseDeviceFuc)(virDomainParseTotalParamPtr param); @@ -19877,6 +19919,7 @@ virDomainDefParseDeviceInfo(virDomainParseTotalParamPtr param) virDomainPreaseDeviceFuc parseFuc[] = { virDomainDefParseControllerInfo, + virDomainDefParseDisksInfo, NULL }; @@ -19893,6 +19936,7 @@ virDomainDefParseDeviceInfo(virDomainParseTotalParamPtr param) } + static virDomainDefPtr virDomainDefParseXML(xmlDocPtr xml, xmlNodePtr root, @@ -19915,15 +19959,15 @@ virDomainDefParseXML(xmlDocPtr xml, bool usb_none = false; char *netprefix = NULL; virDomainParseTotalParam param = { - NULL, xml, root, ctxt, caps, xmlopt, parseOpaque, - NULL, flags, + NULL, + NULL, false, false, false, @@ -19982,30 +20026,6 @@ virDomainDefParseXML(xmlDocPtr xml, fun_index++; } - /* analysis of the disk devices */ - if ((n = virXPathNodeSet("./devices/disk", ctxt, &nodes)) < 0) - goto error; - - if (n && VIR_ALLOC_N(def->disks, n) < 0) - goto error; - - for (i = 0; i < n; i++) { - virDomainDiskDefPtr disk = virDomainDiskDefParseXML(xmlopt, - nodes[i], - ctxt, - bootHash, - def->seclabels, - def->nseclabels, - flags); - if (!disk) - goto error; - - virDomainDiskInsertPreAlloced(def, disk); - } - VIR_FREE(nodes); - - - /* analysis of the resource leases */ if ((n = virXPathNodeSet("./devices/lease", ctxt, &nodes)) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, -- 2.8.3

separate virDomainDefParseVirtTypeInfo from virDomainDefParseXML --- src/conf/domain_conf.c | 48 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 055404e..bf2cf7f 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -18565,6 +18565,36 @@ virDomainDefParseIdInfo(virDomainParseTotalParamPtr param) } +static int +virDomainDefParseVirtTypeInfo(virDomainParseTotalParamPtr param) +{ + virDomainDefPtr def = param->def; + xmlXPathContextPtr ctxt = param->ctxt; + char *tmp = NULL; + int virtType; + int ret = -1; + + /* Find out what type of virtualization to use */ + if (!(tmp = virXMLPropString(ctxt->node, "type"))) { + virReportError(VIR_ERR_INTERNAL_ERROR, + "%s", _("missing domain type attribute")); + goto cleanup; + } + + if ((virtType = virDomainVirtTypeFromString(tmp)) < 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("invalid domain type %s"), tmp); + goto cleanup; + } + def->virtType = virtType; + ret = 0; + + cleanup: + VIR_FREE(tmp); + return ret; +} + + static virDomainDefPtr virDomainDefParseXML(xmlDocPtr xml, xmlNodePtr root, @@ -18579,7 +18609,7 @@ virDomainDefParseXML(xmlDocPtr xml, xmlNodePtr *nodes = NULL, node = NULL; char *tmp = NULL; size_t i, j; - int n, virtType, gic_version; + int n, gic_version; size_t fun_index = 0; virDomainDefPtr def; bool uuid_generated = false; @@ -18606,6 +18636,7 @@ virDomainDefParseXML(xmlDocPtr xml, virDomainPreaseInfoFunc parse_funs[] = { virDomainDefParseIdInfo, + virDomainDefParseVirtTypeInfo, NULL }; @@ -18633,21 +18664,6 @@ virDomainDefParseXML(xmlDocPtr xml, fun_index++; } - /* Find out what type of virtualization to use */ - if (!(tmp = virXMLPropString(ctxt->node, "type"))) { - virReportError(VIR_ERR_INTERNAL_ERROR, - "%s", _("missing domain type attribute")); - goto error; - } - - if ((virtType = virDomainVirtTypeFromString(tmp)) < 0) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("invalid domain type %s"), tmp); - goto error; - } - def->virtType = virtType; - VIR_FREE(tmp); - def->os.bootloader = virXPathString("string(./bootloader)", ctxt); def->os.bootloaderArgs = virXPathString("string(./bootloader_args)", ctxt); -- 2.8.3

separate virDomainDefParseDisksInfo from virDomainDefParseXML, move virDomainDefParseDisksInfo into virDomainDefParseDeviceInfo --- src/conf/domain_conf.c | 78 +++++++++++++++++++++++++++++++------------------- 1 file changed, 49 insertions(+), 29 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 22db391..903dfec 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -18506,17 +18506,17 @@ typedef virDomainParseTotalParam *virDomainParseTotalParamPtr; struct _virDomainParseTotalParam{ //input parameters - virDomainDefPtr def; xmlDocPtr xml; xmlNodePtr root; xmlXPathContextPtr ctxt; virCapsPtr caps; virDomainXMLOptionPtr xmlopt; void *parseOpaque; - virHashTablePtr bootHash; unsigned int flags; - //internal parameters + //internal parameters, must assignment before use it + virDomainDefPtr def; + virHashTablePtr bootHash; bool usb_none; bool usb_other; bool usb_master; @@ -19869,6 +19869,48 @@ virDomainDefParseControllerInfo(virDomainParseTotalParamPtr param) static int +virDomainDefParseDisksInfo(virDomainParseTotalParamPtr param) +{ + virDomainDefPtr def = param->def; + virDomainXMLOptionPtr xmlopt = param->xmlopt; + xmlXPathContextPtr ctxt = param->ctxt; + unsigned int flags = param->flags; + virHashTablePtr bootHash = param->bootHash; + + int ret = -1; + int n = 0; + size_t i; + xmlNodePtr *nodes = NULL; + + /* analysis of the disk devices */ + if ((n = virXPathNodeSet("./devices/disk", ctxt, &nodes)) < 0) + goto cleanup; + + if (n && VIR_ALLOC_N(def->disks, n) < 0) + goto cleanup; + + for (i = 0; i < n; i++) { + virDomainDiskDefPtr disk = virDomainDiskDefParseXML(xmlopt, + nodes[i], + ctxt, + bootHash, + def->seclabels, + def->nseclabels, + flags); + if (!disk) + goto cleanup; + + virDomainDiskInsertPreAlloced(def, disk); + } + ret = 0; + + cleanup: + VIR_FREE(nodes); + return ret; +} + + +static int virDomainDefParseDeviceInfo(virDomainParseTotalParamPtr param) { typedef int (*virDomainPreaseDeviceFuc)(virDomainParseTotalParamPtr param); @@ -19877,6 +19919,7 @@ virDomainDefParseDeviceInfo(virDomainParseTotalParamPtr param) virDomainPreaseDeviceFuc parseFuc[] = { virDomainDefParseControllerInfo, + virDomainDefParseDisksInfo, NULL }; @@ -19893,6 +19936,7 @@ virDomainDefParseDeviceInfo(virDomainParseTotalParamPtr param) } + static virDomainDefPtr virDomainDefParseXML(xmlDocPtr xml, xmlNodePtr root, @@ -19915,15 +19959,15 @@ virDomainDefParseXML(xmlDocPtr xml, bool usb_none = false; char *netprefix = NULL; virDomainParseTotalParam param = { - NULL, xml, root, ctxt, caps, xmlopt, parseOpaque, - NULL, flags, + NULL, + NULL, false, false, false, @@ -19982,30 +20026,6 @@ virDomainDefParseXML(xmlDocPtr xml, fun_index++; } - /* analysis of the disk devices */ - if ((n = virXPathNodeSet("./devices/disk", ctxt, &nodes)) < 0) - goto error; - - if (n && VIR_ALLOC_N(def->disks, n) < 0) - goto error; - - for (i = 0; i < n; i++) { - virDomainDiskDefPtr disk = virDomainDiskDefParseXML(xmlopt, - nodes[i], - ctxt, - bootHash, - def->seclabels, - def->nseclabels, - flags); - if (!disk) - goto error; - - virDomainDiskInsertPreAlloced(def, disk); - } - VIR_FREE(nodes); - - - /* analysis of the resource leases */ if ((n = virXPathNodeSet("./devices/lease", ctxt, &nodes)) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, -- 2.8.3
participants (1)
-
xinhua.Cao