[libvirt] [PATCH 2/6] storage: Track backing store of a volume in the target struct

Peter Krempa pkrempa at redhat.com
Tue Jul 15 13:25:15 UTC 2014


As we have a nested pointer for storing the backing store of a volume
there's no need to store it in a separate struct.
---
 src/conf/storage_conf.c               | 53 ++++++++++++++++++++---------------
 src/conf/storage_conf.h               |  1 -
 src/storage/storage_backend.c         | 27 +++++++++---------
 src/storage/storage_backend_fs.c      |  9 ++++--
 src/storage/storage_backend_gluster.c | 20 +++++++++----
 src/storage/storage_backend_logical.c | 11 +++++---
 6 files changed, 72 insertions(+), 49 deletions(-)

diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
index aa29658..c79aebd 100644
--- a/src/conf/storage_conf.c
+++ b/src/conf/storage_conf.c
@@ -331,7 +331,6 @@ virStorageVolDefFree(virStorageVolDefPtr def)
     VIR_FREE(def->source.extents);

     virStorageSourceClear(&def->target);
-    virStorageSourceClear(&def->backingStore);
     VIR_FREE(def);
 }

@@ -1168,6 +1167,7 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool,
     char *allocation = NULL;
     char *capacity = NULL;
     char *unit = NULL;
+    char *backingStore = NULL;
     xmlNodePtr node;
     xmlNodePtr *nodes = NULL;
     size_t i;
@@ -1252,21 +1252,35 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool,
             goto error;
     }

-    ret->backingStore.path = virXPathString("string(./backingStore/path)", ctxt);
-    if (options->formatFromString) {
-        char *format = virXPathString("string(./backingStore/format/@type)", ctxt);
-        if (format == NULL)
-            ret->backingStore.format = options->defaultFormat;
-        else
-            ret->backingStore.format = (options->formatFromString)(format);
+    if ((backingStore = virXPathString("string(./backingStore/path)", ctxt))) {
+        if (VIR_ALLOC(ret->target.backingStore) < 0)
+            goto error;

-        if (ret->backingStore.format < 0) {
-            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                           _("unknown volume format type %s"), format);
+        ret->target.backingStore->path = backingStore;
+        backingStore = NULL;
+
+        if (options->formatFromString) {
+            char *format = virXPathString("string(./backingStore/format/@type)", ctxt);
+            if (format == NULL)
+                ret->target.backingStore->format = options->defaultFormat;
+            else
+                ret->target.backingStore->format = (options->formatFromString)(format);
+
+            if (ret->target.backingStore->format < 0) {
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                               _("unknown volume format type %s"), format);
+                VIR_FREE(format);
+                goto error;
+            }
             VIR_FREE(format);
-            goto error;
         }
-        VIR_FREE(format);
+
+        if (VIR_ALLOC(ret->target.backingStore->perms) < 0)
+            goto error;
+        if (virStorageDefParsePerms(ctxt, ret->target.backingStore->perms,
+                                    "./backingStore/permissions",
+                                    DEFAULT_VOL_PERM_MODE) < 0)
+            goto error;
     }

     ret->target.compat = virXPathString("string(./target/compat)", ctxt);
@@ -1308,19 +1322,13 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool,
         VIR_FREE(nodes);
     }

-    if (VIR_ALLOC(ret->backingStore.perms) < 0)
-        goto error;
-    if (virStorageDefParsePerms(ctxt, ret->backingStore.perms,
-                                "./backingStore/permissions",
-                                DEFAULT_VOL_PERM_MODE) < 0)
-        goto error;
-
  cleanup:
     VIR_FREE(nodes);
     VIR_FREE(allocation);
     VIR_FREE(capacity);
     VIR_FREE(unit);
     VIR_FREE(type);
+    VIR_FREE(backingStore);
     return ret;

  error:
@@ -1544,9 +1552,10 @@ virStorageVolDefFormat(virStoragePoolDefPtr pool,
                                      &def->target, "target") < 0)
         goto cleanup;

-    if (def->backingStore.path &&
+    if (def->target.backingStore &&
         virStorageVolTargetDefFormat(options, &buf,
-                                     &def->backingStore, "backingStore") < 0)
+                                     def->target.backingStore,
+                                     "backingStore") < 0)
         goto cleanup;

     virBufferAdjustIndent(&buf, -2);
diff --git a/src/conf/storage_conf.h b/src/conf/storage_conf.h
index 47f769b..badf7a3 100644
--- a/src/conf/storage_conf.h
+++ b/src/conf/storage_conf.h
@@ -68,7 +68,6 @@ struct _virStorageVolDef {

     virStorageVolSource source;
     virStorageSource target;
-    virStorageSource backingStore;
 };

 typedef struct _virStorageVolDefList virStorageVolDefList;
diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c
index a36996f..f5bfdee 100644
--- a/src/storage/storage_backend.c
+++ b/src/storage/storage_backend.c
@@ -844,11 +844,11 @@ virStorageBackendCreateQemuImgCmd(virConnectPtr conn,

     }

-    if (vol->backingStore.path) {
+    if (vol->target.backingStore) {
         int accessRetCode = -1;
         char *absolutePath = NULL;

-        backingType = virStorageFileFormatTypeToString(vol->backingStore.format);
+        backingType = virStorageFileFormatTypeToString(vol->target.backingStore->format);

         if (preallocate) {
             virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
@@ -862,7 +862,8 @@ virStorageBackendCreateQemuImgCmd(virConnectPtr conn,
          * may cause issues with lvm. Untested essentially.
          */
         if (inputvol &&
-            STRNEQ_NULLABLE(inputvol->backingStore.path, vol->backingStore.path)) {
+            STRNEQ_NULLABLE(inputvol->target.backingStore->path,
+                            vol->target.backingStore->path)) {
             virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                            _("a different backing store cannot be specified."));
             return NULL;
@@ -871,24 +872,24 @@ virStorageBackendCreateQemuImgCmd(virConnectPtr conn,
         if (backingType == NULL) {
             virReportError(VIR_ERR_INTERNAL_ERROR,
                            _("unknown storage vol backing store type %d"),
-                           vol->backingStore.format);
+                           vol->target.backingStore->format);
             return NULL;
         }

         /* Convert relative backing store paths to absolute paths for access
          * validation.
          */
-        if ('/' != *(vol->backingStore.path) &&
+        if ('/' != *(vol->target.backingStore->path) &&
             virAsprintf(&absolutePath, "%s/%s", pool->def->target.path,
-                        vol->backingStore.path) < 0)
+                        vol->target.backingStore->path) < 0)
             return NULL;
         accessRetCode = access(absolutePath ? absolutePath
-                               : vol->backingStore.path, R_OK);
+                               : vol->target.backingStore->path, R_OK);
         VIR_FREE(absolutePath);
         if (accessRetCode != 0) {
             virReportSystemError(errno,
                                  _("inaccessible backing store volume %s"),
-                                 vol->backingStore.path);
+                                 vol->target.backingStore->path);
             return NULL;
         }
     }
@@ -929,7 +930,7 @@ virStorageBackendCreateQemuImgCmd(virConnectPtr conn,
     cmd = virCommandNew(create_tool);

     convert = !!inputvol;
-    backing = !inputvol && vol->backingStore.path;
+    backing = !inputvol && vol->target.backingStore;

     if (convert)
         virCommandAddArgList(cmd, "convert", "-f", inputType, "-O", type, NULL);
@@ -937,7 +938,7 @@ virStorageBackendCreateQemuImgCmd(virConnectPtr conn,
         virCommandAddArgList(cmd, "create", "-f", type, NULL);

     if (backing)
-        virCommandAddArgList(cmd, "-b", vol->backingStore.path, NULL);
+        virCommandAddArgList(cmd, "-b", vol->target.backingStore->path, NULL);

     if (imgformat >= QEMU_IMG_BACKING_FORMAT_OPTIONS) {
         if (vol->target.format == VIR_STORAGE_FILE_QCOW2 && !compat &&
@@ -1055,7 +1056,7 @@ virStorageBackendCreateQcowCreate(virConnectPtr conn ATTRIBUTE_UNUSED,
                        vol->target.format);
         return -1;
     }
-    if (vol->backingStore.path != NULL) {
+    if (vol->target.backingStore != NULL) {
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                        _("copy-on-write image not supported with "
                          "qcow-create"));
@@ -1460,8 +1461,8 @@ virStorageBackendUpdateVolInfo(virStorageVolDefPtr vol,
                                                     openflags)) < 0)
         return ret;

-    if (vol->backingStore.path &&
-        (ret = virStorageBackendUpdateVolTargetInfo(&vol->backingStore,
+    if (vol->target.backingStore &&
+        (ret = virStorageBackendUpdateVolTargetInfo(vol->target.backingStore,
                                                     updateCapacity,
                                                     withBlockVolFormat,
                                                     VIR_STORAGE_VOL_OPEN_DEFAULT)) < 0)
diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c
index 5e65f53..8b0beea 100644
--- a/src/storage/storage_backend_fs.c
+++ b/src/storage/storage_backend_fs.c
@@ -890,10 +890,13 @@ virStorageBackendFileSystemRefresh(virConnectPtr conn ATTRIBUTE_UNUSED,
             vol->type = VIR_STORAGE_VOL_DIR;

         if (backingStore != NULL) {
-            vol->backingStore.path = backingStore;
-            vol->backingStore.format = backingStoreFormat;
+            if (VIR_ALLOC(vol->target.backingStore) < 0)
+                goto cleanup;
+
+            vol->target.backingStore->path = backingStore;
+            vol->target.backingStore->format = backingStoreFormat;

-            ignore_value(virStorageBackendUpdateVolTargetInfo(&vol->backingStore,
+            ignore_value(virStorageBackendUpdateVolTargetInfo(vol->target.backingStore,
                                                               true, false,
                                                               VIR_STORAGE_VOL_OPEN_DEFAULT));
             /* If this failed, the backing file is currently unavailable,
diff --git a/src/storage/storage_backend_gluster.c b/src/storage/storage_backend_gluster.c
index 76d2461..0f8f0f3 100644
--- a/src/storage/storage_backend_gluster.c
+++ b/src/storage/storage_backend_gluster.c
@@ -246,6 +246,7 @@ virStorageBackendGlusterRefreshVol(virStorageBackendGlusterStatePtr state,
     virStorageSourcePtr meta = NULL;
     char *header = NULL;
     ssize_t len = VIR_STORAGE_MAX_HEADER;
+    int backingFormat;

     *volptr = NULL;

@@ -295,16 +296,23 @@ virStorageBackendGlusterRefreshVol(virStorageBackendGlusterStatePtr state,

     if (!(meta = virStorageFileGetMetadataFromBuf(name, header, len,
                                                   VIR_STORAGE_FILE_AUTO,
-                                                  &vol->backingStore.format)))
+                                                  &backingFormat)))
         goto cleanup;

-    vol->backingStore.path = meta->backingStoreRaw;
-    meta->backingStoreRaw = NULL;
+    if (meta->backingStoreRaw) {
+        if (VIR_ALLOC(vol->target.backingStore) < 0)
+            goto cleanup;
+
+        vol->target.backingStore->path = meta->backingStoreRaw;
+
+        if (backingFormat < 0)
+            vol->target.backingStore->format = VIR_STORAGE_FILE_RAW;
+        else
+            vol->target.backingStore->format = backingFormat;
+        meta->backingStoreRaw = NULL;
+    }

     vol->target.format = meta->format;
-    if (vol->backingStore.path &&
-        vol->backingStore.format < 0)
-        vol->backingStore.format = VIR_STORAGE_FILE_RAW;
     if (meta->capacity)
         vol->target.capacity = meta->capacity;
     if (meta->encryption) {
diff --git a/src/storage/storage_backend_logical.c b/src/storage/storage_backend_logical.c
index faa9a4b..60ad5f2 100644
--- a/src/storage/storage_backend_logical.c
+++ b/src/storage/storage_backend_logical.c
@@ -139,11 +139,14 @@ virStorageBackendLogicalMakeVol(char **const groups,
      *  lv is created with "--virtualsize").
      */
     if (groups[1] && !STREQ(groups[1], "") && (groups[1][0] != '[')) {
-        if (virAsprintf(&vol->backingStore.path, "%s/%s",
+        if (VIR_ALLOC(vol->target.backingStore) < 0)
+            goto cleanup;
+
+        if (virAsprintf(&vol->target.backingStore->path, "%s/%s",
                         pool->def->target.path, groups[1]) < 0)
             goto cleanup;

-        vol->backingStore.format = VIR_STORAGE_POOL_LOGICAL_LVM2;
+        vol->target.backingStore->format = VIR_STORAGE_POOL_LOGICAL_LVM2;
     }

     if (!vol->key && VIR_STRDUP(vol->key, groups[2]) < 0)
@@ -752,8 +755,8 @@ virStorageBackendLogicalCreateVol(virConnectPtr conn,
     }
     virCommandAddArgFormat(cmd, "%lluK", VIR_DIV_UP(vol->target.capacity,
                                                     1024));
-    if (vol->backingStore.path)
-        virCommandAddArgList(cmd, "-s", vol->backingStore.path, NULL);
+    if (vol->target.backingStore)
+        virCommandAddArgList(cmd, "-s", vol->target.backingStore->path, NULL);
     else
         virCommandAddArg(cmd, pool->def->source.name);

-- 
2.0.0




More information about the libvir-list mailing list