Merge remote-tracking branch 'mkp-scsi/4.9/scsi-fixes' into fixes
This commit is contained in:
commit
d8188b1008
|
@ -4010,7 +4010,10 @@ _scsih_eedp_error_handling(struct scsi_cmnd *scmd, u16 ioc_status)
|
||||||
SAM_STAT_CHECK_CONDITION;
|
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
|
* 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)
|
if (ioc->logging_level & MPT_DEBUG_SCSI)
|
||||||
scsi_print_command(scmd);
|
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;
|
sas_device_priv_data = scmd->device->hostdata;
|
||||||
if (!sas_device_priv_data || !sas_device_priv_data->sas_target) {
|
if (!sas_device_priv_data || !sas_device_priv_data->sas_target) {
|
||||||
scmd->result = DID_NO_CONNECT << 16;
|
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)
|
if (scmd == NULL)
|
||||||
return 1;
|
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);
|
mpi_request = mpt3sas_base_get_msg_frame(ioc, smid);
|
||||||
|
|
||||||
if (mpi_reply == NULL) {
|
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++) {
|
for (cnt = 1; cnt < req->num_outstanding_cmds; cnt++) {
|
||||||
sp = req->outstanding_cmds[cnt];
|
sp = req->outstanding_cmds[cnt];
|
||||||
if (sp) {
|
if (sp) {
|
||||||
/* Get a reference to the sp and drop the lock.
|
/* Don't abort commands in adapter during EEH
|
||||||
* The reference ensures this sp->done() call
|
* recovery as it's not accessible/responding.
|
||||||
* - and not the call in qla2xxx_eh_abort() -
|
|
||||||
* ends the SCSI command (with result 'res').
|
|
||||||
*/
|
*/
|
||||||
sp_get(sp);
|
if (!ha->flags.eeh_busy) {
|
||||||
spin_unlock_irqrestore(&ha->hardware_lock, flags);
|
/* Get a reference to the sp and drop the lock.
|
||||||
qla2xxx_eh_abort(GET_CMD_SP(sp));
|
* The reference ensures this sp->done() call
|
||||||
spin_lock_irqsave(&ha->hardware_lock, flags);
|
* - 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;
|
req->outstanding_cmds[cnt] = NULL;
|
||||||
sp->done(vha, sp, res);
|
sp->done(vha, sp, res);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue