From 0ca4a633af46f2e06d3ef831919ca75387f42103 Mon Sep 17 00:00:00 2001 Message-Id: <0ca4a633af46f2e06d3ef831919ca75387f42103@dist-git> From: Peter Krempa Date: Mon, 16 Mar 2020 22:12:34 +0100 Subject: [PATCH] rhel: Enable usage of x-blockdev-reopen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit RHEL-only Introduce a new capability QEMU_CAPS_BLOCKDEV_REOPEN_COM_REDHAT_AV_8_2_0_API based on the presence of '__com.redhat_rhel-av-8_2_0-api' feature for 'x-blockdev-reopen' which states that reopen works for what libvirt is going to use it and wire up code to call the x- prefixed command. This implementation will become dormant once qemu starts supporting upstream-stable blockdev-reopen. https://bugzilla.redhat.com/show_bug.cgi?id=1799013 Message-Id: <098dc0e73e1b561af991f2a9ecf13436dde3b33d.1584391727.git.pkrempa@redhat.com> Reviewed-by: Ján Tomko --- src/qemu/qemu_block.c | 3 ++- src/qemu/qemu_capabilities.c | 13 +++++++++++++ src/qemu/qemu_capabilities.h | 3 +++ src/qemu/qemu_monitor.c | 5 +++-- src/qemu/qemu_monitor.h | 3 ++- src/qemu/qemu_monitor_json.c | 12 +++++++++--- src/qemu/qemu_monitor_json.h | 3 ++- 7 files changed, 34 insertions(+), 8 deletions(-) diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c index 21c1ad9618..099ceeb802 100644 --- a/src/qemu/qemu_block.c +++ b/src/qemu/qemu_block.c @@ -3225,6 +3225,7 @@ qemuBlockReopenFormat(virDomainObjPtr vm, qemuDomainObjPrivatePtr priv = vm->privateData; virQEMUDriverPtr driver = priv->driver; g_autoptr(virJSONValue) reopenprops = NULL; + bool downstream = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV_REOPEN_COM_REDHAT_AV_8_2_0_API); int rc; /* If we are lacking the object here, qemu might have opened an image with @@ -3241,7 +3242,7 @@ qemuBlockReopenFormat(virDomainObjPtr vm, if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0) return -1; - rc = qemuMonitorBlockdevReopen(priv->mon, &reopenprops); + rc = qemuMonitorBlockdevReopen(priv->mon, &reopenprops, downstream); if (qemuDomainObjExitMonitor(driver, vm) < 0 || rc < 0) return -1; diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index a4046b09d6..0b4ed4253c 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -561,6 +561,9 @@ VIR_ENUM_IMPL(virQEMUCaps, "vhost-user-fs", "blockdev-snapshot.allow-write-only-overlay", "blockdev-reopen", + + /* 355 */ + "blockdev-reopen.__com.redhat_rhel-av-8_2_0-api" ); @@ -1419,6 +1422,7 @@ static struct virQEMUCapsStringFlags virQEMUCapsDevicePropsNVDIMM[] = { /* see documentation for virQEMUQAPISchemaPathGet for the query format */ static struct virQEMUCapsStringFlags virQEMUCapsQMPSchemaQueries[] = { + { "x-blockdev-reopen/$__com.redhat_rhel-av-8_2_0-api", QEMU_CAPS_BLOCKDEV_REOPEN_COM_REDHAT_AV_8_2_0_API }, { "blockdev-add/arg-type/options/+gluster/debug-level", QEMU_CAPS_GLUSTER_DEBUG_LEVEL}, { "blockdev-add/arg-type/+gluster/debug", QEMU_CAPS_GLUSTER_DEBUG_LEVEL}, { "blockdev-add/arg-type/+vxhs", QEMU_CAPS_VXHS}, @@ -4861,6 +4865,15 @@ virQEMUCapsInitProcessCaps(virQEMUCapsPtr qemuCaps) virQEMUCapsGet(qemuCaps, QEMU_CAPS_SAVEVM_MONITOR_NODES)) virQEMUCapsSet(qemuCaps, QEMU_CAPS_BLOCKDEV); + /* RHEL-only: + * - if upstream blockdev-reopen is enabled, clear the downstream flag + * - if the downstream flag is present but not the upstream, assert the upstream flag too + */ + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_BLOCKDEV_REOPEN)) + virQEMUCapsClear(qemuCaps, QEMU_CAPS_BLOCKDEV_REOPEN_COM_REDHAT_AV_8_2_0_API); + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_BLOCKDEV_REOPEN_COM_REDHAT_AV_8_2_0_API)) + virQEMUCapsSet(qemuCaps, QEMU_CAPS_BLOCKDEV_REOPEN); + virQEMUCapsInitProcessCapsInterlock(qemuCaps); } diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 8fdbe05638..0f7c586703 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -543,6 +543,9 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */ QEMU_CAPS_BLOCKDEV_SNAPSHOT_ALLOW_WRITE_ONLY, /* blockdev-snapshot has the 'allow-write-only-overlay' feature */ QEMU_CAPS_BLOCKDEV_REOPEN, /* 'blockdev-reopen' qmp command is supported */ + /* 355 */ + QEMU_CAPS_BLOCKDEV_REOPEN_COM_REDHAT_AV_8_2_0_API, /* downstream support for blockdev reopen in rhel-av-8.2.0 */ + QEMU_CAPS_LAST /* this must always be the last item */ } virQEMUCapsFlags; diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index c4202d59af..5915035589 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -4409,14 +4409,15 @@ qemuMonitorBlockdevAdd(qemuMonitorPtr mon, int qemuMonitorBlockdevReopen(qemuMonitorPtr mon, - virJSONValuePtr *props) + virJSONValuePtr *props, + bool downstream) { VIR_DEBUG("props=%p (node-name=%s)", *props, NULLSTR(virJSONValueObjectGetString(*props, "node-name"))); QEMU_CHECK_MONITOR(mon); - return qemuMonitorJSONBlockdevReopen(mon, props); + return qemuMonitorJSONBlockdevReopen(mon, props, downstream); } diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 481fc8e12e..ca975d084c 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -1326,7 +1326,8 @@ int qemuMonitorBlockdevAdd(qemuMonitorPtr mon, virJSONValuePtr *props); int qemuMonitorBlockdevReopen(qemuMonitorPtr mon, - virJSONValuePtr *props); + virJSONValuePtr *props, + bool downstream); int qemuMonitorBlockdevDel(qemuMonitorPtr mon, const char *nodename); diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 0122b77259..92d7317a82 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -8832,14 +8832,20 @@ qemuMonitorJSONBlockdevAdd(qemuMonitorPtr mon, int qemuMonitorJSONBlockdevReopen(qemuMonitorPtr mon, - virJSONValuePtr *props) + virJSONValuePtr *props, + bool downstream) { g_autoptr(virJSONValue) cmd = NULL; g_autoptr(virJSONValue) reply = NULL; virJSONValuePtr pr = g_steal_pointer(props); - if (!(cmd = qemuMonitorJSONMakeCommandInternal("blockdev-reopen", pr))) - return -1; + if (downstream) { + if (!(cmd = qemuMonitorJSONMakeCommandInternal("x-blockdev-reopen", pr))) + return -1; + } else { + if (!(cmd = qemuMonitorJSONMakeCommandInternal("blockdev-reopen", pr))) + return -1; + } if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0) return -1; diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index 801babef97..38c61a5661 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -601,7 +601,8 @@ int qemuMonitorJSONBlockdevAdd(qemuMonitorPtr mon, ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); int qemuMonitorJSONBlockdevReopen(qemuMonitorPtr mon, - virJSONValuePtr *props) + virJSONValuePtr *props, + bool downstream) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); int qemuMonitorJSONBlockdevDel(qemuMonitorPtr mon, -- 2.25.1