Prevent endless loop in SCSI error handling. Author: Borzenkov Andrey --- linux-2.4.18-18mdk/drivers/scsi/scsi_error.c.scsi-eh-timeout Thu May 30 16:22:37 2002 +++ linux-2.4.18-18mdk/drivers/scsi/scsi_error.c Sun Jun 9 19:18:11 2002 @@ -1103,6 +1103,8 @@ */ STATIC int scsi_eh_completed_normally(Scsi_Cmnd * SCpnt) { + int rtn; + /* * First check the host byte, to see if there is anything in there * that would indicate what we need to do. @@ -1116,14 +1118,18 @@ * otherwise we just flag it as success. */ SCpnt->flags &= ~IS_RESETTING; - return NEEDS_RETRY; + goto maybe_retry; } /* * Rats. We are already in the error handler, so we now get to try * and figure out what to do next. If the sense is valid, we have * a pretty good idea of what to do. If not, we mark it as failed. */ - return scsi_check_sense(SCpnt); + rtn = scsi_check_sense(SCpnt); + if (rtn == NEEDS_RETRY) { + goto maybe_retry; + } + return rtn; } if (host_byte(SCpnt->result) != DID_OK) { return FAILED; @@ -1142,7 +1148,11 @@ case COMMAND_TERMINATED: return SUCCESS; case CHECK_CONDITION: - return scsi_check_sense(SCpnt); + rtn = scsi_check_sense(SCpnt); + if (rtn == NEEDS_RETRY) { + goto maybe_retry; + } + return rtn; case CONDITION_GOOD: case INTERMEDIATE_GOOD: case INTERMEDIATE_C_GOOD: @@ -1157,6 +1167,17 @@ return FAILED; } return FAILED; + + maybe_retry: + + if ((++SCpnt->retries) < SCpnt->allowed) { + return NEEDS_RETRY; + } else { + /* + * No more retries - report this one back to upper level. + */ + return SUCCESS; + } } /*