diff options
Diffstat (limited to 'drivers/scsi/mpt2sas/mpt2sas_scsih.c')
| -rw-r--r-- | drivers/scsi/mpt2sas/mpt2sas_scsih.c | 6 | 
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/scsi/mpt2sas/mpt2sas_scsih.c b/drivers/scsi/mpt2sas/mpt2sas_scsih.c index 8e2e9973df2..fd1ba744b42 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_scsih.c +++ b/drivers/scsi/mpt2sas/mpt2sas_scsih.c @@ -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  |