Modify the eject monitor functions to parse the return code and detect,
whether the error contains "is locked" to report this type of failure to
upper layers.
Signed-off-by: Pavel Hrdina <phrdina(a)redhat.com>
---
src/qemu/qemu_monitor_json.c | 14 ++++++++++++++
src/qemu/qemu_monitor_text.c | 10 ++++++++++
2 files changed, 24 insertions(+)
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index d3e98d4..9aac342 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -44,6 +44,7 @@
#include "virprobe.h"
#include "virstring.h"
#include "cpu/cpu_x86.h"
+#include "c-strcasestr.h"
#ifdef WITH_DTRACE_PROBES
# include "libvirt_qemu_probes.h"
@@ -2116,6 +2117,14 @@ int qemuMonitorJSONSetCPU(qemuMonitorPtr mon,
}
+/**
+ * Run QMP command to eject a media from ejectable device.
+ *
+ * Returns:
+ * -2 on error, when the tray is locked
+ * -1 on all other errors
+ * 0 on success
+ */
int qemuMonitorJSONEjectMedia(qemuMonitorPtr mon,
const char *dev_name,
bool force)
@@ -2134,6 +2143,11 @@ int qemuMonitorJSONEjectMedia(qemuMonitorPtr mon,
if (ret == 0)
ret = qemuMonitorJSONCheckError(cmd, reply);
+ VIR_DEBUG("%s", virJSONValueToString(reply, false));
+
+ if (ret < 0 && c_strcasestr(virJSONValueToString(reply, false), "is
locked"))
+ ret = -2;
+
virJSONValueFree(cmd);
virJSONValueFree(reply);
return ret;
diff --git a/src/qemu/qemu_monitor_text.c b/src/qemu/qemu_monitor_text.c
index 2e77534..2aa0460 100644
--- a/src/qemu/qemu_monitor_text.c
+++ b/src/qemu/qemu_monitor_text.c
@@ -1169,6 +1169,14 @@ int qemuMonitorTextSetCPU(qemuMonitorPtr mon, int cpu, bool
online)
}
+/**
+ * Run HMP command to eject a media from ejectable device.
+ *
+ * Returns:
+ * -2 on error, when the tray is locked
+ * -1 on all other errors
+ * 0 on success
+ */
int qemuMonitorTextEjectMedia(qemuMonitorPtr mon,
const char *dev_name,
bool force)
@@ -1187,6 +1195,8 @@ int qemuMonitorTextEjectMedia(qemuMonitorPtr mon,
* device not found, device is locked ...
* No message is printed on success it seems */
if (c_strcasestr(reply, "device ")) {
+ if (c_strcasestr(reply, "is locked"))
+ ret = -2;
virReportError(VIR_ERR_OPERATION_FAILED,
_("could not eject media on %s: %s"), dev_name, reply);
goto cleanup;
--
2.4.4