]> xenbits.xensource.com Git - libvirt.git/commitdiff
monitor: detect that eject fails because the tray is locked
authorPavel Hrdina <phrdina@redhat.com>
Mon, 29 Jun 2015 14:18:53 +0000 (16:18 +0200)
committerPavel Hrdina <phrdina@redhat.com>
Thu, 9 Jul 2015 16:02:05 +0000 (18:02 +0200)
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@redhat.com>
src/qemu/qemu_monitor_json.c
src/qemu/qemu_monitor_text.c

index f0cfc57674239310815b2ab33c86c08a1c5e8126..512d3d7f3f83e4d1e8aebd2234e44dfa70595724 100644 (file)
@@ -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;
index 2e77534b27d5a96fa168a7de04ff7cb65b5c46bb..2aa0460b8bfd3897d2e51764fe4dcd543ea14094 100644 (file)
@@ -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;