[SCSI] mpt2sas: Do not retry a timed out direct IO for warpdrive
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>
This commit is contained in:
parent
30c43282f3
commit
4da7af9494
1 changed files with 4 additions and 2 deletions
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue