Merge to Fedora kernel-2.6.7-1.492
[linux-2.6.git] / drivers / scsi / scsi_error.c
index b0b35af..288f2fd 100644 (file)
 #include <linux/interrupt.h>
 #include <linux/blkdev.h>
 #include <linux/smp_lock.h>
-#include <scsi/scsi_ioctl.h>
 
-#include "scsi.h"
+#include <scsi/scsi.h>
+#include <scsi/scsi_dbg.h>
+#include <scsi/scsi_device.h>
+#include <scsi/scsi_eh.h>
 #include <scsi/scsi_host.h>
+#include <scsi/scsi_ioctl.h>
+#include <scsi/scsi_request.h>
 
 #include "scsi_priv.h"
 #include "scsi_logging.h"
@@ -162,6 +166,24 @@ int scsi_delete_timer(struct scsi_cmnd *scmd)
 void scsi_times_out(struct scsi_cmnd *scmd)
 {
        scsi_log_completion(scmd, TIMEOUT_ERROR);
+
+       if (scmd->device->host->hostt->eh_timed_out)
+               switch (scmd->device->host->hostt->eh_timed_out(scmd)) {
+               case EH_HANDLED:
+                       __scsi_done(scmd);
+                       return;
+               case EH_RESET_TIMER:
+                       /* This allows a single retry even of a command
+                        * with allowed == 0 */
+                       if (scmd->retries++ > scmd->allowed)
+                               break;
+                       scsi_add_timer(scmd, scmd->timeout_per_command,
+                                      scsi_times_out);
+                       return;
+               case EH_NOT_HANDLED:
+                       break;
+               }
+
        if (unlikely(!scsi_eh_scmd_add(scmd, SCSI_EH_CANCEL_CMD))) {
                panic("Error handler thread not present at %p %p %s %d",
                      scmd, scmd->device->host, __FILE__, __LINE__);
@@ -655,7 +677,7 @@ static int scsi_eh_get_sense(struct list_head *work_q,
                SCSI_LOG_ERROR_RECOVERY(3, printk("sense requested for %p"
                                                  " result %x\n", scmd,
                                                  scmd->result));
-               SCSI_LOG_ERROR_RECOVERY(3, print_sense("bh", scmd));
+               SCSI_LOG_ERROR_RECOVERY(3, scsi_print_sense("bh", scmd));
 
                rtn = scsi_decide_disposition(scmd);