From 9b54efb7cf5c4f28ece9fed59ef711e2958f7854 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Fri, 15 Jul 2022 16:58:34 +0200 Subject: [PATCH] qemu: capabilities: Unconditionally set QEMU_CAPS_BLOCKDEV/QEMU_CAPS_BLOCKDEV_HOSTDEV_SCSI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The cleanup of the code to always assume support for QEMU_CAPS_BLOCKDEV will not be simple, so for now we hardcode the support and the code will be cleaned up gradually. We also disallow users to clear the flags via the namespace property or qemu.conf configuration. The change to the PPC64 test data originates from the fact that the capability dump is not from the release version but is lacking one of the necessary flags to enable -blockdev. Signed-off-by: Peter Krempa Reviewed-by: Pavel Hrdina Reviewed-by: Ján Tomko --- src/qemu/qemu_capabilities.c | 18 +++++------------- src/qemu/qemu_process.c | 12 ++++++++++++ tests/domaincapsdata/qemu_4.2.0.ppc64.xml | 2 +- .../qemucapabilitiesdata/caps_4.2.0.ppc64.xml | 3 +++ 4 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 20b019ba4a..d88f017457 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -5227,6 +5227,11 @@ virQEMUCapsInitQMPBasicArch(virQEMUCaps *qemuCaps) static void virQEMUCapsInitQMPVersionCaps(virQEMUCaps *qemuCaps) { + /* While the removal of pre-blockdev code is in progress we always hard-code + * the support for QEMU_CAPS_BLOCKDEV */ + virQEMUCapsSet(qemuCaps, QEMU_CAPS_BLOCKDEV); + virQEMUCapsSet(qemuCaps, QEMU_CAPS_BLOCKDEV_HOSTDEV_SCSI); + /* -enable-fips is deprecated in QEMU 5.2.0, and QEMU * should be built with gcrypt to achieve FIPS compliance * automatically / implicitly @@ -5246,17 +5251,11 @@ virQEMUCapsInitQMPVersionCaps(virQEMUCaps *qemuCaps) void virQEMUCapsInitProcessCapsInterlock(virQEMUCaps *qemuCaps) { - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_BLOCKDEV)) - virQEMUCapsClear(qemuCaps, QEMU_CAPS_BLOCKDEV_BACKUP); - if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_BLOCKDEV_BACKUP) && virQEMUCapsGet(qemuCaps, QEMU_CAPS_BLOCKDEV_REOPEN) && virQEMUCapsGet(qemuCaps, QEMU_CAPS_MIGRATION_PARAM_BLOCK_BITMAP_MAPPING)) virQEMUCapsSet(qemuCaps, QEMU_CAPS_INCREMENTAL_BACKUP); - if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_BLOCKDEV)) - virQEMUCapsSet(qemuCaps, QEMU_CAPS_BLOCKDEV_HOSTDEV_SCSI); - /* The -compat qemu command line argument is implemented using a newer * method which doesn't show up in query-command-line-options. As we'll use * it only for development and testing purposes we can base the capability @@ -5301,13 +5300,6 @@ virQEMUCapsInitProcessCaps(virQEMUCaps *qemuCaps) if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_CPU_UNAVAILABLE_FEATURES)) virQEMUCapsSet(qemuCaps, QEMU_CAPS_CANONICAL_CPU_FEATURES); - /* To avoid guest ABI regression, blockdev shall be enabled only when - * we are able to pass the custom 'device_id' for SCSI disks and cdroms. */ - if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_BLOCK_FILE_AUTO_READONLY_DYNAMIC) && - virQEMUCapsGet(qemuCaps, QEMU_CAPS_SCSI_DISK_DEVICE_ID) && - virQEMUCapsGet(qemuCaps, QEMU_CAPS_SAVEVM_MONITOR_NODES)) - virQEMUCapsSet(qemuCaps, QEMU_CAPS_BLOCKDEV); - /* We can't probe "esp" as a type via virQEMUCapsObjectTypes * array as it is only usable when builtin to the machine type */ diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 9c773b06b0..5f69c57fd4 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -5623,6 +5623,12 @@ qemuProcessStartUpdateCustomCaps(virDomainObj *vm) return -1; } + /* The code is being cleaned up to always assume the support for + * -blockdev thus we must no longer allow users to clear it */ + if (tmp == QEMU_CAPS_BLOCKDEV || + tmp == QEMU_CAPS_BLOCKDEV_HOSTDEV_SCSI) + continue; + virQEMUCapsClear(priv->qemuCaps, tmp); } } @@ -5647,6 +5653,12 @@ qemuProcessStartUpdateCustomCaps(virDomainObj *vm) return -1; } + /* The code is being cleaned up to always assume the support for + * -blockdev thus we must no longer allow users to clear it */ + if (tmp == QEMU_CAPS_BLOCKDEV || + tmp == QEMU_CAPS_BLOCKDEV_HOSTDEV_SCSI) + continue; + virQEMUCapsClear(priv->qemuCaps, tmp); } } diff --git a/tests/domaincapsdata/qemu_4.2.0.ppc64.xml b/tests/domaincapsdata/qemu_4.2.0.ppc64.xml index e21ba9372b..8ea7ad5714 100644 --- a/tests/domaincapsdata/qemu_4.2.0.ppc64.xml +++ b/tests/domaincapsdata/qemu_4.2.0.ppc64.xml @@ -141,7 +141,7 @@ - + diff --git a/tests/qemucapabilitiesdata/caps_4.2.0.ppc64.xml b/tests/qemucapabilitiesdata/caps_4.2.0.ppc64.xml index 8cba4628ee..4a165e5c6b 100644 --- a/tests/qemucapabilitiesdata/caps_4.2.0.ppc64.xml +++ b/tests/qemucapabilitiesdata/caps_4.2.0.ppc64.xml @@ -111,6 +111,7 @@ + @@ -139,11 +140,13 @@ + +