From 10cc0570741f5c14dcb8ff4ac14a2fadcd6884dc Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Fri, 3 Nov 2023 14:26:35 +0100 Subject: [PATCH] qemuBlockStorageSourceAttachPrepareBlockdev: Prepare for optionally missing format layer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Restructure the code logic so that the function is prepared for the possibility that the 'format' blockdev layer may be missing if not needed. To achieve this we need to introduce logic that selects which node (format/slice/storage) becomes the effective node and thus formats the correct set of arguments. Signed-off-by: Peter Krempa Reviewed-by: Ján Tomko --- src/qemu/qemu_block.c | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c index 7ee565c15f..9d8b3012c7 100644 --- a/src/qemu/qemu_block.c +++ b/src/qemu/qemu_block.c @@ -1533,22 +1533,34 @@ qemuBlockStorageSourceAttachPrepareBlockdev(virStorageSource *src, virStorageSource *backingStore) { g_autoptr(qemuBlockStorageSourceAttachData) data = NULL; + bool effective = true; unsigned int backendpropsflags = 0; data = g_new0(qemuBlockStorageSourceAttachData, 1); - if (!(data->formatProps = qemuBlockStorageSourceGetFormatProps(src, backingStore)) || - !(data->storageProps = qemuBlockStorageSourceGetBackendProps(src, - backendpropsflags))) + if (qemuBlockStorageSourceGetFormatNodename(src)) { + if (!(data->formatProps = qemuBlockStorageSourceGetFormatProps(src, backingStore))) + return NULL; + + data->formatNodeName = qemuBlockStorageSourceGetFormatNodename(src); + + effective = false; + } + + if ((data->storageSliceNodeName = qemuBlockStorageSourceGetSliceNodename(src))) { + if (!(data->storageSliceProps = qemuBlockStorageSourceGetBlockdevStorageSliceProps(src, effective))) + return NULL; + + effective = false; + } + + if (effective) + backendpropsflags = QEMU_BLOCK_STORAGE_SOURCE_BACKEND_PROPS_EFFECTIVE_NODE; + + if (!(data->storageProps = qemuBlockStorageSourceGetBackendProps(src, backendpropsflags))) return NULL; data->storageNodeName = qemuBlockStorageSourceGetStorageNodename(src); - data->formatNodeName = qemuBlockStorageSourceGetFormatNodename(src); - - if ((data->storageSliceNodeName = qemuBlockStorageSourceGetSliceNodename(src))) { - if (!(data->storageSliceProps = qemuBlockStorageSourceGetBlockdevStorageSliceProps(src, false))) - return NULL; - } return g_steal_pointer(&data); }