From e5f6fefe244fcd15927d5f7f5548cc0d053e168f Mon Sep 17 00:00:00 2001 From: Tejun Heo Date: Fri, 19 May 2006 21:07:05 +0900 Subject: [PATCH] --- yaml --- r: 29451 b: refs/heads/master c: f8bbfc247efb0e5fa69094614380768ce79afe17 h: refs/heads/master i: 29449: ec769e8e5e95c6bc0db5e6301085a18a69ad2fdd 29447: d7ade3357164bef97012d8f1e29c36b61fb690c6 v: v3 --- [refs] | 2 +- trunk/drivers/scsi/libata-eh.c | 3 ++- trunk/drivers/scsi/libata-scsi.c | 24 ------------------------ trunk/drivers/scsi/scsi_error.c | 23 ++++++++++++++++++++++- trunk/drivers/scsi/scsi_priv.h | 1 + trunk/drivers/scsi/scsi_transport_api.h | 6 ++++++ trunk/include/scsi/scsi_eh.h | 1 - 7 files changed, 32 insertions(+), 28 deletions(-) create mode 100644 trunk/drivers/scsi/scsi_transport_api.h diff --git a/[refs] b/[refs] index fc4c2b1a0f05..38b1eda27ecd 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: a20f33ffde8ba5fb27666aa1e228a45b7e3b8dcb +refs/heads/master: f8bbfc247efb0e5fa69094614380768ce79afe17 diff --git a/trunk/drivers/scsi/libata-eh.c b/trunk/drivers/scsi/libata-eh.c index 750e734d1c09..71b45ad2c124 100644 --- a/trunk/drivers/scsi/libata-eh.c +++ b/trunk/drivers/scsi/libata-eh.c @@ -39,6 +39,7 @@ #include #include #include +#include "scsi_transport_api.h" #include @@ -432,7 +433,7 @@ void ata_port_schedule_eh(struct ata_port *ap) WARN_ON(!ap->ops->error_handler); ap->flags |= ATA_FLAG_EH_PENDING; - ata_schedule_scsi_eh(ap->host); + scsi_schedule_eh(ap->host); DPRINTK("port EH scheduled\n"); } diff --git a/trunk/drivers/scsi/libata-scsi.c b/trunk/drivers/scsi/libata-scsi.c index f036ae4b8afb..2007b4b6e1b4 100644 --- a/trunk/drivers/scsi/libata-scsi.c +++ b/trunk/drivers/scsi/libata-scsi.c @@ -2745,27 +2745,3 @@ void ata_scsi_scan_host(struct ata_port *ap) scsi_scan_target(&ap->host->shost_gendev, 0, i, 0, 0); } } - -/** - * ata_schedule_scsi_eh - schedule EH for SCSI host - * @shost: SCSI host to invoke error handling on. - * - * Schedule SCSI EH without scmd. This is a hack. - * - * LOCKING: - * spin_lock_irqsave(host_set lock) - **/ -void ata_schedule_scsi_eh(struct Scsi_Host *shost) -{ - unsigned long flags; - - spin_lock_irqsave(shost->host_lock, flags); - - if (scsi_host_set_state(shost, SHOST_RECOVERY) == 0 || - scsi_host_set_state(shost, SHOST_CANCEL_RECOVERY) == 0) { - shost->host_eh_scheduled++; - scsi_eh_wakeup(shost); - } - - spin_unlock_irqrestore(shost->host_lock, flags); -} diff --git a/trunk/drivers/scsi/scsi_error.c b/trunk/drivers/scsi/scsi_error.c index 9ca71cbefce0..346ab72ebf86 100644 --- a/trunk/drivers/scsi/scsi_error.c +++ b/trunk/drivers/scsi/scsi_error.c @@ -56,7 +56,28 @@ void scsi_eh_wakeup(struct Scsi_Host *shost) printk("Waking error handler thread\n")); } } -EXPORT_SYMBOL_GPL(scsi_eh_wakeup); + +/** + * scsi_schedule_eh - schedule EH for SCSI host + * @shost: SCSI host to invoke error handling on. + * + * Schedule SCSI EH without scmd. + **/ +void scsi_schedule_eh(struct Scsi_Host *shost) +{ + unsigned long flags; + + spin_lock_irqsave(shost->host_lock, flags); + + if (scsi_host_set_state(shost, SHOST_RECOVERY) == 0 || + scsi_host_set_state(shost, SHOST_CANCEL_RECOVERY) == 0) { + shost->host_eh_scheduled++; + scsi_eh_wakeup(shost); + } + + spin_unlock_irqrestore(shost->host_lock, flags); +} +EXPORT_SYMBOL_GPL(scsi_schedule_eh); /** * scsi_eh_scmd_add - add scsi cmd to error handling. diff --git a/trunk/drivers/scsi/scsi_priv.h b/trunk/drivers/scsi/scsi_priv.h index 0b39081113be..27c48274e8cb 100644 --- a/trunk/drivers/scsi/scsi_priv.h +++ b/trunk/drivers/scsi/scsi_priv.h @@ -63,6 +63,7 @@ extern int scsi_delete_timer(struct scsi_cmnd *); extern void scsi_times_out(struct scsi_cmnd *cmd); extern int scsi_error_handler(void *host); extern int scsi_decide_disposition(struct scsi_cmnd *cmd); +extern void scsi_eh_wakeup(struct Scsi_Host *shost); extern int scsi_eh_scmd_add(struct scsi_cmnd *, int); /* scsi_lib.c */ diff --git a/trunk/drivers/scsi/scsi_transport_api.h b/trunk/drivers/scsi/scsi_transport_api.h new file mode 100644 index 000000000000..934f0e62bb5c --- /dev/null +++ b/trunk/drivers/scsi/scsi_transport_api.h @@ -0,0 +1,6 @@ +#ifndef _SCSI_TRANSPORT_API_H +#define _SCSI_TRANSPORT_API_H + +void scsi_schedule_eh(struct Scsi_Host *shost); + +#endif /* _SCSI_TRANSPORT_API_H */ diff --git a/trunk/include/scsi/scsi_eh.h b/trunk/include/scsi/scsi_eh.h index 212c983a6a18..d160880b2a87 100644 --- a/trunk/include/scsi/scsi_eh.h +++ b/trunk/include/scsi/scsi_eh.h @@ -35,7 +35,6 @@ static inline int scsi_sense_valid(struct scsi_sense_hdr *sshdr) } -extern void scsi_eh_wakeup(struct Scsi_Host *shost); extern void scsi_eh_finish_cmd(struct scsi_cmnd *scmd, struct list_head *done_q); extern void scsi_eh_flush_done_q(struct list_head *done_q);