@@ -4758,6 +4758,16 @@ static int _scsih_set_satl_pending(struct scsi_cmnd *scmd, bool pending)
return 0;
}
+ sas_target_priv_data = sas_device_priv_data->sas_target;
+
+ /* invalid device handle */
+ handle = sas_target_priv_data->handle;
+ if (handle == MPT3SAS_INVALID_DEVICE_HANDLE) {
+ scmd->result = DID_NO_CONNECT << 16;
+ scmd->scsi_done(scmd);
+ return 0;
+ }
+
/*
* Bug work around for firmware SATL handling. The loop
* is based on atomic operations and ensures consistency
@@ -4771,17 +4781,6 @@ static int _scsih_set_satl_pending(struct scsi_cmnd *scmd, bool pending)
}
} while (_scsih_set_satl_pending(scmd, true));
- sas_target_priv_data = sas_device_priv_data->sas_target;
-
- /* invalid device handle */
- handle = sas_target_priv_data->handle;
- if (handle == MPT3SAS_INVALID_DEVICE_HANDLE) {
- scmd->result = DID_NO_CONNECT << 16;
- scmd->scsi_done(scmd);
- return 0;
- }
-
-
/* host recovery or link resets sent via IOCTLs */
if (ioc->shost_recovery || ioc->ioc_link_reset_in_progress)
return SCSI_MLQUEUE_HOST_BUSY;
Commit ffb584565894 ("scsi: mpt3sas: fix hang on ata passthrough commands") introduced ata_command_pending bit-flag to ensure sending only one outstanding pass through ATA command to target device. However if target device become irresponsive with ata_command_pending, we won't be able to remove it timely, since we try to dispatch a SYNCHRONIZE_CACHE command and bail out with SAM_STAT_BUSY repeatedly. Move the invalid device handle checking a bit earlier than the ata_command_pending. Signed-off-by: Yuanyuan Zhong <yzhong@purestorage.com> --- drivers/scsi/mpt3sas/mpt3sas_scsih.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-)