When creating overlay images e.g. for snapshots or when merging
snapshots we often specify the backing store string to use. Make the
formatter aware of backing chain entries which have a <slice>
configured so that we record it properly. Otherwise such images
would not work without the XML (when detecting the backing chain).
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
src/qemu/qemu_block.c | 80 ++++++++++++++++++++++++++-----------------
1 file changed, 49 insertions(+), 31 deletions(-)
diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c
index b23a4baae6..8b94365c68 100644
--- a/src/qemu/qemu_block.c
+++ b/src/qemu/qemu_block.c
@@ -1930,44 +1930,48 @@ qemuBlockGetBackingStoreString(virStorageSourcePtr src)
{
int actualType = virStorageSourceGetActualType(src);
g_autoptr(virJSONValue) backingProps = NULL;
+ g_autoptr(virJSONValue) sliceProps = NULL;
+ virJSONValuePtr props = NULL;
g_autoptr(virURI) uri = NULL;
g_autofree char *backingJSON = NULL;
char *ret = NULL;
- if (virStorageSourceIsLocalStorage(src)) {
- ret = g_strdup(src->path);
- return ret;
- }
+ if (!src->sliceStorage) {
+ if (virStorageSourceIsLocalStorage(src)) {
+ ret = g_strdup(src->path);
+ return ret;
+ }
- /* generate simplified URIs for the easy cases */
- if (actualType == VIR_STORAGE_TYPE_NETWORK &&
- src->nhosts == 1 &&
- src->hosts->transport == VIR_STORAGE_NET_HOST_TRANS_TCP) {
+ /* generate simplified URIs for the easy cases */
+ if (actualType == VIR_STORAGE_TYPE_NETWORK &&
+ src->nhosts == 1 &&
+ src->hosts->transport == VIR_STORAGE_NET_HOST_TRANS_TCP) {
+
+ switch ((virStorageNetProtocol) src->protocol) {
+ case VIR_STORAGE_NET_PROTOCOL_NBD:
+ case VIR_STORAGE_NET_PROTOCOL_HTTP:
+ case VIR_STORAGE_NET_PROTOCOL_HTTPS:
+ case VIR_STORAGE_NET_PROTOCOL_FTP:
+ case VIR_STORAGE_NET_PROTOCOL_FTPS:
+ case VIR_STORAGE_NET_PROTOCOL_TFTP:
+ case VIR_STORAGE_NET_PROTOCOL_ISCSI:
+ case VIR_STORAGE_NET_PROTOCOL_GLUSTER:
+ if (!(uri = qemuBlockStorageSourceGetURI(src)))
+ return NULL;
- switch ((virStorageNetProtocol) src->protocol) {
- case VIR_STORAGE_NET_PROTOCOL_NBD:
- case VIR_STORAGE_NET_PROTOCOL_HTTP:
- case VIR_STORAGE_NET_PROTOCOL_HTTPS:
- case VIR_STORAGE_NET_PROTOCOL_FTP:
- case VIR_STORAGE_NET_PROTOCOL_FTPS:
- case VIR_STORAGE_NET_PROTOCOL_TFTP:
- case VIR_STORAGE_NET_PROTOCOL_ISCSI:
- case VIR_STORAGE_NET_PROTOCOL_GLUSTER:
- if (!(uri = qemuBlockStorageSourceGetURI(src)))
- return NULL;
+ if (!(ret = virURIFormat(uri)))
+ return NULL;
- if (!(ret = virURIFormat(uri)))
- return NULL;
+ return ret;
- return ret;
-
- case VIR_STORAGE_NET_PROTOCOL_SHEEPDOG:
- case VIR_STORAGE_NET_PROTOCOL_RBD:
- case VIR_STORAGE_NET_PROTOCOL_VXHS:
- case VIR_STORAGE_NET_PROTOCOL_SSH:
- case VIR_STORAGE_NET_PROTOCOL_LAST:
- case VIR_STORAGE_NET_PROTOCOL_NONE:
- break;
+ case VIR_STORAGE_NET_PROTOCOL_SHEEPDOG:
+ case VIR_STORAGE_NET_PROTOCOL_RBD:
+ case VIR_STORAGE_NET_PROTOCOL_VXHS:
+ case VIR_STORAGE_NET_PROTOCOL_SSH:
+ case VIR_STORAGE_NET_PROTOCOL_LAST:
+ case VIR_STORAGE_NET_PROTOCOL_NONE:
+ break;
+ }
}
}
@@ -1975,7 +1979,21 @@ qemuBlockGetBackingStoreString(virStorageSourcePtr src)
if (!(backingProps = qemuBlockStorageSourceGetBackendProps(src, false, true,
false)))
return NULL;
- if (!(backingJSON = virJSONValueToString(backingProps, false)))
+ props = backingProps;
+
+ if (src->sliceStorage) {
+ if (virJSONValueObjectCreate(&sliceProps,
+ "s:driver", "raw",
+ "U:offset",
src->sliceStorage->offset,
+ "U:size", src->sliceStorage->size,
+ "a:file", &backingProps,
+ NULL) < 0)
+ return NULL;
+
+ props = sliceProps;
+ }
+
+ if (!(backingJSON = virJSONValueToString(props, false)))
return NULL;
ret = g_strdup_printf("json:%s", backingJSON);
--
2.24.1