From 9c7c4a4fc533598e59e9a0038ec783e61a38e664 Mon Sep 17 00:00:00 2001 From: Adam Litke Date: Wed, 3 Nov 2010 10:50:11 -0500 Subject: [PATCH] Allow non-file disk backingStores I am trying to use a qcow image with libvirt where the backing 'file' is a qemu-nbd server. Unfortunately virDomainDiskDefForeachPath() assumes that backingStore is always a real file so something like 'nbd:0:3333' is rejected because a file with that name cannot be accessed. Note that I am not worried about directly using nbd images. That would require a new disk type with XML markup, etc. I only want it to be permitted as a backingStore The following patch implements danpb's suggestion: > I think I'm inclined to push the logic for skipping NBD one stage higher. > I'd rather expect virStorageFileGetMetadata() to return all backing > stores, even if not files. The virDomainDiskDefForeachPath() method > should definitely ignore non-file backing stores though. > > So what I'm thinking is to extend the virStorageFileMetadata struct and > just add a 'bool isFile' field to it. Default this field to true, unless > you see the prefix of nbd: in which case set it to false. The > virDomainDiskDefForeachPath() method can then skip over any backing > store with isFile == false Signed-off-by: Adam Litke Cc: Daniel P. Berrange --- src/conf/domain_conf.c | 7 +++++++ src/util/storage_file.c | 16 +++++++++++++++- src/util/storage_file.h | 1 + 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 655449c7f6..30c27db1f0 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -8218,6 +8218,13 @@ int virDomainDiskDefForeachPath(virDomainDiskDefPtr disk, depth++; nextpath = meta.backingStore; + /* Stop iterating if we reach a non-file backing store */ + if (nextpath && !meta.backingStoreIsFile) { + VIR_DEBUG("Stopping iteration on non-file backing store: %s", + nextpath); + break; + } + format = meta.backingStoreFormat; if (format == VIR_STORAGE_FILE_AUTO && diff --git a/src/util/storage_file.c b/src/util/storage_file.c index 403b0c0892..f1a445a56d 100644 --- a/src/util/storage_file.c +++ b/src/util/storage_file.c @@ -503,6 +503,14 @@ virStorageFileMatchesVersion(int format, return true; } +static bool +virBackingStoreIsFile(const char *backing) +{ + /* Backing store is a network block device */ + if (STRPREFIX(backing, "nbd:")) + return false; + return true; +} static int virStorageFileGetMetadataFromBuf(int format, @@ -573,8 +581,14 @@ virStorageFileGetMetadataFromBuf(int format, if (ret == BACKING_STORE_ERROR) return -1; + meta->backingStoreIsFile = false; if (backing != NULL) { - meta->backingStore = absolutePathFromBaseFile(path, backing); + if (virBackingStoreIsFile(backing)) { + meta->backingStoreIsFile = true; + meta->backingStore = absolutePathFromBaseFile(path, backing); + } else { + meta->backingStore = strdup(backing); + } VIR_FREE(backing); if (meta->backingStore == NULL) { virReportOOMError(); diff --git a/src/util/storage_file.h b/src/util/storage_file.h index ba44111d99..34ece6d8ef 100644 --- a/src/util/storage_file.h +++ b/src/util/storage_file.h @@ -48,6 +48,7 @@ VIR_ENUM_DECL(virStorageFileFormat); typedef struct _virStorageFileMetadata { char *backingStore; int backingStoreFormat; + bool backingStoreIsFile; unsigned long long capacity; bool encrypted; } virStorageFileMetadata; -- GitLab