Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b66c08ba authored by Linus Torvalds's avatar Linus Torvalds
Browse files
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
parents 57527ed1 d8188b10
Loading
Loading
Loading
Loading
+14 −1
Original line number Diff line number Diff line
@@ -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) {
+13 −8
Original line number Diff line number Diff line
@@ -1456,6 +1456,10 @@ 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) {
				/* Don't abort commands in adapter during EEH
				 * recovery as it's not accessible/responding.
				 */
				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() -
@@ -1465,6 +1469,7 @@ qla2x00_abort_all_cmds(scsi_qla_host_t *vha, int res)
					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);
			}