From ec2f52e9e935136d8517567bbe0e56c6e8c40af1 Mon Sep 17 00:00:00 2001 Message-Id: From: Peter Krempa Date: Wed, 19 Feb 2020 15:10:05 +0100 Subject: [PATCH] qemu: hotplug: Fix handling of the 'copy-on-read' layer with blockdev MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit My original implementation was completely broken because it attempted to use object-add/del instead of blockdev-add/del. https://bugzilla.redhat.com/show_bug.cgi?id=1798366 Signed-off-by: Peter Krempa Reviewed-by: Ján Tomko Reviewed-by: Daniel Henrique Barboza (cherry picked from commit b71cf8726c25ea135ac81051e332544e6b886ad2) https://bugzilla.redhat.com/show_bug.cgi?id=1798366 Message-Id: <170358b3722e56fc308e7cf3b0a2625349346ae9.1582120424.git.pkrempa@redhat.com> Reviewed-by: Ján Tomko --- src/qemu/qemu_hotplug.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 31d455505b..12bc1f9dd5 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -680,6 +680,7 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver, g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver); g_autoptr(virJSONValue) corProps = NULL; g_autofree char *corAlias = NULL; + bool corAdded = false; bool blockdev = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV); if (qemuDomainStorageSourceChainAccessAllow(driver, vm, disk->src) < 0) @@ -692,9 +693,12 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver, goto cleanup; if (blockdev) { - if (disk->copy_on_read == VIR_TRISTATE_SWITCH_ON && - !(corProps = qemuBlockStorageGetCopyOnReadProps(disk))) - goto cleanup; + if (disk->copy_on_read == VIR_TRISTATE_SWITCH_ON) { + if (!(corProps = qemuBlockStorageGetCopyOnReadProps(disk))) + goto cleanup; + + corAlias = g_strdup(QEMU_DOMAIN_DISK_PRIVATE(disk)->nodeCopyOnRead); + } if (!(data = qemuBuildStorageSourceChainAttachPrepareBlockdev(disk->src, priv->qemuCaps))) @@ -719,9 +723,12 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver, if (qemuBlockStorageSourceChainAttach(priv->mon, data) < 0) goto exit_monitor; - if (corProps && - qemuMonitorAddObject(priv->mon, &corProps, &corAlias) < 0) - goto exit_monitor; + if (corProps) { + if (qemuMonitorBlockdevAdd(priv->mon, &corProps) < 0) + goto exit_monitor; + + corAdded = true; + } if (qemuDomainAttachExtensionDevice(priv->mon, &disk->info) < 0) goto exit_monitor; @@ -763,8 +770,8 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver, return ret; exit_monitor: - if (corAlias) - ignore_value(qemuMonitorDelObject(priv->mon, corAlias)); + if (corAdded) + ignore_value(qemuMonitorBlockdevDel(priv->mon, corAlias)); qemuBlockStorageSourceChainDetach(priv->mon, data); if (qemuDomainObjExitMonitor(driver, vm) < 0) @@ -4252,7 +4259,7 @@ qemuDomainRemoveDiskDevice(virQEMUDriverPtr driver, qemuDomainObjEnterMonitor(driver, vm); if (corAlias) - ignore_value(qemuMonitorDelObject(priv->mon, corAlias)); + ignore_value(qemuMonitorBlockdevDel(priv->mon, corAlias)); if (diskBackend) qemuBlockStorageSourceChainDetach(priv->mon, diskBackend); -- 2.25.0