diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2016-11-22 16:48:05 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-11-22 16:48:05 -0500 |
| commit | b66c08ba28aa1f81eb06a1127aa3936ff77e5e2c (patch) | |
| tree | 0d88e197bdc4690faf6a155fd4ebbbffdc7f225a | |
| parent | 57527ed10b3bc2abf50844f6995371fa9ac503df (diff) | |
| parent | d8188b10087cc78cd1e23c9b7525378da325626a (diff) | |
Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
Pull SCSI fixes from James Bottomley:
"Two small fixes.
One prevents timeouts on mpt3sas when trying to use the secure erase
protocol which causes the erase protocol to be aborted. The second is
a regression in a prior fix which causes all commands to abort during
PCI extended error recovery, which is incorrect because PCI EEH is
independent from what's happening on the FC transport"
* tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi:
scsi: qla2xxx: do not abort all commands in the adapter during EEH recovery
scsi: mpt3sas: Fix secure erase premature termination
| -rw-r--r-- | drivers/scsi/mpt3sas/mpt3sas_scsih.c | 15 | ||||
| -rw-r--r-- | drivers/scsi/qla2xxx/qla_os.c | 21 |
2 files changed, 27 insertions, 9 deletions
diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c b/drivers/scsi/mpt3sas/mpt3sas_scsih.c index 8aa769a2d919..91b70bc46e7f 100644 --- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c +++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c | |||
| @@ -4010,7 +4010,10 @@ _scsih_eedp_error_handling(struct scsi_cmnd *scmd, u16 ioc_status) | |||
| 4010 | SAM_STAT_CHECK_CONDITION; | 4010 | SAM_STAT_CHECK_CONDITION; |
| 4011 | } | 4011 | } |
| 4012 | 4012 | ||
| 4013 | 4013 | static inline bool ata_12_16_cmd(struct scsi_cmnd *scmd) | |
| 4014 | { | ||
| 4015 | return (scmd->cmnd[0] == ATA_12 || scmd->cmnd[0] == ATA_16); | ||
| 4016 | } | ||
| 4014 | 4017 | ||
| 4015 | /** | 4018 | /** |
| 4016 | * scsih_qcmd - main scsi request entry point | 4019 | * scsih_qcmd - main scsi request entry point |
| @@ -4038,6 +4041,13 @@ scsih_qcmd(struct Scsi_Host *shost, struct scsi_cmnd *scmd) | |||
| 4038 | if (ioc->logging_level & MPT_DEBUG_SCSI) | 4041 | if (ioc->logging_level & MPT_DEBUG_SCSI) |
| 4039 | scsi_print_command(scmd); | 4042 | scsi_print_command(scmd); |
| 4040 | 4043 | ||
| 4044 | /* | ||
| 4045 | * Lock the device for any subsequent command until command is | ||
| 4046 | * done. | ||
| 4047 | */ | ||
| 4048 | if (ata_12_16_cmd(scmd)) | ||
| 4049 | scsi_internal_device_block(scmd->device); | ||
| 4050 | |||
| 4041 | sas_device_priv_data = scmd->device->hostdata; | 4051 | sas_device_priv_data = scmd->device->hostdata; |
| 4042 | if (!sas_device_priv_data || !sas_device_priv_data->sas_target) { | 4052 | if (!sas_device_priv_data || !sas_device_priv_data->sas_target) { |
| 4043 | scmd->result = DID_NO_CONNECT << 16; | 4053 | scmd->result = DID_NO_CONNECT << 16; |
| @@ -4613,6 +4623,9 @@ _scsih_io_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply) | |||
| 4613 | if (scmd == NULL) | 4623 | if (scmd == NULL) |
| 4614 | return 1; | 4624 | return 1; |
| 4615 | 4625 | ||
| 4626 | if (ata_12_16_cmd(scmd)) | ||
| 4627 | scsi_internal_device_unblock(scmd->device, SDEV_RUNNING); | ||
| 4628 | |||
| 4616 | mpi_request = mpt3sas_base_get_msg_frame(ioc, smid); | 4629 | mpi_request = mpt3sas_base_get_msg_frame(ioc, smid); |
| 4617 | 4630 | ||
| 4618 | if (mpi_reply == NULL) { | 4631 | if (mpi_reply == NULL) { |
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 567fa080e261..56d6142852a5 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
| @@ -1456,15 +1456,20 @@ qla2x00_abort_all_cmds(scsi_qla_host_t *vha, int res) | |||
| 1456 | for (cnt = 1; cnt < req->num_outstanding_cmds; cnt++) { | 1456 | for (cnt = 1; cnt < req->num_outstanding_cmds; cnt++) { |
| 1457 | sp = req->outstanding_cmds[cnt]; | 1457 | sp = req->outstanding_cmds[cnt]; |
| 1458 | if (sp) { | 1458 | if (sp) { |
| 1459 | /* Get a reference to the sp and drop the lock. | 1459 | /* Don't abort commands in adapter during EEH |
| 1460 | * The reference ensures this sp->done() call | 1460 | * recovery as it's not accessible/responding. |
| 1461 | * - and not the call in qla2xxx_eh_abort() - | ||
| 1462 | * ends the SCSI command (with result 'res'). | ||
| 1463 | */ | 1461 | */ |
| 1464 | sp_get(sp); | 1462 | if (!ha->flags.eeh_busy) { |
| 1465 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 1463 | /* Get a reference to the sp and drop the lock. |
| 1466 | qla2xxx_eh_abort(GET_CMD_SP(sp)); | 1464 | * The reference ensures this sp->done() call |
| 1467 | spin_lock_irqsave(&ha->hardware_lock, flags); | 1465 | * - and not the call in qla2xxx_eh_abort() - |
| 1466 | * ends the SCSI command (with result 'res'). | ||
| 1467 | */ | ||
| 1468 | sp_get(sp); | ||
| 1469 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | ||
| 1470 | qla2xxx_eh_abort(GET_CMD_SP(sp)); | ||
| 1471 | spin_lock_irqsave(&ha->hardware_lock, flags); | ||
| 1472 | } | ||
| 1468 | req->outstanding_cmds[cnt] = NULL; | 1473 | req->outstanding_cmds[cnt] = NULL; |
| 1469 | sp->done(vha, sp, res); | 1474 | sp->done(vha, sp, res); |
| 1470 | } | 1475 | } |
