[libvirt] [PATCH 06/10] conf: virDomainDiskDefIotuneParse: simplfiy parsing

Peter Krempa pkrempa at redhat.com
Tue Apr 12 13:55:40 UTC 2016


Since the structure was pre-initialized to 0 we don't need to set every
single member to 0 if it's not present in the XML. Additionally if we
put the name of the field into the error message the code can be
simplified using a macro to parse the members.
---
 src/conf/domain_conf.c | 81 +++++++++-----------------------------------------
 1 file changed, 14 insertions(+), 67 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index ac464d3..3c066b4 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -6675,78 +6675,24 @@ virDomainDiskBackingStoreParse(xmlXPathContextPtr ctxt,
     return ret;
 }

+#define PARSE_IOTUNE(val)                                                      \
+    if (virXPathULongLong("string(./iotune/" #val ")",                         \
+                          ctxt, &def->blkdeviotune.val) == -2) {               \
+        virReportError(VIR_ERR_XML_ERROR,                                      \
+                       _("disk iotune field '%s' must be an integer"), #val);  \
+        return -1;                                                             \
+    }

 static int
 virDomainDiskDefIotuneParse(virDomainDiskDefPtr def,
                             xmlXPathContextPtr ctxt)
 {
-    int ret;
-
-    ret = virXPathULongLong("string(./iotune/total_bytes_sec)",
-                            ctxt,
-                            &def->blkdeviotune.total_bytes_sec);
-    if (ret == -2) {
-        virReportError(VIR_ERR_XML_ERROR, "%s",
-                       _("total throughput limit must be an integer"));
-        return -1;
-    } else if (ret < 0) {
-        def->blkdeviotune.total_bytes_sec = 0;
-    }
-
-    ret = virXPathULongLong("string(./iotune/read_bytes_sec)",
-                            ctxt,
-                            &def->blkdeviotune.read_bytes_sec);
-    if (ret == -2) {
-        virReportError(VIR_ERR_XML_ERROR, "%s",
-                       _("read throughput limit must be an integer"));
-        return -1;
-    } else if (ret < 0) {
-        def->blkdeviotune.read_bytes_sec = 0;
-    }
-
-    ret = virXPathULongLong("string(./iotune/write_bytes_sec)",
-                            ctxt,
-                            &def->blkdeviotune.write_bytes_sec);
-    if (ret == -2) {
-        virReportError(VIR_ERR_XML_ERROR, "%s",
-                       _("write throughput limit must be an integer"));
-        return -1;
-    } else if (ret < 0) {
-        def->blkdeviotune.write_bytes_sec = 0;
-    }
-
-    ret = virXPathULongLong("string(./iotune/total_iops_sec)",
-                            ctxt,
-                            &def->blkdeviotune.total_iops_sec);
-    if (ret == -2) {
-        virReportError(VIR_ERR_XML_ERROR, "%s",
-                       _("total I/O operations limit must be an integer"));
-        return -1;
-    } else if (ret < 0) {
-        def->blkdeviotune.total_iops_sec = 0;
-    }
-
-    ret = virXPathULongLong("string(./iotune/read_iops_sec)",
-                            ctxt,
-                            &def->blkdeviotune.read_iops_sec);
-    if (ret == -2) {
-        virReportError(VIR_ERR_XML_ERROR, "%s",
-                       _("read I/O operations limit must be an integer"));
-        return -1;
-    } else if (ret < 0) {
-        def->blkdeviotune.read_iops_sec = 0;
-    }
-
-    ret = virXPathULongLong("string(./iotune/write_iops_sec)",
-                            ctxt,
-                            &def->blkdeviotune.write_iops_sec);
-    if (ret == -2) {
-        virReportError(VIR_ERR_XML_ERROR, "%s",
-                       _("write I/O operations limit must be an integer"));
-        return -1;
-    } else if (ret < 0) {
-        def->blkdeviotune.write_iops_sec = 0;
-    }
+    PARSE_IOTUNE(total_bytes_sec);
+    PARSE_IOTUNE(read_bytes_sec);
+    PARSE_IOTUNE(write_bytes_sec);
+    PARSE_IOTUNE(total_iops_sec);
+    PARSE_IOTUNE(read_iops_sec);
+    PARSE_IOTUNE(write_iops_sec);

     if (virXPathULongLong("string(./iotune/total_bytes_sec_max)",
                           ctxt,
@@ -6833,6 +6779,7 @@ virDomainDiskDefIotuneParse(virDomainDiskDefPtr def,

     return 0;
 }
+#undef PARSE_IOTUNE


 #define VENDOR_LEN  8
-- 
2.8.0




More information about the libvir-list mailing list