mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-08 22:15:21 +00:00
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 <agl@us.ibm.com> Cc: Daniel P. Berrange <berrange@redhat.com>
This commit is contained in:
parent
c2e9e90742
commit
9c7c4a4fc5
@ -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 &&
|
||||
|
@ -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();
|
||||
|
@ -48,6 +48,7 @@ VIR_ENUM_DECL(virStorageFileFormat);
|
||||
typedef struct _virStorageFileMetadata {
|
||||
char *backingStore;
|
||||
int backingStoreFormat;
|
||||
bool backingStoreIsFile;
|
||||
unsigned long long capacity;
|
||||
bool encrypted;
|
||||
} virStorageFileMetadata;
|
||||
|
Loading…
Reference in New Issue
Block a user