|
@@ -500,57 +500,6 @@ void ata_eh_release(struct ata_port *ap)
|
|
|
mutex_unlock(&ap->host->eh_mutex);
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * ata_scsi_timed_out - SCSI layer time out callback
|
|
|
- * @cmd: timed out SCSI command
|
|
|
- *
|
|
|
- * Handles SCSI layer timeout. We race with normal completion of
|
|
|
- * the qc for @cmd. If the qc is already gone, we lose and let
|
|
|
- * the scsi command finish (EH_HANDLED). Otherwise, the qc has
|
|
|
- * timed out and EH should be invoked. Prevent ata_qc_complete()
|
|
|
- * from finishing it by setting EH_SCHEDULED and return
|
|
|
- * EH_NOT_HANDLED.
|
|
|
- *
|
|
|
- * TODO: kill this function once old EH is gone.
|
|
|
- *
|
|
|
- * LOCKING:
|
|
|
- * Called from timer context
|
|
|
- *
|
|
|
- * RETURNS:
|
|
|
- * EH_HANDLED or EH_NOT_HANDLED
|
|
|
- */
|
|
|
-enum blk_eh_timer_return ata_scsi_timed_out(struct scsi_cmnd *cmd)
|
|
|
-{
|
|
|
- struct Scsi_Host *host = cmd->device->host;
|
|
|
- struct ata_port *ap = ata_shost_to_port(host);
|
|
|
- unsigned long flags;
|
|
|
- struct ata_queued_cmd *qc;
|
|
|
- enum blk_eh_timer_return ret;
|
|
|
-
|
|
|
- DPRINTK("ENTER\n");
|
|
|
-
|
|
|
- if (ap->ops->error_handler) {
|
|
|
- ret = BLK_EH_NOT_HANDLED;
|
|
|
- goto out;
|
|
|
- }
|
|
|
-
|
|
|
- ret = BLK_EH_HANDLED;
|
|
|
- spin_lock_irqsave(ap->lock, flags);
|
|
|
- qc = ata_qc_from_tag(ap, ap->link.active_tag);
|
|
|
- if (qc) {
|
|
|
- WARN_ON(qc->scsicmd != cmd);
|
|
|
- qc->flags |= ATA_QCFLAG_EH_SCHEDULED;
|
|
|
- qc->err_mask |= AC_ERR_TIMEOUT;
|
|
|
- ret = BLK_EH_NOT_HANDLED;
|
|
|
- }
|
|
|
- spin_unlock_irqrestore(ap->lock, flags);
|
|
|
-
|
|
|
- out:
|
|
|
- DPRINTK("EXIT, ret=%d\n", ret);
|
|
|
- return ret;
|
|
|
-}
|
|
|
-EXPORT_SYMBOL(ata_scsi_timed_out);
|
|
|
-
|
|
|
static void ata_eh_unload(struct ata_port *ap)
|
|
|
{
|
|
|
struct ata_link *link;
|