[SCSI] mpt2sas: Do not retry a timed out direct IO for warpdrive
authornagalakshmi.nandigama@lsi.com <nagalakshmi.nandigama@lsi.com>
Thu, 1 Dec 2011 02:23:02 +0000 (07:53 +0530)
committerJames Bottomley <JBottomley@Parallels.com>
Thu, 15 Dec 2011 06:57:39 +0000 (10:57 +0400)
When an I/O request to a WarpDrive is timed out by SML and if the
I/O request to the WarpDrive is sent as direct I/O then the aborted
direct I/O will be retried as normal Volume I/O and which results
in failure of Target Reset and results in host reset.

The fix is to not retry a failed IO to volume when the original
IO was sent as direct IO with an ioc status
MPI2_IOCSTATUS_SCSI_TASK_TERMINATED.

Signed-off-by: Nagalakshmi Nandigama <nagalakshmi.nandigama@lsi.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/mpt2sas/mpt2sas_scsih.c

index 8e2e9973df294664514010439841150728b8e094..fd1ba744b42330a4dcc373073c19a76b1ecd614f 100644 (file)
@@ -4436,11 +4436,14 @@ _scsih_io_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply)
                scmd->result = DID_NO_CONNECT << 16;
                goto out;
        }
+       ioc_status = le16_to_cpu(mpi_reply->IOCStatus);
        /*
         * WARPDRIVE: If direct_io is set then it is directIO,
         * the failed direct I/O should be redirected to volume
         */
-       if (_scsih_scsi_direct_io_get(ioc, smid)) {
+       if (_scsih_scsi_direct_io_get(ioc, smid) &&
+           ((ioc_status & MPI2_IOCSTATUS_MASK)
+           != MPI2_IOCSTATUS_SCSI_TASK_TERMINATED)) {
                spin_lock_irqsave(&ioc->scsi_lookup_lock, flags);
                ioc->scsi_lookup[smid - 1].scmd = scmd;
                spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags);
@@ -4474,7 +4477,6 @@ _scsih_io_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply)
 
        xfer_cnt = le32_to_cpu(mpi_reply->TransferCount);
        scsi_set_resid(scmd, scsi_bufflen(scmd) - xfer_cnt);
-       ioc_status = le16_to_cpu(mpi_reply->IOCStatus);
        if (ioc_status & MPI2_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE)
                log_info =  le32_to_cpu(mpi_reply->IOCLogInfo);
        else