SCSI fixes on 20161121
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. Signed-off-by: James E.J. Bottomley <jejb@linux.vnet.ibm.com> -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAABAgAGBQJYM+VcAAoJEAVr7HOZEZN490gQAJL3Dto24hmkNO515Lx/21j0 ZuSWxJBmHMRvEOBJDf0dmoqIUVv/9p2rlITztV1kYFeNSNR3KWwcOCJjZGyI7PrN 5JSsdBMgcdu3yRiHTm/Aa3wQc7DcyAeaYfm5Bgm699PAe9Qjo3c0mCVRRFq1WvgR ydmg7YtxgwFQ+yLUlkN+LT4HkTYRq9DsD2PG5ThYxGfc4e/Cy/QSQtBoEvvfLJCP 9G/MerMX0suULOrwbXkRT8K1UMkeWcmaRaNYBFkY+YDD+XbUY1E6GrzSrDIa6Kce zDHkNN+nFruRA1PkZwvNVslTcT28cFisxvDx5mu21d91kWiZ1E5D3Fnz0iRsxw97 Q2F8vP7Pazm+/A4nj+HBtpO9Xw355wDCP7WsE7v81JBlEGCx+1LRsbcAN5fjnVqg XujLeaTpZDPJXPVgu9aicZtfERlEBQpgNXkhNvSHp/X0Z+wE5KFYkssBXje6S/vJ RwxsuVvDfe6m+YE36SPfNKONVk92GHQLhwDP6OEW54YgoBnDTAJnoufTSWJpFXcz vHJdGdH0vDP783m/Ri7U3osL0+MrrqMw/Ww+C0kMMsNjbgxn48TRaAjX3H/hp43d sopoV/o+TuCYsSgPictRRueizpkhZungM3JgLYArIZshIIoY6gjj7LztCCsx2eMQ TmvQhbiYmXoatCDjQmmL =umrF -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
b66c08ba28
|
@ -4010,7 +4010,10 @@ _scsih_eedp_error_handling(struct scsi_cmnd *scmd, u16 ioc_status)
|
|||
SAM_STAT_CHECK_CONDITION;
|
||||
}
|
||||
|
||||
|
||||
static inline bool ata_12_16_cmd(struct scsi_cmnd *scmd)
|
||||
{
|
||||
return (scmd->cmnd[0] == ATA_12 || scmd->cmnd[0] == ATA_16);
|
||||
}
|
||||
|
||||
/**
|
||||
* scsih_qcmd - main scsi request entry point
|
||||
|
@ -4038,6 +4041,13 @@ scsih_qcmd(struct Scsi_Host *shost, struct scsi_cmnd *scmd)
|
|||
if (ioc->logging_level & MPT_DEBUG_SCSI)
|
||||
scsi_print_command(scmd);
|
||||
|
||||
/*
|
||||
* Lock the device for any subsequent command until command is
|
||||
* done.
|
||||
*/
|
||||
if (ata_12_16_cmd(scmd))
|
||||
scsi_internal_device_block(scmd->device);
|
||||
|
||||
sas_device_priv_data = scmd->device->hostdata;
|
||||
if (!sas_device_priv_data || !sas_device_priv_data->sas_target) {
|
||||
scmd->result = DID_NO_CONNECT << 16;
|
||||
|
@ -4613,6 +4623,9 @@ _scsih_io_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply)
|
|||
if (scmd == NULL)
|
||||
return 1;
|
||||
|
||||
if (ata_12_16_cmd(scmd))
|
||||
scsi_internal_device_unblock(scmd->device, SDEV_RUNNING);
|
||||
|
||||
mpi_request = mpt3sas_base_get_msg_frame(ioc, smid);
|
||||
|
||||
if (mpi_reply == NULL) {
|
||||
|
|
|
@ -1456,15 +1456,20 @@ qla2x00_abort_all_cmds(scsi_qla_host_t *vha, int res)
|
|||
for (cnt = 1; cnt < req->num_outstanding_cmds; cnt++) {
|
||||
sp = req->outstanding_cmds[cnt];
|
||||
if (sp) {
|
||||
/* Get a reference to the sp and drop the lock.
|
||||
* The reference ensures this sp->done() call
|
||||
* - and not the call in qla2xxx_eh_abort() -
|
||||
* ends the SCSI command (with result 'res').
|
||||
/* Don't abort commands in adapter during EEH
|
||||
* recovery as it's not accessible/responding.
|
||||
*/
|
||||
sp_get(sp);
|
||||
spin_unlock_irqrestore(&ha->hardware_lock, flags);
|
||||
qla2xxx_eh_abort(GET_CMD_SP(sp));
|
||||
spin_lock_irqsave(&ha->hardware_lock, flags);
|
||||
if (!ha->flags.eeh_busy) {
|
||||
/* Get a reference to the sp and drop the lock.
|
||||
* The reference ensures this sp->done() call
|
||||
* - and not the call in qla2xxx_eh_abort() -
|
||||
* ends the SCSI command (with result 'res').
|
||||
*/
|
||||
sp_get(sp);
|
||||
spin_unlock_irqrestore(&ha->hardware_lock, flags);
|
||||
qla2xxx_eh_abort(GET_CMD_SP(sp));
|
||||
spin_lock_irqsave(&ha->hardware_lock, flags);
|
||||
}
|
||||
req->outstanding_cmds[cnt] = NULL;
|
||||
sp->done(vha, sp, res);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue