[PATCH 4/5] qemu: monitor: Add monitor backend for 'blockdev-set-active'

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux