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(a)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