diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index f0cfc57674..512d3d7f3f 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" @@ -2180,6 +2181,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) @@ -2198,6 +2207,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 2e77534b27..2aa0460b8b 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;