mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06: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++;
|
depth++;
|
||||||
nextpath = meta.backingStore;
|
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;
|
format = meta.backingStoreFormat;
|
||||||
|
|
||||||
if (format == VIR_STORAGE_FILE_AUTO &&
|
if (format == VIR_STORAGE_FILE_AUTO &&
|
||||||
|
@ -503,6 +503,14 @@ virStorageFileMatchesVersion(int format,
|
|||||||
return true;
|
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
|
static int
|
||||||
virStorageFileGetMetadataFromBuf(int format,
|
virStorageFileGetMetadataFromBuf(int format,
|
||||||
@ -573,8 +581,14 @@ virStorageFileGetMetadataFromBuf(int format,
|
|||||||
if (ret == BACKING_STORE_ERROR)
|
if (ret == BACKING_STORE_ERROR)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
meta->backingStoreIsFile = false;
|
||||||
if (backing != NULL) {
|
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);
|
VIR_FREE(backing);
|
||||||
if (meta->backingStore == NULL) {
|
if (meta->backingStore == NULL) {
|
||||||
virReportOOMError();
|
virReportOOMError();
|
||||||
|
@ -48,6 +48,7 @@ VIR_ENUM_DECL(virStorageFileFormat);
|
|||||||
typedef struct _virStorageFileMetadata {
|
typedef struct _virStorageFileMetadata {
|
||||||
char *backingStore;
|
char *backingStore;
|
||||||
int backingStoreFormat;
|
int backingStoreFormat;
|
||||||
|
bool backingStoreIsFile;
|
||||||
unsigned long long capacity;
|
unsigned long long capacity;
|
||||||
bool encrypted;
|
bool encrypted;
|
||||||
} virStorageFileMetadata;
|
} virStorageFileMetadata;
|
||||||
|
Loading…
Reference in New Issue
Block a user