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@xxxxxxxxxx> --- 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