[libvirt] [PATCH v2 1/2] qemu: Don't mangle the storage format for type='dir'

Martin Kletzander mkletzan at redhat.com
Tue Aug 29 08:34:06 UTC 2017


Our backing probing code handles directory file types properly in
virStorageFileGetMetadataRecurse(), by that I mean it leaves them
alone.  However its caller, the virStorageFileGetMetadata() resets the
type to raw before probing, without even checking the type.  We need
to special-case TYPE_DIR in order to achieve desired results.

Also, in order to properly test this, we need to stop resetting format
of volumes in tests for TYPE_DIR (probably the reason why we didn't
catch that and why the test data didn't need to be modified).

Partially-resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1443434

Signed-off-by: Martin Kletzander <mkletzan at redhat.com>
---
 src/storage/storage_source.c | 12 +++++++++---
 tests/virstoragetest.c       | 11 +++++++++--
 2 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/src/storage/storage_source.c b/src/storage/storage_source.c
index b620153f1e5a..bf47622372ab 100644
--- a/src/storage/storage_source.c
+++ b/src/storage/storage_source.c
@@ -527,14 +527,20 @@ virStorageFileGetMetadata(virStorageSourcePtr src,
               allow_probe, report_broken);
 
     virHashTablePtr cycle = NULL;
+    virStorageType actualType = virStorageSourceGetActualType(src);
     int ret = -1;
 
     if (!(cycle = virHashCreate(5, NULL)))
         return -1;
 
-    if (src->format <= VIR_STORAGE_FILE_NONE)
-        src->format = allow_probe ?
-            VIR_STORAGE_FILE_AUTO : VIR_STORAGE_FILE_RAW;
+    if (src->format <= VIR_STORAGE_FILE_NONE) {
+        if (actualType == VIR_STORAGE_TYPE_DIR)
+            src->format = VIR_STORAGE_FILE_DIR;
+        else if (allow_probe)
+            src->format = VIR_STORAGE_FILE_AUTO;
+        else
+            src->format = VIR_STORAGE_FILE_RAW;
+    }
 
     ret = virStorageFileGetMetadataRecurse(src, src, uid, gid,
                                            allow_probe, report_broken, cycle);
diff --git a/tests/virstoragetest.c b/tests/virstoragetest.c
index d83db78f566f..60e3164b0ac8 100644
--- a/tests/virstoragetest.c
+++ b/tests/virstoragetest.c
@@ -111,7 +111,6 @@ testStorageFileGetMetadata(const char *path,
     if (stat(path, &st) == 0) {
         if (S_ISDIR(st.st_mode)) {
             ret->type = VIR_STORAGE_TYPE_DIR;
-            ret->format = VIR_STORAGE_FILE_DIR;
         } else if (S_ISBLK(st.st_mode)) {
             ret->type = VIR_STORAGE_TYPE_BLOCK;
         }
@@ -963,7 +962,15 @@ mymain(void)
         .type = VIR_STORAGE_TYPE_DIR,
         .format = VIR_STORAGE_FILE_DIR,
     };
-    TEST_CHAIN(absdir, VIR_STORAGE_FILE_AUTO,
+    testFileData dir_as_raw = {
+        .path = canondir,
+        .type = VIR_STORAGE_TYPE_DIR,
+        .format = VIR_STORAGE_FILE_RAW,
+    };
+    TEST_CHAIN(absdir, VIR_STORAGE_FILE_RAW,
+               (&dir_as_raw), EXP_PASS,
+               (&dir_as_raw), ALLOW_PROBE | EXP_PASS);
+    TEST_CHAIN(absdir, VIR_STORAGE_FILE_NONE,
                (&dir), EXP_PASS,
                (&dir), ALLOW_PROBE | EXP_PASS);
     TEST_CHAIN(absdir, VIR_STORAGE_FILE_DIR,
-- 
2.14.1




More information about the libvir-list mailing list