From f8085a5471ce9ffc6e3987357c64bb601cd360da Mon Sep 17 00:00:00 2001 From: Cole Robinson Date: Tue, 28 May 2013 10:23:00 -0400 Subject: [PATCH] qemu: Don't report error on successful media eject 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 | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 3cc1d8dd99..bf84cd22cc 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -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)