[PATCHv2 05/33] conf: Fix domain disk path iterator to work with networked storage

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Skip networked storage but continue iteration through backing chain to
iterate through all the local paths in the backing chain.
---

Notes:
    Version 2:
    - no change, v1 already ACKed by Eric

 src/conf/domain_conf.c | 37 ++++++++++++++++++++-----------------
 1 file changed, 20 insertions(+), 17 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 1ddedac..4bc71c8 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -18686,34 +18686,37 @@ virDomainDiskDefForeachPath(virDomainDiskDefPtr disk,
     int ret = -1;
     size_t depth = 0;
     virStorageSourcePtr tmp;
-    const char *path = virDomainDiskGetSource(disk);
-    int type = virDomainDiskGetType(disk);
+    char *brokenRaw = NULL;

-    if (!path || type == VIR_STORAGE_TYPE_NETWORK ||
-        (type == VIR_STORAGE_TYPE_VOLUME &&
-         disk->src.srcpool &&
-         disk->src.srcpool->mode == VIR_STORAGE_SOURCE_POOL_MODE_DIRECT))
-        return 0;
-
-    if (iter(disk, path, 0, opaque) < 0)
-        goto cleanup;
+    if (!ignoreOpenFailure) {
+        if (virStorageFileChainGetBroken(&disk->src, &brokenRaw) < 0)
+            goto cleanup;

-    tmp = disk->src.backingStore;
-    while (tmp && virStorageIsFile(tmp->path)) {
-        if (!ignoreOpenFailure && tmp->backingStoreRaw && !tmp->backingStore) {
+        if (brokenRaw) {
             virReportError(VIR_ERR_INTERNAL_ERROR,
                            _("unable to visit backing chain file %s"),
-                           tmp->backingStoreRaw);
+                           brokenRaw);
             goto cleanup;
         }
-        if (iter(disk, tmp->path, ++depth, opaque) < 0)
-            goto cleanup;
-        tmp = tmp->backingStore;
+    }
+
+    for (tmp = &disk->src; tmp; tmp = tmp->backingStore) {
+        int actualType = virStorageSourceGetActualType(tmp);
+        /* execute the callback only for local storage */
+        if (actualType != VIR_STORAGE_TYPE_NETWORK &&
+            actualType != VIR_STORAGE_TYPE_VOLUME &&
+            tmp->path) {
+            if (iter(disk, tmp->path, depth, opaque) < 0)
+                goto cleanup;
+        }
+
+        depth++;
     }

     ret = 0;

  cleanup:
+    VIR_FREE(brokenRaw);
     return ret;
 }

-- 
1.9.3

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]