]> err.no Git - linux-2.6/blobdiff - drivers/scsi/libsas/sas_scsi_host.c
[SCSI] libsas: Reset timer on taskless scsi_cmnds in sas_scsi_timed_out
[linux-2.6] / drivers / scsi / libsas / sas_scsi_host.c
index e064aac06b90950b3e0e5e671a6840e49e0858b2..3f647c695da5c940b784915ec38bd4e5e5d19130 100644 (file)
@@ -524,9 +524,13 @@ enum scsi_eh_timer_return sas_scsi_timed_out(struct scsi_cmnd *cmd)
        unsigned long flags;
 
        if (!task) {
-               SAS_DPRINTK("command 0x%p, task 0x%p, gone: EH_HANDLED\n",
-                           cmd, task);
-               return EH_HANDLED;
+               cmd->timeout_per_command /= 2;
+               SAS_DPRINTK("command 0x%p, task 0x%p, gone: %s\n",
+                           cmd, task, (cmd->timeout_per_command ?
+                           "EH_RESET_TIMER" : "EH_NOT_HANDLED"));
+               if (!cmd->timeout_per_command)
+                       return EH_NOT_HANDLED;
+               return EH_RESET_TIMER;
        }
 
        spin_lock_irqsave(&task->task_state_lock, flags);
@@ -542,6 +546,13 @@ enum scsi_eh_timer_return sas_scsi_timed_out(struct scsi_cmnd *cmd)
                            cmd, task);
                return EH_HANDLED;
        }
+       if (!(task->task_state_flags & SAS_TASK_AT_INITIATOR)) {
+               spin_unlock_irqrestore(&task->task_state_lock, flags);
+               SAS_DPRINTK("command 0x%p, task 0x%p, not at initiator: "
+                           "EH_RESET_TIMER\n",
+                           cmd, task);
+               return EH_RESET_TIMER;
+       }
        task->task_state_flags |= SAS_TASK_STATE_ABORTED;
        spin_unlock_irqrestore(&task->task_state_lock, flags);
 
@@ -846,8 +857,10 @@ static int do_sas_task_abort(struct sas_task *task)
        return -EAGAIN;
 }
 
-void sas_task_abort(struct sas_task *task)
+void sas_task_abort(struct work_struct *work)
 {
+       struct sas_task *task =
+               container_of(work, struct sas_task, abort_work);
        int i;
 
        for (i = 0; i < 5; i++)
@@ -866,3 +879,4 @@ EXPORT_SYMBOL_GPL(sas_change_queue_type);
 EXPORT_SYMBOL_GPL(sas_bios_param);
 EXPORT_SYMBOL_GPL(sas_task_abort);
 EXPORT_SYMBOL_GPL(sas_phy_reset);
+EXPORT_SYMBOL_GPL(sas_phy_enable);