From 3401e208ab1dcea4694e5b18623d9b91d4bc286f Mon Sep 17 00:00:00 2001 From: Martin Kletzander Date: Aug 29 2017 14:30:04 +0000 Subject: qemu: Don't mangle the storage format for type='dir' 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 --- diff --git a/src/storage/storage_source.c b/src/storage/storage_source.c index b620153..bf47622 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 d83db78..60e3164 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,