]> xenbits.xensource.com Git - libvirt.git/commitdiff
Refactoring virDomainFSDefParseXML() to use XPath
authorKristina Hanicova <khanicov@redhat.com>
Tue, 4 May 2021 11:40:03 +0000 (13:40 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Wed, 5 May 2021 07:12:05 +0000 (09:12 +0200)
Signed-off-by: Kristina Hanicova <khanicov@redhat.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/conf/domain_conf.c
src/conf/domain_conf.h

index d0dc79ad5f4888bc7852e08669ff7071d2a7aad0..82b397b5e56a4d5365cc45ff6cafba2a7b2bfae7 100644 (file)
@@ -9679,7 +9679,8 @@ virDomainFSDefParseXML(virDomainXMLOption *xmlopt,
 {
     VIR_XPATH_NODE_AUTORESTORE(ctxt)
     virDomainFSDef *def;
-    xmlNodePtr cur;
+    xmlNodePtr driver_node = NULL;
+    xmlNodePtr source_node = NULL;
     g_autofree char *type = NULL;
     g_autofree char *fsdriver = NULL;
     g_autofree char *source = NULL;
@@ -9773,55 +9774,52 @@ virDomainFSDefParseXML(virDomainXMLOption *xmlopt,
                             1, ULLONG_MAX, false) < 0)
         goto error;
 
-    cur = node->children;
-    while (cur != NULL) {
-        if (cur->type == XML_ELEMENT_NODE) {
-            if (!source && !sock &&
-                virXMLNodeNameEqual(cur, "source")) {
-                sock = virXMLPropString(cur, "socket");
-                if (def->type == VIR_DOMAIN_FS_TYPE_MOUNT ||
-                    def->type == VIR_DOMAIN_FS_TYPE_BIND) {
-                    source = virXMLPropString(cur, "dir");
-                } else if (def->type == VIR_DOMAIN_FS_TYPE_FILE) {
-                    source = virXMLPropString(cur, "file");
-                } else if (def->type == VIR_DOMAIN_FS_TYPE_BLOCK) {
-                    source = virXMLPropString(cur, "dev");
-                } else if (def->type == VIR_DOMAIN_FS_TYPE_TEMPLATE) {
-                    source = virXMLPropString(cur, "name");
-                } else if (def->type == VIR_DOMAIN_FS_TYPE_RAM) {
-                    usage = virXMLPropString(cur, "usage");
-                    units = virXMLPropString(cur, "units");
-                } else if (def->type == VIR_DOMAIN_FS_TYPE_VOLUME) {
-                    def->src->type = VIR_STORAGE_TYPE_VOLUME;
-                    if (virDomainDiskSourcePoolDefParse(cur, &def->src->srcpool) < 0)
-                        goto error;
-                }
-            } else if (!target &&
-                       virXMLNodeNameEqual(cur, "target")) {
-                target = virXMLPropString(cur, "dir");
-            } else if (virXMLNodeNameEqual(cur, "readonly")) {
-                def->readonly = true;
-            } else if (virXMLNodeNameEqual(cur, "driver")) {
-                if (!fsdriver)
-                    fsdriver = virXMLPropString(cur, "type");
-                if (!wrpolicy)
-                    wrpolicy = virXMLPropString(cur, "wrpolicy");
-                if (!format)
-                    format = virXMLPropString(cur, "format");
-
-                if (virDomainVirtioOptionsParseXML(cur, &def->virtio) < 0)
-                    goto error;
-            }
+    if ((source_node = virXPathNode("./source", ctxt))) {
+        sock = virXMLPropString(source_node, "socket");
+        if (def->type == VIR_DOMAIN_FS_TYPE_MOUNT ||
+            def->type == VIR_DOMAIN_FS_TYPE_BIND) {
+            source = virXMLPropString(source_node, "dir");
+        } else if (def->type == VIR_DOMAIN_FS_TYPE_FILE) {
+            source = virXMLPropString(source_node, "file");
+        } else if (def->type == VIR_DOMAIN_FS_TYPE_BLOCK) {
+            source = virXMLPropString(source_node, "dev");
+        } else if (def->type == VIR_DOMAIN_FS_TYPE_TEMPLATE) {
+            source = virXMLPropString(source_node, "name");
+        } else if (def->type == VIR_DOMAIN_FS_TYPE_RAM) {
+            usage = virXMLPropString(source_node, "usage");
+            units = virXMLPropString(source_node, "units");
+        } else if (def->type == VIR_DOMAIN_FS_TYPE_VOLUME) {
+            def->src->type = VIR_STORAGE_TYPE_VOLUME;
+            if (virDomainDiskSourcePoolDefParse(source_node, &def->src->srcpool) < 0)
+                goto error;
         }
-        cur = cur->next;
     }
 
-    if (fsdriver) {
-        if ((def->fsdriver = virDomainFSDriverTypeFromString(fsdriver)) <= 0) {
+    target = virXPathString("string(./target/@dir)", ctxt);
+
+    if (virXPathNode("./readonly", ctxt))
+        def->readonly = true;
+
+    if ((driver_node = virXPathNode("./driver", ctxt))) {
+        if (virXMLPropEnum(driver_node, "type",
+                           virDomainFSDriverTypeFromString,
+                           VIR_XML_PROP_NONE, &def->fsdriver) < 0)
+            goto error;
+
+        if (virXMLPropEnum(driver_node, "wrpolicy",
+                           virDomainFSWrpolicyTypeFromString,
+                           VIR_XML_PROP_NONE, &def->wrpolicy) < 0)
+            goto error;
+
+        if ((format = virXMLPropString(driver_node, "format")) &&
+            ((def->format = virStorageFileFormatTypeFromString(format)) <= 0)) {
             virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                           _("unknown fs driver type '%s'"), fsdriver);
+                           _("unknown driver format value '%s'"), format);
             goto error;
         }
+
+        if (virDomainVirtioOptionsParseXML(driver_node, &def->virtio) < 0)
+            goto error;
     }
 
     if (def->fsdriver == VIR_DOMAIN_FS_DRIVER_TYPE_VIRTIOFS) {
@@ -9892,24 +9890,6 @@ virDomainFSDefParseXML(virDomainXMLOption *xmlopt,
         }
     }
 
-    if (format) {
-        if ((def->format = virStorageFileFormatTypeFromString(format)) <= 0) {
-            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                           _("unknown driver format value '%s'"), format);
-            goto error;
-        }
-    }
-
-    if (wrpolicy) {
-        if ((def->wrpolicy = virDomainFSWrpolicyTypeFromString(wrpolicy)) <= 0) {
-            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                           _("unknown filesystem write policy '%s'"), wrpolicy);
-            goto error;
-        }
-    } else {
-        def->wrpolicy = VIR_DOMAIN_FS_WRPOLICY_DEFAULT;
-    }
-
     if (source == NULL && def->type != VIR_DOMAIN_FS_TYPE_RAM
         && def->type != VIR_DOMAIN_FS_TYPE_VOLUME && !sock) {
         virReportError(VIR_ERR_NO_SOURCE,
index 85c318d027ce3dc9a958dc0f0ef4459078cafca9..0874c9007f322c8836accef2e972960f53eb40d7 100644 (file)
@@ -859,10 +859,10 @@ typedef enum {
 
 struct _virDomainFSDef {
     int type;
-    int fsdriver; /* enum virDomainFSDriverType */
+    virDomainFSDriverType fsdriver;
     int accessmode; /* enum virDomainFSAccessMode */
-    int wrpolicy; /* enum virDomainFSWrpolicy */
     int format; /* virStorageFileFormat */
+    virDomainFSWrpolicy wrpolicy;
     int model; /* virDomainFSModel */
     unsigned int fmode;
     unsigned int dmode;