]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Don't report error on successful media eject
authorCole Robinson <crobinso@redhat.com>
Tue, 28 May 2013 14:23:00 +0000 (10:23 -0400)
committerCole Robinson <crobinso@redhat.com>
Wed, 12 Jun 2013 20:30:31 +0000 (16:30 -0400)
If we are just ejecting media, ret == -1 even after the retry loop
determines that the tray is open, as requested. This means media
disconnect always report's error.

Fix it, and fix some other mini issues:

- Don't overwrite the 'eject' error message if the retry loop fails
- Move the retries decrement inside the loop, otherwise the final loop
  might succeed, yet retries == 0 and we will raise error
- Setting ret = -1 in the disk->src check is unneeded
- Fix comment typos

cc: mprivozn@redhat.com
(cherry picked from commit 406d8a980973cfd4caebbc886f5b283233409a64)

src/qemu/qemu_hotplug.c

index 3cc1d8dd99d5ff70245d8c61ab9ec3ceb3e84a3e..bf84cd22cc6c167a08cfc7253bc150dacf14a096 100644 (file)
@@ -109,10 +109,11 @@ int qemuDomainChangeEjectableMedia(struct qemud_driver *driver,
 
     virObjectRef(vm);
     /* we don't want to report errors from media tray_open polling */
-    while (retries--) {
+    while (retries) {
         if (origdisk->tray_status == VIR_DOMAIN_DISK_TRAY_OPEN)
             break;
 
+        retries--;
         virDomainObjUnlock(vm);
         VIR_DEBUG("Waiting 500ms for tray to open. Retries left %d", retries);
         usleep(500 * 1000); /* sleep 500ms */
@@ -120,19 +121,20 @@ int qemuDomainChangeEjectableMedia(struct qemud_driver *driver,
     }
     virObjectUnref(vm);
 
-    if (disk->src) {
-        /* deliberately don't depend on 'ret' as 'eject' may have failed for the
-         * fist time and we are gonna check the drive state anyway */
-        const char *format = NULL;
-
-        /* We haven't succeeded yet */
-        ret = -1;
-
-        if (retries <= 0) {
+    if (retries <= 0) {
+        if (ret == 0) {
+            /* If ret == -1, EjectMedia already set an error message */
             virReportError(VIR_ERR_OPERATION_FAILED, "%s",
-                           _("Unable to eject media before changing it"));
-            goto audit;
+                           _("Unable to eject media"));
         }
+        goto audit;
+    }
+    ret = 0;
+
+    if (disk->src) {
+        /* deliberately don't depend on 'ret' as 'eject' may have failed the
+         * first time and we are going to check the drive state anyway */
+        const char *format = NULL;
 
         if (disk->type != VIR_DOMAIN_DISK_TYPE_DIR) {
             if (disk->driverType)