diff options
| -rw-r--r-- | drivers/scsi/mpt3sas/mpt3sas_base.c | 6 | ||||
| -rw-r--r-- | drivers/scsi/mpt3sas/mpt3sas_scsih.c | 12 |
2 files changed, 18 insertions, 0 deletions
diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c b/drivers/scsi/mpt3sas/mpt3sas_base.c index e57774472e75..1d8c584ec1e9 100644 --- a/drivers/scsi/mpt3sas/mpt3sas_base.c +++ b/drivers/scsi/mpt3sas/mpt3sas_base.c | |||
| @@ -3281,12 +3281,18 @@ mpt3sas_base_free_smid(struct MPT3SAS_ADAPTER *ioc, u16 smid) | |||
| 3281 | 3281 | ||
| 3282 | if (smid < ioc->hi_priority_smid) { | 3282 | if (smid < ioc->hi_priority_smid) { |
| 3283 | struct scsiio_tracker *st; | 3283 | struct scsiio_tracker *st; |
| 3284 | void *request; | ||
| 3284 | 3285 | ||
| 3285 | st = _get_st_from_smid(ioc, smid); | 3286 | st = _get_st_from_smid(ioc, smid); |
| 3286 | if (!st) { | 3287 | if (!st) { |
| 3287 | _base_recovery_check(ioc); | 3288 | _base_recovery_check(ioc); |
| 3288 | return; | 3289 | return; |
| 3289 | } | 3290 | } |
| 3291 | |||
| 3292 | /* Clear MPI request frame */ | ||
| 3293 | request = mpt3sas_base_get_msg_frame(ioc, smid); | ||
| 3294 | memset(request, 0, ioc->request_sz); | ||
| 3295 | |||
| 3290 | mpt3sas_base_clear_st(ioc, st); | 3296 | mpt3sas_base_clear_st(ioc, st); |
| 3291 | _base_recovery_check(ioc); | 3297 | _base_recovery_check(ioc); |
| 3292 | return; | 3298 | return; |
diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c b/drivers/scsi/mpt3sas/mpt3sas_scsih.c index 8bb5b8f9f4d2..1ccfbc7eebe0 100644 --- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c +++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c | |||
| @@ -1462,11 +1462,23 @@ mpt3sas_scsih_scsi_lookup_get(struct MPT3SAS_ADAPTER *ioc, u16 smid) | |||
| 1462 | { | 1462 | { |
| 1463 | struct scsi_cmnd *scmd = NULL; | 1463 | struct scsi_cmnd *scmd = NULL; |
| 1464 | struct scsiio_tracker *st; | 1464 | struct scsiio_tracker *st; |
| 1465 | Mpi25SCSIIORequest_t *mpi_request; | ||
| 1465 | 1466 | ||
| 1466 | if (smid > 0 && | 1467 | if (smid > 0 && |
| 1467 | smid <= ioc->scsiio_depth - INTERNAL_SCSIIO_CMDS_COUNT) { | 1468 | smid <= ioc->scsiio_depth - INTERNAL_SCSIIO_CMDS_COUNT) { |
| 1468 | u32 unique_tag = smid - 1; | 1469 | u32 unique_tag = smid - 1; |
| 1469 | 1470 | ||
| 1471 | mpi_request = mpt3sas_base_get_msg_frame(ioc, smid); | ||
| 1472 | |||
| 1473 | /* | ||
| 1474 | * If SCSI IO request is outstanding at driver level then | ||
| 1475 | * DevHandle filed must be non-zero. If DevHandle is zero | ||
| 1476 | * then it means that this smid is free at driver level, | ||
| 1477 | * so return NULL. | ||
| 1478 | */ | ||
| 1479 | if (!mpi_request->DevHandle) | ||
| 1480 | return scmd; | ||
| 1481 | |||
| 1470 | scmd = scsi_host_find_tag(ioc->shost, unique_tag); | 1482 | scmd = scsi_host_find_tag(ioc->shost, unique_tag); |
| 1471 | if (scmd) { | 1483 | if (scmd) { |
| 1472 | st = scsi_cmd_priv(scmd); | 1484 | st = scsi_cmd_priv(scmd); |
