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
This commit is contained in:
Cole Robinson 2013-05-28 10:23:00 -04:00
parent 134e685b1d
commit 406d8a9809

View File

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