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;