diff options
author | James Bottomley <James.Bottomley@suse.de> | 2011-01-23 10:44:12 -0500 |
---|---|---|
committer | Jeff Garzik <jgarzik@redhat.com> | 2011-03-02 02:36:45 -0500 |
commit | 00dd4998a60599d98b4d6635820a1fbeafa5b021 (patch) | |
tree | 6a7ecd27007856691964399eec8882b8d8ca8560 /drivers/scsi/libsas/sas_scsi_host.c | |
parent | 0e0b494ca8c54a7297d0cc549405091019b3b77e (diff) |
libsas: convert to libata new error handler
The conversion is quite complex given that the libata new error
handler has to be hooked into the current libsas timeout and error
handling. The way this is done is to process all the failed commands
via libsas first, but if they have no underlying sas task (and they're
on a sata device) assume they are destined for the libata error
handler and send them accordingly.
Finally, activate the port recovery of the libata error handler for
each port known to the host. This is somewhat suboptimal, since that
port may not need recovering, but given the current architecture of
the libata error handler, it's the only way; and the spurious
activation is harmless.
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
Diffstat (limited to 'drivers/scsi/libsas/sas_scsi_host.c')
-rw-r--r-- | drivers/scsi/libsas/sas_scsi_host.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/drivers/scsi/libsas/sas_scsi_host.c b/drivers/scsi/libsas/sas_scsi_host.c index 9a7aaf5f1311..67758ea8eb7f 100644 --- a/drivers/scsi/libsas/sas_scsi_host.c +++ b/drivers/scsi/libsas/sas_scsi_host.c | |||
@@ -663,11 +663,16 @@ void sas_scsi_recover_host(struct Scsi_Host *shost) | |||
663 | * scsi_unjam_host does, but we skip scsi_eh_abort_cmds because any | 663 | * scsi_unjam_host does, but we skip scsi_eh_abort_cmds because any |
664 | * command we see here has no sas_task and is thus unknown to the HA. | 664 | * command we see here has no sas_task and is thus unknown to the HA. |
665 | */ | 665 | */ |
666 | if (!scsi_eh_get_sense(&eh_work_q, &ha->eh_done_q)) | 666 | if (!sas_ata_eh(shost, &eh_work_q, &ha->eh_done_q)) |
667 | scsi_eh_ready_devs(shost, &eh_work_q, &ha->eh_done_q); | 667 | if (!scsi_eh_get_sense(&eh_work_q, &ha->eh_done_q)) |
668 | scsi_eh_ready_devs(shost, &eh_work_q, &ha->eh_done_q); | ||
668 | 669 | ||
669 | out: | 670 | out: |
671 | /* now link into libata eh --- if we have any ata devices */ | ||
672 | sas_ata_strategy_handler(shost); | ||
673 | |||
670 | scsi_eh_flush_done_q(&ha->eh_done_q); | 674 | scsi_eh_flush_done_q(&ha->eh_done_q); |
675 | |||
671 | SAS_DPRINTK("--- Exit %s\n", __func__); | 676 | SAS_DPRINTK("--- Exit %s\n", __func__); |
672 | return; | 677 | return; |
673 | } | 678 | } |
@@ -676,6 +681,11 @@ enum blk_eh_timer_return sas_scsi_timed_out(struct scsi_cmnd *cmd) | |||
676 | { | 681 | { |
677 | struct sas_task *task = TO_SAS_TASK(cmd); | 682 | struct sas_task *task = TO_SAS_TASK(cmd); |
678 | unsigned long flags; | 683 | unsigned long flags; |
684 | enum blk_eh_timer_return rtn; | ||
685 | |||
686 | if (sas_ata_timed_out(cmd, task, &rtn)) | ||
687 | return rtn; | ||
688 | |||
679 | 689 | ||
680 | if (!task) { | 690 | if (!task) { |
681 | cmd->request->timeout /= 2; | 691 | cmd->request->timeout /= 2; |