diff options
author | James Smart <James.Smart@Emulex.Com> | 2006-03-13 08:28:57 -0500 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.il.steeleye.com> | 2006-03-13 09:58:58 -0500 |
commit | c829c394165f981d49f05a9be228404d7a9398d4 (patch) | |
tree | 649ca326052a4a35d31f150f274347ca9d38c678 /drivers/scsi/scsi_error.c | |
parent | ce313db240862d809c736c5b1dfc759817fc7ca9 (diff) |
[SCSI] FC transport : Avoid device offline cases by stalling aborts until device unblocked
This moves the eh_timed_out functionality from the scsi_host_template
to the transport_template. Given that this is now a transport function,
the EH_RESET_TIMER case no longer caps the timer reschedulings. The
transport guarantees that this is not an infinite condition.
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi/scsi_error.c')
-rw-r--r-- | drivers/scsi/scsi_error.c | 9 |
1 files changed, 3 insertions, 6 deletions
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c index 5cc97b721661..9cf020622134 100644 --- a/drivers/scsi/scsi_error.c +++ b/drivers/scsi/scsi_error.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <scsi/scsi_dbg.h> | 29 | #include <scsi/scsi_dbg.h> |
30 | #include <scsi/scsi_device.h> | 30 | #include <scsi/scsi_device.h> |
31 | #include <scsi/scsi_eh.h> | 31 | #include <scsi/scsi_eh.h> |
32 | #include <scsi/scsi_transport.h> | ||
32 | #include <scsi/scsi_host.h> | 33 | #include <scsi/scsi_host.h> |
33 | #include <scsi/scsi_ioctl.h> | 34 | #include <scsi/scsi_ioctl.h> |
34 | #include <scsi/scsi_request.h> | 35 | #include <scsi/scsi_request.h> |
@@ -163,16 +164,12 @@ void scsi_times_out(struct scsi_cmnd *scmd) | |||
163 | { | 164 | { |
164 | scsi_log_completion(scmd, TIMEOUT_ERROR); | 165 | scsi_log_completion(scmd, TIMEOUT_ERROR); |
165 | 166 | ||
166 | if (scmd->device->host->hostt->eh_timed_out) | 167 | if (scmd->device->host->transportt->eh_timed_out) |
167 | switch (scmd->device->host->hostt->eh_timed_out(scmd)) { | 168 | switch (scmd->device->host->transportt->eh_timed_out(scmd)) { |
168 | case EH_HANDLED: | 169 | case EH_HANDLED: |
169 | __scsi_done(scmd); | 170 | __scsi_done(scmd); |
170 | return; | 171 | return; |
171 | case EH_RESET_TIMER: | 172 | case EH_RESET_TIMER: |
172 | /* This allows a single retry even of a command | ||
173 | * with allowed == 0 */ | ||
174 | if (scmd->retries++ > scmd->allowed) | ||
175 | break; | ||
176 | scsi_add_timer(scmd, scmd->timeout_per_command, | 173 | scsi_add_timer(scmd, scmd->timeout_per_command, |
177 | scsi_times_out); | 174 | scsi_times_out); |
178 | return; | 175 | return; |