Signed-off-by: Kristina Hanicova <khanicov(a)redhat.com>
---
src/conf/domain_conf.c | 241 ++++++++++++++++++++---------------------
1 file changed, 118 insertions(+), 123 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 808169883f..2af3ec6ec3 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -9259,7 +9259,12 @@ virDomainDiskDefParseXML(virDomainXMLOption *xmlopt,
unsigned int flags)
{
g_autoptr(virDomainDiskDef) def = NULL;
- xmlNodePtr cur;
+ xmlNodePtr source_node = NULL;
+ xmlNodePtr geometry_node = NULL;
+ xmlNodePtr driver_node = NULL;
+ xmlNodePtr mirror_node = NULL;
+ xmlNodePtr auth_node = NULL;
+ xmlNodePtr encryption_node = NULL;
VIR_XPATH_NODE_AUTORESTORE(ctxt)
bool source = false;
g_autoptr(virStorageEncryption) encryption = NULL;
@@ -9281,6 +9286,7 @@ virDomainDiskDefParseXML(virDomainXMLOption *xmlopt,
g_autofree char *product = NULL;
g_autofree char *domain_name = NULL;
g_autofree char *rotation_rate = NULL;
+ g_autofree char *index = NULL;
if (!(def = virDomainDiskDefNew(xmlopt)))
return NULL;
@@ -9320,139 +9326,128 @@ virDomainDiskDefParseXML(virDomainXMLOption *xmlopt,
rawio = virXMLPropString(node, "rawio");
sgio = virXMLPropString(node, "sgio");
- for (cur = node->children; cur != NULL; cur = cur->next) {
- if (cur->type != XML_ELEMENT_NODE)
- continue;
+ if ((source_node = virXPathNode("./source", ctxt))) {
+ if (virDomainStorageSourceParse(source_node, ctxt, def->src, flags, xmlopt)
< 0)
+ return NULL;
+ source = true;
+ startupPolicy = virXPathString("string(./source/@startupPolicy)",
ctxt);
- if (!source && virXMLNodeNameEqual(cur, "source")) {
- if (virDomainStorageSourceParse(cur, ctxt, def->src, flags, xmlopt) <
0)
- return NULL;
+ if (!(flags & VIR_DOMAIN_DEF_PARSE_INACTIVE) &&
+ (index = virXPathString("string(./source/@index)", ctxt))
&&
+ virStrToLong_uip(index, NULL, 10, &def->src->id) < 0) {
+ virReportError(VIR_ERR_XML_ERROR, _("invalid disk index
'%s'"), index);
+ return NULL;
+ }
+ }
- source = true;
+ target = virXPathString("string(./target/@dev)", ctxt);
+ bus = virXPathString("string(./target/@bus)", ctxt);
+ tray = virXPathString("string(./target/@tray)", ctxt);
+ removable = virXPathString("string(./target/@removable)", ctxt);
+ rotation_rate = virXPathString("string(./target/@rotation_rate)", ctxt);
+ domain_name = virXPathString("string(./backenddomain/@name)", ctxt);
- startupPolicy = virXMLPropString(cur, "startupPolicy");
+ /* HACK: Work around for compat with Xen
+ * driver in previous libvirt releases */
+ if (target &&
+ STRPREFIX(target, "ioemu:"))
+ memmove(target, target+6, strlen(target)-5);
- if (!(flags & VIR_DOMAIN_DEF_PARSE_INACTIVE) &&
- (tmp = virXMLPropString(cur, "index")) &&
- virStrToLong_uip(tmp, NULL, 10, &def->src->id) < 0) {
- virReportError(VIR_ERR_XML_ERROR, _("invalid disk index
'%s'"), tmp);
- return NULL;
- }
- VIR_FREE(tmp);
- } else if (!target &&
- virXMLNodeNameEqual(cur, "target")) {
- target = virXMLPropString(cur, "dev");
- bus = virXMLPropString(cur, "bus");
- tray = virXMLPropString(cur, "tray");
- removable = virXMLPropString(cur, "removable");
- rotation_rate = virXMLPropString(cur, "rotation_rate");
-
- /* HACK: Work around for compat with Xen
- * driver in previous libvirt releases */
- if (target &&
- STRPREFIX(target, "ioemu:"))
- memmove(target, target+6, strlen(target)-5);
- } else if (!domain_name &&
- virXMLNodeNameEqual(cur, "backenddomain")) {
- domain_name = virXMLPropString(cur, "name");
- } else if (virXMLNodeNameEqual(cur, "geometry")) {
- if (virDomainDiskDefGeometryParse(def, cur) < 0)
- return NULL;
- } else if (virXMLNodeNameEqual(cur, "blockio")) {
- logical_block_size =
- virXMLPropString(cur, "logical_block_size");
- if (logical_block_size &&
- virStrToLong_ui(logical_block_size, NULL, 0,
- &def->blockio.logical_block_size) < 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("invalid logical block size '%s'"),
- logical_block_size);
- return NULL;
- }
- physical_block_size =
- virXMLPropString(cur, "physical_block_size");
- if (physical_block_size &&
- virStrToLong_ui(physical_block_size, NULL, 0,
- &def->blockio.physical_block_size) < 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("invalid physical block size '%s'"),
- physical_block_size);
- return NULL;
- }
- } else if (!virDomainDiskGetDriver(def) &&
- virXMLNodeNameEqual(cur, "driver")) {
- if (virDomainVirtioOptionsParseXML(cur, &def->virtio) < 0)
- return NULL;
+ if ((geometry_node = virXPathNode("./geometry", ctxt)) &&
+ (virDomainDiskDefGeometryParse(def, geometry_node) < 0))
+ return NULL;
- if (virDomainDiskDefDriverParseXML(def, cur, ctxt) < 0)
- return NULL;
- } else if (!def->mirror &&
- virXMLNodeNameEqual(cur, "mirror") &&
- !(flags & VIR_DOMAIN_DEF_PARSE_INACTIVE)) {
- if (virDomainDiskDefMirrorParse(def, cur, ctxt, flags, xmlopt) < 0)
- return NULL;
- } else if (!authdef &&
- virXMLNodeNameEqual(cur, "auth")) {
- if (!(authdef = virStorageAuthDefParse(cur, ctxt)))
- return NULL;
- def->diskElementAuth = true;
- } else if (virXMLNodeNameEqual(cur, "iotune")) {
- if (virDomainDiskDefIotuneParse(def, ctxt) < 0)
- return NULL;
- } else if (virXMLNodeNameEqual(cur, "readonly")) {
- def->src->readonly = true;
- } else if (virXMLNodeNameEqual(cur, "shareable")) {
- def->src->shared = true;
- } else if (virXMLNodeNameEqual(cur, "transient")) {
- def->transient = true;
- } else if (!encryption &&
- virXMLNodeNameEqual(cur, "encryption")) {
- if (!(encryption = virStorageEncryptionParseNode(cur, ctxt)))
- return NULL;
+ if ((logical_block_size =
+ virXPathString("string(./blockio/@logical_block_size)", ctxt))
&&
+ (virStrToLong_ui(logical_block_size, NULL, 0,
+ &def->blockio.logical_block_size) < 0)) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("invalid logical block size '%s'"),
+ logical_block_size);
+ return NULL;
+ }
- def->diskElementEnc = true;
+ if ((physical_block_size =
+ virXPathString("string(./blockio/@physical_block_size)", ctxt))
&&
+ (virStrToLong_ui(physical_block_size, NULL, 0,
+ &def->blockio.physical_block_size) < 0)) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("invalid physical block size '%s'"),
+ physical_block_size);
+ return NULL;
+ }
- } else if (!serial &&
- virXMLNodeNameEqual(cur, "serial")) {
- if (!(serial = virXMLNodeContentString(cur)))
- return NULL;
- } else if (!wwn &&
- virXMLNodeNameEqual(cur, "wwn")) {
- if (!(wwn = virXMLNodeContentString(cur)))
- return NULL;
+ if ((driver_node = virXPathNode("./driver", ctxt))) {
+ if (virDomainVirtioOptionsParseXML(driver_node, &def->virtio) < 0)
+ return NULL;
+ if (virDomainDiskDefDriverParseXML(def, driver_node, ctxt) < 0)
+ return NULL;
+ }
- if (!virValidateWWN(wwn))
- return NULL;
- } else if (!vendor &&
- virXMLNodeNameEqual(cur, "vendor")) {
- if (!(vendor = virXMLNodeContentString(cur)))
- return NULL;
+ if ((mirror_node = virXPathNode("./mirror", ctxt)) &&
+ !(flags & VIR_DOMAIN_DEF_PARSE_INACTIVE) &&
+ (virDomainDiskDefMirrorParse(def, mirror_node, ctxt, flags, xmlopt) < 0))
+ return NULL;
- if (!virStringIsPrintable(vendor)) {
- virReportError(VIR_ERR_XML_ERROR, "%s",
- _("disk vendor is not printable string"));
- return NULL;
- }
- } else if (!product &&
- virXMLNodeNameEqual(cur, "product")) {
- if (!(product = virXMLNodeContentString(cur)))
- return NULL;
+ if ((auth_node = virXPathNode("./auth", ctxt))) {
+ if (!(authdef = virStorageAuthDefParse(auth_node, ctxt)))
+ return NULL;
+ def->diskElementAuth = true;
+ }
- if (!virStringIsPrintable(product)) {
- virReportError(VIR_ERR_XML_ERROR, "%s",
- _("disk product is not printable string"));
- return NULL;
- }
- } else if (virXMLNodeNameEqual(cur, "boot")) {
- /* boot is parsed as part of virDomainDeviceInfoParseXML */
- } else if ((flags & VIR_DOMAIN_DEF_PARSE_STATUS) &&
- virXMLNodeNameEqual(cur, "diskSecretsPlacement")) {
- g_autofree char *secretAuth = virXMLPropString(cur, "auth");
- g_autofree char *secretEnc = virXMLPropString(cur, "enc");
+ if (virXPathNode("./iotune", ctxt) &&
+ (virDomainDiskDefIotuneParse(def, ctxt) < 0))
+ return NULL;
- def->diskElementAuth = !!secretAuth;
- def->diskElementEnc = !!secretEnc;
- }
+ if (virXPathNode("./readonly", ctxt))
+ def->src->readonly = true;
+
+ if (virXPathNode("./shareable", ctxt))
+ def->src->shared = true;
+
+ if (virXPathNode("./transient", ctxt))
+ def->transient = true;
+
+ if ((encryption_node = virXPathNode("./encryption", ctxt))) {
+ if (!(encryption = virStorageEncryptionParseNode(encryption_node, ctxt)))
+ return NULL;
+ def->diskElementEnc = true;
+ }
+
+ if (virXPathNode("./serial", ctxt) &&
+ !(serial = virXPathString("string(./serial)", ctxt)))
+ return NULL;
+
+ if (virXPathNode("./wwn", ctxt)) {
+ if (!(wwn = virXPathString("string(./wwn)", ctxt)))
+ return NULL;
+ if (!virValidateWWN(wwn))
+ return NULL;
+ }
+
+ if ((vendor = virXPathString("string(./vendor)", ctxt)) &&
+ !virStringIsPrintable(vendor)) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("disk vendor is not printable string"));
+ return NULL;
+ }
+
+ if ((product = virXPathString("string(./product)", ctxt)) &&
+ !virStringIsPrintable(product)) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("disk product is not printable string"));
+ return NULL;
+ }
+
+ if ((flags & VIR_DOMAIN_DEF_PARSE_STATUS) &&
+ virXPathNode("./diskSecretsPlacement", ctxt)) {
+ g_autofree char *secretAuth =
+ virXPathString("string(./diskSecretsPlacement/@auth)", ctxt);
+ g_autofree char *secretEnc =
+ virXPathString("string(./diskSecretsPlacement/@enc)", ctxt);
+
+ def->diskElementAuth = !!secretAuth;
+ def->diskElementEnc = !!secretEnc;
}
/* Reset def->src->type in case when 'source' was not present */
--
2.30.2