|
@@ -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
|