[libvirt] [PATCH v4 2/9] virstoragefile: Always use virStorageSourceGetBackingStore to get backing store

Matthias Gatto matthias.gatto at outscale.com
Tue Mar 17 19:25:35 UTC 2015


Uniformize backing store usage by calling virStorageSourceGetBackingStore
instead of setting backing store manually.

Signed-off-by: Matthias Gatto <matthias.gatto at outscale.com>
---
 src/conf/domain_conf.c                |  7 ++++---
 src/conf/storage_conf.c               |  6 +++---
 src/qemu/qemu_cgroup.c                |  4 ++--
 src/qemu/qemu_domain.c                |  2 +-
 src/qemu/qemu_driver.c                | 18 ++++++++++--------
 src/security/security_dac.c           |  2 +-
 src/security/security_selinux.c       |  4 ++--
 src/security/virt-aa-helper.c         |  2 +-
 src/storage/storage_backend.c         | 33 ++++++++++++++++++---------------
 src/storage/storage_backend_fs.c      | 33 ++++++++++++++++++---------------
 src/storage/storage_backend_gluster.c |  8 +++++---
 src/storage/storage_backend_logical.c | 10 ++++++----
 src/util/virstoragefile.c             | 20 ++++++++++----------
 tests/virstoragetest.c                | 14 +++++++-------
 14 files changed, 88 insertions(+), 75 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index c75b543..3fd73d7 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -17252,7 +17252,7 @@ virDomainDiskBackingStoreFormat(virBufferPtr buf,
     /* We currently don't output seclabels for backing chain element */
     if (virDomainDiskSourceFormatInternal(buf, backingStore, 0, 0, true) < 0 ||
         virDomainDiskBackingStoreFormat(buf,
-                                        backingStore->backingStore,
+                                        virStorageSourceGetBackingStore(backingStore, 0),
                                         backingStore->backingStoreRaw,
                                         idx + 1) < 0)
         return -1;
@@ -17374,7 +17374,8 @@ virDomainDiskDefFormat(virBufferPtr buf,
     /* Don't format backingStore to inactive XMLs until the code for
      * persistent storage of backing chains is ready. */
     if (!(flags & VIR_DOMAIN_DEF_FORMAT_INACTIVE) &&
-        virDomainDiskBackingStoreFormat(buf, def->src->backingStore,
+        virDomainDiskBackingStoreFormat(buf,
+                                        virStorageSourceGetBackingStore(def->src, 0),
                                         def->src->backingStoreRaw, 1) < 0)
         return -1;
 
@@ -21456,7 +21457,7 @@ virDomainDiskDefForeachPath(virDomainDiskDefPtr disk,
         }
     }
 
-    for (tmp = disk->src; tmp; tmp = tmp->backingStore) {
+    for (tmp = disk->src; tmp; tmp = virStorageSourceGetBackingStore(tmp, 0)) {
         int actualType = virStorageSourceGetActualType(tmp);
         /* execute the callback only for local storage */
         if (actualType != VIR_STORAGE_TYPE_NETWORK &&
diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
index b070448..7ca678b 100644
--- a/src/conf/storage_conf.c
+++ b/src/conf/storage_conf.c
@@ -1327,7 +1327,7 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool,
         if (virStorageSize(unit, capacity, &ret->target.capacity) < 0)
             goto error;
     } else if (!(flags & VIR_VOL_XML_PARSE_NO_CAPACITY) &&
-               !((flags & VIR_VOL_XML_PARSE_OPT_CAPACITY) && ret->target.backingStore)) {
+               !((flags & VIR_VOL_XML_PARSE_OPT_CAPACITY) && virStorageSourceGetBackingStore(&ret->target, 0))) {
         virReportError(VIR_ERR_XML_ERROR, "%s", _("missing capacity element"));
         goto error;
     }
@@ -1648,9 +1648,9 @@ virStorageVolDefFormat(virStoragePoolDefPtr pool,
                                      &def->target, "target") < 0)
         goto cleanup;
 
-    if (def->target.backingStore &&
+    if (virStorageSourceGetBackingStore(&(def->target), 0) &&
         virStorageVolTargetDefFormat(options, &buf,
-                                     def->target.backingStore,
+                                     virStorageSourceGetBackingStore(&(def->target), 0),
                                      "backingStore") < 0)
         goto cleanup;
 
diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c
index 3e30767..f04b0bf 100644
--- a/src/qemu/qemu_cgroup.c
+++ b/src/qemu/qemu_cgroup.c
@@ -121,7 +121,7 @@ qemuSetupDiskCgroup(virDomainObjPtr vm,
     virStorageSourcePtr next;
     bool forceReadonly = false;
 
-    for (next = disk->src; next; next = next->backingStore) {
+    for (next = disk->src; next; next = virStorageSourceGetBackingStore(next, 0)) {
         if (qemuSetImageCgroupInternal(vm, next, false, forceReadonly) < 0)
             return -1;
 
@@ -139,7 +139,7 @@ qemuTeardownDiskCgroup(virDomainObjPtr vm,
 {
     virStorageSourcePtr next;
 
-    for (next = disk->src; next; next = next->backingStore) {
+    for (next = disk->src; next; next = virStorageSourceGetBackingStore(next, 0)) {
         if (qemuSetImageCgroup(vm, next, true) < 0)
             return -1;
     }
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 2eacef2..9ac62e5 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -2736,7 +2736,7 @@ qemuDomainDetermineDiskChain(virQEMUDriverPtr driver,
     if (virStorageSourceIsEmpty(disk->src))
         goto cleanup;
 
-    if (disk->src->backingStore) {
+    if (virStorageSourceGetBackingStore(disk->src, 0)) {
         if (force_probe)
             virStorageSourceBackingStoreClear(disk->src);
         else
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index f4b8dab..e6fb2ae 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -14171,13 +14171,13 @@ qemuDomainSnapshotUndoSingleDiskActive(virQEMUDriverPtr driver,
 
     /* Update vm in place to match changes. */
     tmp = disk->src;
-    disk->src = tmp->backingStore;
+    disk->src = virStorageSourceGetBackingStore(tmp, 0);
     tmp->backingStore = NULL;
     virStorageSourceFree(tmp);
 
     if (persistDisk) {
         tmp = persistDisk->src;
-        persistDisk->src = tmp->backingStore;
+        persistDisk->src = virStorageSourceGetBackingStore(tmp, 0);
         tmp->backingStore = NULL;
         virStorageSourceFree(tmp);
     }
@@ -16294,7 +16294,7 @@ qemuDomainBlockJobImpl(virDomainObjPtr vm,
                 goto endjob;
             }
 
-            if (virStorageFileGetRelativeBackingPath(disk->src->backingStore,
+            if (virStorageFileGetRelativeBackingPath(virStorageSourceGetBackingStore(disk->src, 0),
                                                      baseSource,
                                                      &backingPath) < 0)
                 goto endjob;
@@ -16563,6 +16563,7 @@ qemuDomainBlockCopyCommon(virDomainObjPtr vm,
     virQEMUDriverConfigPtr cfg = NULL;
     const char *format = NULL;
     int desttype = virStorageSourceGetActualType(mirror);
+    virStorageSourcePtr backingStore;
 
     /* Preliminaries: find the disk we are editing, sanity checks */
     virCheckFlags(VIR_DOMAIN_BLOCK_COPY_SHALLOW |
@@ -16606,9 +16607,10 @@ qemuDomainBlockCopyCommon(virDomainObjPtr vm,
     if (qemuDomainDetermineDiskChain(driver, vm, disk, false, true) < 0)
         goto endjob;
 
+    backingStore = virStorageSourceGetBackingStore(disk->src, 0);
     if ((flags & VIR_DOMAIN_BLOCK_COPY_SHALLOW) &&
         mirror->format == VIR_STORAGE_FILE_RAW &&
-        disk->src->backingStore->path) {
+        backingStore->path) {
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                        _("disk '%s' has backing file, so raw shallow copy "
                          "is not possible"),
@@ -17002,7 +17004,7 @@ qemuDomainBlockCommit(virDomainPtr dom,
         goto endjob;
     }
 
-    if (!topSource->backingStore) {
+    if (!virStorageSourceGetBackingStore(topSource, 0)) {
         virReportError(VIR_ERR_INVALID_ARG,
                        _("top '%s' in chain for '%s' has no backing file"),
                        topSource->path, path);
@@ -17010,14 +17012,14 @@ qemuDomainBlockCommit(virDomainPtr dom,
     }
 
     if (!base && (flags & VIR_DOMAIN_BLOCK_COMMIT_SHALLOW))
-        baseSource = topSource->backingStore;
+        baseSource = virStorageSourceGetBackingStore(topSource, 0);
     else if (virStorageFileParseChainIndex(disk->dst, base, &baseIndex) < 0 ||
              !(baseSource = virStorageFileChainLookup(disk->src, topSource,
                                                       base, baseIndex, NULL)))
         goto endjob;
 
     if ((flags & VIR_DOMAIN_BLOCK_COMMIT_SHALLOW) &&
-        baseSource != topSource->backingStore) {
+        baseSource != virStorageSourceGetBackingStore(topSource, 0)) {
         virReportError(VIR_ERR_INVALID_ARG,
                        _("base '%s' is not immediately below '%s' in chain "
                          "for '%s'"),
@@ -19270,7 +19272,7 @@ qemuDomainGetStatsBlock(virQEMUDriverPtr driver,
                 goto cleanup;
             visited++;
             backing_idx++;
-            src = src->backingStore;
+            src = virStorageSourceGetBackingStore(src, 0);
         }
     }
 
diff --git a/src/security/security_dac.c b/src/security/security_dac.c
index deb6980..0c2a226 100644
--- a/src/security/security_dac.c
+++ b/src/security/security_dac.c
@@ -379,7 +379,7 @@ virSecurityDACSetSecurityDiskLabel(virSecurityManagerPtr mgr,
 {
     virStorageSourcePtr next;
 
-    for (next = disk->src; next; next = next->backingStore) {
+    for (next = disk->src; next; next = virStorageSourceGetBackingStore(next, 0)) {
         if (virSecurityDACSetSecurityImageLabel(mgr, def, next) < 0)
             return -1;
     }
diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c
index 6e67a86..a1cab9f 100644
--- a/src/security/security_selinux.c
+++ b/src/security/security_selinux.c
@@ -1146,7 +1146,7 @@ virSecuritySELinuxRestoreSecurityImageLabelInt(virSecurityManagerPtr mgr,
      * be tracked in domain XML, at which point labelskip should be a
      * per-file attribute instead of a disk attribute. */
     if (disk_seclabel && disk_seclabel->labelskip &&
-        !src->backingStore)
+        !virStorageSourceGetBackingStore(src, 0))
         return 0;
 
     /* Don't restore labels on readonly/shared disks, because other VMs may
@@ -1276,7 +1276,7 @@ virSecuritySELinuxSetSecurityDiskLabel(virSecurityManagerPtr mgr,
     bool first = true;
     virStorageSourcePtr next;
 
-    for (next = disk->src; next; next = next->backingStore) {
+    for (next = disk->src; next; next = virStorageSourceGetBackingStore(next, 0)) {
         if (virSecuritySELinuxSetSecurityImageLabelInternal(mgr, def, next,
                                                             first) < 0)
             return -1;
diff --git a/src/security/virt-aa-helper.c b/src/security/virt-aa-helper.c
index e53779e..7a67071 100644
--- a/src/security/virt-aa-helper.c
+++ b/src/security/virt-aa-helper.c
@@ -942,7 +942,7 @@ get_files(vahControl * ctl)
         /* XXX - if we knew the qemu user:group here we could send it in
          *        so that the open could be re-tried as that user:group.
          */
-        if (!disk->src->backingStore) {
+        if (!virStorageSourceGetBackingStore(disk->src, 0)) {
             bool probe = ctl->allowDiskFormatProbing;
             virStorageFileGetMetadata(disk->src, -1, -1, probe, false);
         }
diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c
index 9322571..884c7cd 100644
--- a/src/storage/storage_backend.c
+++ b/src/storage/storage_backend.c
@@ -879,6 +879,7 @@ virStorageBackendCreateQemuImgCmd(virConnectPtr conn,
     char *opts = NULL;
     bool convert = false;
     bool backing = false;
+    virStorageSourcePtr backingStore;
 
     virCheckFlags(VIR_STORAGE_VOL_CREATE_PREALLOC_METADATA, NULL);
 
@@ -930,11 +931,12 @@ virStorageBackendCreateQemuImgCmd(virConnectPtr conn,
 
     }
 
-    if (vol->target.backingStore) {
+    backingStore = virStorageSourceGetBackingStore(&vol->target, 0);
+    if (backingStore) {
         int accessRetCode = -1;
         char *absolutePath = NULL;
 
-        backingType = virStorageFileFormatTypeToString(vol->target.backingStore->format);
+        backingType = virStorageFileFormatTypeToString(backingStore->format);
 
         if (preallocate) {
             virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
@@ -947,9 +949,9 @@ virStorageBackendCreateQemuImgCmd(virConnectPtr conn,
          * backing store, not really sure what use it serves though, and it
          * may cause issues with lvm. Untested essentially.
          */
-        if (inputvol && inputvol->target.backingStore &&
-            STRNEQ_NULLABLE(inputvol->target.backingStore->path,
-                            vol->target.backingStore->path)) {
+        if (inputvol && virStorageSourceGetBackingStore(&(inputvol->target), 0) &&
+            STRNEQ_NULLABLE(virStorageSourceGetBackingStore(&(inputvol->target), 0)->path,
+                            backingStore->path)) {
             virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                            _("a different backing store cannot be specified."));
             return NULL;
@@ -958,24 +960,24 @@ virStorageBackendCreateQemuImgCmd(virConnectPtr conn,
         if (backingType == NULL) {
             virReportError(VIR_ERR_INTERNAL_ERROR,
                            _("unknown storage vol backing store type %d"),
-                           vol->target.backingStore->format);
+                           backingStore->format);
             return NULL;
         }
 
         /* Convert relative backing store paths to absolute paths for access
          * validation.
          */
-        if ('/' != *(vol->target.backingStore->path) &&
+        if ('/' != *(backingStore->path) &&
             virAsprintf(&absolutePath, "%s/%s", pool->def->target.path,
-                        vol->target.backingStore->path) < 0)
+                        backingStore->path) < 0)
             return NULL;
         accessRetCode = access(absolutePath ? absolutePath
-                               : vol->target.backingStore->path, R_OK);
+                               : backingStore->path, R_OK);
         VIR_FREE(absolutePath);
         if (accessRetCode != 0) {
             virReportSystemError(errno,
                                  _("inaccessible backing store volume %s"),
-                                 vol->target.backingStore->path);
+                                 backingStore->path);
             return NULL;
         }
     }
@@ -1015,8 +1017,9 @@ virStorageBackendCreateQemuImgCmd(virConnectPtr conn,
 
     cmd = virCommandNew(create_tool);
 
+    backingStore = virStorageSourceGetBackingStore(&(vol->target), 0);
     convert = !!inputvol;
-    backing = !inputvol && vol->target.backingStore;
+    backing = !inputvol && backingStore;
 
     if (convert)
         virCommandAddArgList(cmd, "convert", "-f", inputType, "-O", type, NULL);
@@ -1024,7 +1027,7 @@ virStorageBackendCreateQemuImgCmd(virConnectPtr conn,
         virCommandAddArgList(cmd, "create", "-f", type, NULL);
 
     if (backing)
-        virCommandAddArgList(cmd, "-b", vol->target.backingStore->path, NULL);
+        virCommandAddArgList(cmd, "-b", backingStore->path, NULL);
 
     if (imgformat >= QEMU_IMG_BACKING_FORMAT_OPTIONS) {
         if (vol->target.format == VIR_STORAGE_FILE_QCOW2 && !compat &&
@@ -1143,7 +1146,7 @@ virStorageBackendCreateQcowCreate(virConnectPtr conn ATTRIBUTE_UNUSED,
                        vol->target.format);
         return -1;
     }
-    if (vol->target.backingStore != NULL) {
+    if (virStorageSourceGetBackingStore(&(vol->target), 0) != NULL) {
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                        _("copy-on-write image not supported with "
                          "qcow-create"));
@@ -1578,8 +1581,8 @@ virStorageBackendUpdateVolInfo(virStorageVolDefPtr vol,
                                                     openflags)) < 0)
         return ret;
 
-    if (vol->target.backingStore &&
-        (ret = virStorageBackendUpdateVolTargetInfo(vol->target.backingStore,
+    if (virStorageSourceGetBackingStore(&(vol->target), 0) &&
+        (ret = virStorageBackendUpdateVolTargetInfo(virStorageSourceGetBackingStore(&(vol->target), 0),
                                                     withBlockVolFormat,
                                                     VIR_STORAGE_VOL_OPEN_DEFAULT |
                                                     VIR_STORAGE_VOL_OPEN_NOERROR) < 0))
diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c
index 35385db..8df2c0d 100644
--- a/src/storage/storage_backend_fs.c
+++ b/src/storage/storage_backend_fs.c
@@ -70,6 +70,7 @@ virStorageBackendProbeTarget(virStorageSourcePtr target,
     int ret = -1;
     int rc;
     virStorageSourcePtr meta = NULL;
+    virStorageSourcePtr backingStore;
     struct stat sb;
 
     if (encryption)
@@ -96,40 +97,42 @@ virStorageBackendProbeTarget(virStorageSourcePtr target,
         goto cleanup;
 
     if (meta->backingStoreRaw) {
-        if (!(target->backingStore = virStorageSourceNewFromBacking(meta)))
+        backingStore = virStorageSourceGetBackingStore(target, 0);
+        if (!(backingStore = virStorageSourceNewFromBacking(meta)))
             goto cleanup;
 
-        target->backingStore->format = backingStoreFormat;
+        backingStore->format = backingStoreFormat;
 
         /* XXX: Remote storage doesn't play nicely with volumes backed by
          * remote storage. To avoid trouble, just fake the backing store is RAW
          * and put the string from the metadata as the path of the target. */
-        if (!virStorageSourceIsLocalStorage(target->backingStore)) {
-            virStorageSourceFree(target->backingStore);
+        if (!virStorageSourceIsLocalStorage(backingStore)) {
+            virStorageSourceFree(backingStore);
 
-            if (VIR_ALLOC(target->backingStore) < 0)
+            if (VIR_ALLOC(backingStore) < 0)
                 goto cleanup;
 
-            target->backingStore->type = VIR_STORAGE_TYPE_NETWORK;
-            target->backingStore->path = meta->backingStoreRaw;
+            target->backingStore = backingStore;
+            backingStore->type = VIR_STORAGE_TYPE_NETWORK;
+            backingStore->path = meta->backingStoreRaw;
             meta->backingStoreRaw = NULL;
-            target->backingStore->format = VIR_STORAGE_FILE_RAW;
+            backingStore->format = VIR_STORAGE_FILE_RAW;
         }
 
-        if (target->backingStore->format == VIR_STORAGE_FILE_AUTO) {
-            if ((rc = virStorageFileProbeFormat(target->backingStore->path,
+        if (backingStore->format == VIR_STORAGE_FILE_AUTO) {
+            if ((rc = virStorageFileProbeFormat(backingStore->path,
                                                 -1, -1)) < 0) {
                 /* If the backing file is currently unavailable or is
                  * accessed via remote protocol only log an error, fake the
                  * format as RAW and continue. Returning -1 here would
                  * disable the whole storage pool, making it unavailable for
                  * even maintenance. */
-                target->backingStore->format = VIR_STORAGE_FILE_RAW;
+                backingStore->format = VIR_STORAGE_FILE_RAW;
                 virReportError(VIR_ERR_INTERNAL_ERROR,
                                _("cannot probe backing volume format: %s"),
-                               target->backingStore->path);
+                               backingStore->path);
             } else {
-                target->backingStore->format = rc;
+                backingStore->format = rc;
             }
         }
     }
@@ -900,8 +903,8 @@ virStorageBackendFileSystemRefresh(virConnectPtr conn ATTRIBUTE_UNUSED,
         if (vol->target.format == VIR_STORAGE_FILE_DIR)
             vol->type = VIR_STORAGE_VOL_DIR;
 
-        if (vol->target.backingStore) {
-            ignore_value(virStorageBackendUpdateVolTargetInfo(vol->target.backingStore,
+        if (virStorageSourceGetBackingStore(&(vol->target), 0)) {
+            ignore_value(virStorageBackendUpdateVolTargetInfo(virStorageSourceGetBackingStore(&(vol->target), 0),
                                                               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 d2e79bc..9bddb3b 100644
--- a/src/storage/storage_backend_gluster.c
+++ b/src/storage/storage_backend_gluster.c
@@ -247,6 +247,7 @@ virStorageBackendGlusterRefreshVol(virStorageBackendGlusterStatePtr state,
     char *header = NULL;
     ssize_t len = VIR_STORAGE_MAX_HEADER;
     int backingFormat;
+    virStorageSourcePtr backingStore;
 
     *volptr = NULL;
 
@@ -302,13 +303,14 @@ virStorageBackendGlusterRefreshVol(virStorageBackendGlusterStatePtr state,
     if (meta->backingStoreRaw) {
         if (VIR_ALLOC(vol->target.backingStore) < 0)
             goto cleanup;
+        backingStore = virStorageSourceGetBackingStore(&vol->target, 0);
 
-        vol->target.backingStore->path = meta->backingStoreRaw;
+        backingStore->path = meta->backingStoreRaw;
 
         if (backingFormat < 0)
-            vol->target.backingStore->format = VIR_STORAGE_FILE_RAW;
+            backingStore->format = VIR_STORAGE_FILE_RAW;
         else
-            vol->target.backingStore->format = backingFormat;
+            backingStore->format = backingFormat;
         meta->backingStoreRaw = NULL;
     }
 
diff --git a/src/storage/storage_backend_logical.c b/src/storage/storage_backend_logical.c
index 7ba8ded..fb0192c 100644
--- a/src/storage/storage_backend_logical.c
+++ b/src/storage/storage_backend_logical.c
@@ -151,11 +151,11 @@ virStorageBackendLogicalMakeVol(char **const groups,
         if (VIR_ALLOC(vol->target.backingStore) < 0)
             goto cleanup;
 
-        if (virAsprintf(&vol->target.backingStore->path, "%s/%s",
+        if (virAsprintf(&virStorageSourceGetBackingStore(&vol->target, 0)->path, "%s/%s",
                         pool->def->target.path, groups[1]) < 0)
             goto cleanup;
 
-        vol->target.backingStore->format = VIR_STORAGE_POOL_LOGICAL_LVM2;
+        virStorageSourceGetBackingStore(&vol->target, 0)->format = VIR_STORAGE_POOL_LOGICAL_LVM2;
     }
 
     if (!vol->key && VIR_STRDUP(vol->key, groups[2]) < 0)
@@ -732,6 +732,7 @@ virStorageBackendLogicalCreateVol(virConnectPtr conn,
     virCommandPtr cmd = NULL;
     virErrorPtr err;
     struct stat sb;
+    virStorageSourcePtr backingStore;
 
     if (vol->target.encryption != NULL) {
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
@@ -764,8 +765,9 @@ virStorageBackendLogicalCreateVol(virConnectPtr conn,
     }
     virCommandAddArgFormat(cmd, "%lluK", VIR_DIV_UP(vol->target.capacity,
                                                     1024));
-    if (vol->target.backingStore)
-        virCommandAddArgList(cmd, "-s", vol->target.backingStore->path, NULL);
+    backingStore = virStorageSourceGetBackingStore(&(vol->target), 0);
+    if (backingStore)
+        virCommandAddArgList(cmd, "-s", backingStore->path, NULL);
     else
         virCommandAddArg(cmd, pool->def->source.name);
 
diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c
index 9a3e39b..ef8053d 100644
--- a/src/util/virstoragefile.c
+++ b/src/util/virstoragefile.c
@@ -1076,10 +1076,10 @@ virStorageFileChainGetBroken(virStorageSourcePtr chain,
     if (!chain)
         return 0;
 
-    for (tmp = chain; tmp; tmp = tmp->backingStore) {
+    for (tmp = chain; tmp; tmp = virStorageSourceGetBackingStore(tmp, 0)) {
         /* Break when we hit end of chain; report error if we detected
          * a missing backing file, infinite loop, or other error */
-        if (!tmp->backingStore && tmp->backingStoreRaw) {
+        if (!virStorageSourceGetBackingStore(tmp, 0) && tmp->backingStoreRaw) {
             if (VIR_STRDUP(*brokenFile, tmp->backingStoreRaw) < 0)
                 return -1;
 
@@ -1334,8 +1334,8 @@ virStorageFileChainLookup(virStorageSourcePtr chain,
     *parent = NULL;
 
     if (startFrom) {
-        while (chain && chain != startFrom->backingStore) {
-            chain = chain->backingStore;
+        while (chain && chain != virStorageSourceGetBackingStore(startFrom, 0)) {
+            chain = virStorageSourceGetBackingStore(chain, 0);
             i++;
         }
         *parent = startFrom;
@@ -1343,7 +1343,7 @@ virStorageFileChainLookup(virStorageSourcePtr chain,
 
     while (chain) {
         if (!name && !idx) {
-            if (!chain->backingStore)
+            if (!virStorageSourceGetBackingStore(chain, 0))
                 break;
         } else if (idx) {
             VIR_DEBUG("%zu: %s", i, chain->path);
@@ -1378,7 +1378,7 @@ virStorageFileChainLookup(virStorageSourcePtr chain,
             }
         }
         *parent = chain;
-        chain = chain->backingStore;
+        chain = virStorageSourceGetBackingStore(chain, 0);
         i++;
     }
 
@@ -1880,8 +1880,8 @@ virStorageSourceCopy(const virStorageSource *src,
         !(ret->auth = virStorageAuthDefCopy(src->auth)))
         goto error;
 
-    if (backingChain && src->backingStore) {
-        if (!(ret->backingStore = virStorageSourceCopy(src->backingStore,
+    if (backingChain && virStorageSourceGetBackingStore(src, 0)) {
+        if (!(ret->backingStore = virStorageSourceCopy(virStorageSourceGetBackingStore(src, 0),
                                                        true)))
             goto error;
     }
@@ -2018,7 +2018,7 @@ virStorageSourceBackingStoreClear(virStorageSourcePtr def)
     VIR_FREE(def->backingStoreRaw);
 
     /* recursively free backing chain */
-    virStorageSourceFree(def->backingStore);
+    virStorageSourceFree(virStorageSourceGetBackingStore(def, 0));
     def->backingStore = NULL;
 }
 
@@ -2840,7 +2840,7 @@ virStorageFileGetRelativeBackingPath(virStorageSourcePtr top,
 
     *relpath = NULL;
 
-    for (next = top; next; next = next->backingStore) {
+    for (next = top; next; next = virStorageSourceGetBackingStore(next, 0)) {
         if (!next->relPath) {
             ret = 1;
             goto cleanup;
diff --git a/tests/virstoragetest.c b/tests/virstoragetest.c
index 38ce09e..5bd4637 100644
--- a/tests/virstoragetest.c
+++ b/tests/virstoragetest.c
@@ -403,7 +403,7 @@ testStorageChain(const void *args)
         }
         VIR_FREE(expect);
         VIR_FREE(actual);
-        elt = elt->backingStore;
+        elt = virStorageSourceGetBackingStore(elt, 0);
         i++;
     }
     if (i != data->nfiles) {
@@ -1044,8 +1044,8 @@ mymain(void)
         ret = -1;
         goto cleanup;
     }
-    chain2 = chain->backingStore;
-    chain3 = chain2->backingStore;
+    chain2 = virStorageSourceGetBackingStore(chain, 0);
+    chain3 = virStorageSourceGetBackingStore(chain2, 0);
 
 #define TEST_LOOKUP_TARGET(id, target, from, name, index, result,       \
                            meta, parent)                                \
@@ -1110,8 +1110,8 @@ mymain(void)
         ret = -1;
         goto cleanup;
     }
-    chain2 = chain->backingStore;
-    chain3 = chain2->backingStore;
+    chain2 = virStorageSourceGetBackingStore(chain, 0);
+    chain3 = virStorageSourceGetBackingStore(chain2, 0);
 
     TEST_LOOKUP(28, NULL, "bogus", NULL, NULL, NULL);
     TEST_LOOKUP(29, chain, "bogus", NULL, NULL, NULL);
@@ -1157,8 +1157,8 @@ mymain(void)
         ret = -1;
         goto cleanup;
     }
-    chain2 = chain->backingStore;
-    chain3 = chain2->backingStore;
+    chain2 = virStorageSourceGetBackingStore(chain, 0);
+    chain3 = virStorageSourceGetBackingStore(chain2, 0);
 
     TEST_LOOKUP(56, NULL, "bogus", NULL, NULL, NULL);
     TEST_LOOKUP(57, NULL, "sub/link2", chain->path, chain, NULL);
-- 
1.8.3.1




More information about the libvir-list mailing list