The command will be used to re-activate block nodes after migration when we're leaving the VM paused so that blockjobs can be used. As the 'node-name' field is optional the 'qemumonitorjsontest' case tests both variants. Signed-off-by: Peter Krempa <pkrempa@xxxxxxxxxx> --- src/qemu/qemu_monitor.c | 21 +++++++++++++++++++++ src/qemu/qemu_monitor.h | 5 +++++ src/qemu/qemu_monitor_json.c | 21 +++++++++++++++++++++ src/qemu/qemu_monitor_json.h | 5 +++++ tests/qemumonitorjsontest.c | 31 +++++++++++++++++++++++++++++++ 5 files changed, 83 insertions(+) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 830ecbad1c..c069d17265 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -4552,3 +4552,24 @@ qemuMonitorDisplayReload(qemuMonitor *mon, return qemuMonitorJSONDisplayReload(mon, type, tlsCerts); } + + +/** + * qemuMonitorBlockdevSetActive: + * @mon: monitor object + * @nodename: optional nodename to (de)activate + * @active: requested state + * + * Activate or deactivate @nodename based on @active. If @nodename is NULL, + * qemu will act on all block nodes. + */ +int +qemuMonitorBlockdevSetActive(qemuMonitor *mon, + const char *nodename, + bool active) +{ + QEMU_CHECK_MONITOR(mon); + VIR_DEBUG("nodename='%s', active='%d'", NULLSTR(nodename), active); + + return qemuMonitorJSONBlockdevSetActive(mon, nodename, active); +} diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 072f452e79..f7b9263b64 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -1651,3 +1651,8 @@ qemuMonitorSnapshotDelete(qemuMonitor *mon, const char *jobname, const char *snapshotname, const char **disks); + +int +qemuMonitorBlockdevSetActive(qemuMonitor *mon, + const char *nodename, + bool active); diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 890d9b7dfd..554572b13d 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -8883,3 +8883,24 @@ qemuMonitorJSONSnapshotDelete(qemuMonitor *mon, return qemuMonitorJSONCheckError(cmd, reply); } + + +int +qemuMonitorJSONBlockdevSetActive(qemuMonitor *mon, + const char *nodename, + bool active) +{ + g_autoptr(virJSONValue) cmd = NULL; + g_autoptr(virJSONValue) reply = NULL; + + if (!(cmd = qemuMonitorJSONMakeCommand("blockdev-set-active", + "S:node-name", nodename, + "b:active", active, + NULL))) + return -1; + + if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0) + return -1; + + return qemuMonitorJSONCheckError(cmd, reply); +} diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index 2f5a021f56..25e3ae2cbb 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -817,3 +817,8 @@ qemuMonitorJSONSnapshotDelete(qemuMonitor *mon, const char *jobname, const char *snapshotname, const char **disks); + +int +qemuMonitorJSONBlockdevSetActive(qemuMonitor *mon, + const char *nodename, + bool active); diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c index f7fe0fb6f4..f0f6a329c8 100644 --- a/tests/qemumonitorjsontest.c +++ b/tests/qemumonitorjsontest.c @@ -1249,6 +1249,36 @@ testQemuMonitorJSONqemuMonitorJSONSnapshot(const void *opaque) } +static int +testQemuMonitorJSONqemuMonitorJSONBlockdevSetActive(const void *opaque) +{ + const testGenericData *data = opaque; + virDomainXMLOption *xmlopt = data->xmlopt; + g_autoptr(qemuMonitorTest) test = NULL; + + if (!(test = qemuMonitorTestNewSchema(xmlopt, data->schema))) + return -1; + + if (qemuMonitorTestAddItem(test, "blockdev-set-active", + "{\"return\":{}}") < 0) + return -1; + + if (qemuMonitorTestAddItem(test, "blockdev-set-active", + "{\"return\":{}}") < 0) + return -1; + + if (qemuMonitorJSONBlockdevSetActive(qemuMonitorTestGetMonitor(test), + NULL, true) < 0) + return -1; + + if (qemuMonitorJSONBlockdevSetActive(qemuMonitorTestGetMonitor(test), + "testnode", false) < 0) + return -1; + + return 0; +} + + static bool testQemuMonitorJSONqemuMonitorJSONQueryCPUsEqual(struct qemuMonitorQueryCpusEntry *a, struct qemuMonitorQueryCpusEntry *b) @@ -2989,6 +3019,7 @@ mymain(void) DO_TEST(qemuMonitorJSONSendKeyHoldtime); DO_TEST(qemuMonitorJSONNBDServerStart); DO_TEST(qemuMonitorJSONSnapshot); + DO_TEST(qemuMonitorJSONBlockdevSetActive); DO_TEST_CPU_DATA("host"); DO_TEST_CPU_DATA("full"); -- 2.48.1