[libvirt] [PATCH 2/4] logical: Create helper virStorageBackendLogicalParseVolDevice

John Ferlan jferlan at redhat.com
Fri Jan 22 22:21:04 UTC 2016


Create a helper routine in order to parse the 'device' string contained
within the generated 'lvs' output string.

A future patch would then be able to avoid the code more cleanly

Signed-off-by: John Ferlan <jferlan at redhat.com>
---
 src/storage/storage_backend_logical.c | 186 +++++++++++++++++++---------------
 1 file changed, 104 insertions(+), 82 deletions(-)

diff --git a/src/storage/storage_backend_logical.c b/src/storage/storage_backend_logical.c
index 76ea00a..bf67faf 100644
--- a/src/storage/storage_backend_logical.c
+++ b/src/storage/storage_backend_logical.c
@@ -72,21 +72,115 @@ struct virStorageBackendLogicalPoolVolData {
 };
 
 static int
-virStorageBackendLogicalMakeVol(char **const groups,
-                                void *opaque)
+virStorageBackendLogicalParseVolDevice(virStorageVolDefPtr vol,
+                                       char **const groups,
+                                       int nextents,
+                                       unsigned long long size,
+                                       unsigned long long length)
 {
-    struct virStorageBackendLogicalPoolVolData *data = opaque;
-    virStoragePoolObjPtr pool = data->pool;
-    virStorageVolDefPtr vol = NULL;
-    bool is_new_vol = false;
-    unsigned long long offset, size, length;
+    int ret = -1;
     const char *regex_unit = "(\\S+)\\((\\S+)\\)";
     char *regex = NULL;
     regex_t *reg = NULL;
     regmatch_t *vars = NULL;
     char *p = NULL;
     size_t i;
-    int err, nextents, nvars, ret = -1;
+    int err, nvars;
+    unsigned long long offset;
+
+    if (VIR_STRDUP(regex, regex_unit) < 0)
+        goto cleanup;
+
+    for (i = 1; i < nextents; i++) {
+        if (VIR_REALLOC_N(regex, strlen(regex) + strlen(regex_unit) + 2) < 0)
+            goto cleanup;
+        /* "," is the separator of "devices" field */
+        strcat(regex, ",");
+        strncat(regex, regex_unit, strlen(regex_unit));
+    }
+
+    if (VIR_ALLOC(reg) < 0)
+        goto cleanup;
+
+    /* Each extent has a "path:offset" pair, and vars[0] will
+     * be the whole matched string.
+     */
+    nvars = (nextents * 2) + 1;
+    if (VIR_ALLOC_N(vars, nvars) < 0)
+        goto cleanup;
+
+    err = regcomp(reg, regex, REG_EXTENDED);
+    if (err != 0) {
+        char error[100];
+        regerror(err, reg, error, sizeof(error));
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       _("Failed to compile regex %s"),
+                       error);
+        goto cleanup;
+    }
+
+    err = regexec(reg, groups[3], nvars, vars, 0);
+    regfree(reg);
+    if (err != 0) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("malformed volume extent devices value"));
+        goto cleanup;
+    }
+
+    p = groups[3];
+
+    /* vars[0] is skipped */
+    for (i = 0; i < nextents; i++) {
+        size_t j;
+        int len;
+        char *offset_str = NULL;
+
+        j = (i * 2) + 1;
+        len = vars[j].rm_eo - vars[j].rm_so;
+        p[vars[j].rm_eo] = '\0';
+
+        if (VIR_STRNDUP(vol->source.extents[vol->source.nextent].path,
+                        p + vars[j].rm_so, len) < 0)
+            goto cleanup;
+
+        len = vars[j + 1].rm_eo - vars[j + 1].rm_so;
+        if (VIR_STRNDUP(offset_str, p + vars[j + 1].rm_so, len) < 0)
+            goto cleanup;
+
+        if (virStrToLong_ull(offset_str, NULL, 10, &offset) < 0) {
+            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                           _("malformed volume extent offset value"));
+            VIR_FREE(offset_str);
+            goto cleanup;
+        }
+
+        VIR_FREE(offset_str);
+
+        vol->source.extents[vol->source.nextent].start = offset * size;
+        vol->source.extents[vol->source.nextent].end = (offset * size) + length;
+        vol->source.nextent++;
+    }
+
+    ret = 0;
+
+ cleanup:
+    VIR_FREE(regex);
+    VIR_FREE(reg);
+    VIR_FREE(vars);
+    return ret;
+}
+
+
+static int
+virStorageBackendLogicalMakeVol(char **const groups,
+                                void *opaque)
+{
+    struct virStorageBackendLogicalPoolVolData *data = opaque;
+    virStoragePoolObjPtr pool = data->pool;
+    virStorageVolDefPtr vol = NULL;
+    bool is_new_vol = false;
+    unsigned long long size, length;
+    int nextents, ret = -1;
     const char *attrs = groups[9];
 
     /* Skip inactive volume */
@@ -196,78 +290,9 @@ virStorageBackendLogicalMakeVol(char **const groups,
     }
 
     /* Now parse the "devices" field separately */
-    if (VIR_STRDUP(regex, regex_unit) < 0)
-        goto cleanup;
-
-    for (i = 1; i < nextents; i++) {
-        if (VIR_REALLOC_N(regex, strlen(regex) + strlen(regex_unit) + 2) < 0)
-            goto cleanup;
-        /* "," is the separator of "devices" field */
-        strcat(regex, ",");
-        strncat(regex, regex_unit, strlen(regex_unit));
-    }
-
-    if (VIR_ALLOC(reg) < 0)
-        goto cleanup;
-
-    /* Each extent has a "path:offset" pair, and vars[0] will
-     * be the whole matched string.
-     */
-    nvars = (nextents * 2) + 1;
-    if (VIR_ALLOC_N(vars, nvars) < 0)
-        goto cleanup;
-
-    err = regcomp(reg, regex, REG_EXTENDED);
-    if (err != 0) {
-        char error[100];
-        regerror(err, reg, error, sizeof(error));
-        virReportError(VIR_ERR_INTERNAL_ERROR,
-                       _("Failed to compile regex %s"),
-                       error);
-        goto cleanup;
-    }
-
-    err = regexec(reg, groups[3], nvars, vars, 0);
-    regfree(reg);
-    if (err != 0) {
-        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                       _("malformed volume extent devices value"));
+    if (virStorageBackendLogicalParseVolDevice(vol, groups, nextents,
+                                               size, length) < 0)
         goto cleanup;
-    }
-
-    p = groups[3];
-
-    /* vars[0] is skipped */
-    for (i = 0; i < nextents; i++) {
-        size_t j;
-        int len;
-        char *offset_str = NULL;
-
-        j = (i * 2) + 1;
-        len = vars[j].rm_eo - vars[j].rm_so;
-        p[vars[j].rm_eo] = '\0';
-
-        if (VIR_STRNDUP(vol->source.extents[vol->source.nextent].path,
-                        p + vars[j].rm_so, len) < 0)
-            goto cleanup;
-
-        len = vars[j + 1].rm_eo - vars[j + 1].rm_so;
-        if (VIR_STRNDUP(offset_str, p + vars[j + 1].rm_so, len) < 0)
-            goto cleanup;
-
-        if (virStrToLong_ull(offset_str, NULL, 10, &offset) < 0) {
-            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                           _("malformed volume extent offset value"));
-            VIR_FREE(offset_str);
-            goto cleanup;
-        }
-
-        VIR_FREE(offset_str);
-
-        vol->source.extents[vol->source.nextent].start = offset * size;
-        vol->source.extents[vol->source.nextent].end = (offset * size) + length;
-        vol->source.nextent++;
-    }
 
     if (is_new_vol &&
         VIR_APPEND_ELEMENT(pool->volumes.objs, pool->volumes.count, vol) < 0)
@@ -276,9 +301,6 @@ virStorageBackendLogicalMakeVol(char **const groups,
     ret = 0;
 
  cleanup:
-    VIR_FREE(regex);
-    VIR_FREE(reg);
-    VIR_FREE(vars);
     if (is_new_vol && (ret == -1))
         virStorageVolDefFree(vol);
     return ret;
-- 
2.5.0




More information about the libvir-list mailing list