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

Commit 13ebfd06 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull SCSI fixes from James Bottomley:
 "Six fairly small fixes. None is a real show stopper, two automation
  detected problems: one memory leak, one use after free and four others
  each of which fixes something that has been a significant source of
  annoyance to someone"

* tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi:
  scsi: zfcp: fix use-after-free by not tracing WKA port open/close on failed send
  scsi: aacraid: Fix INTx/MSI-x issue with older controllers
  scsi: mpt3sas: disable ASPM for MPI2 controllers
  scsi: mpt3sas: Force request partial completion alignment
  scsi: qla2xxx: Avoid that issuing a LIP triggers a kernel crash
  scsi: qla2xxx: Fix a recently introduced memory leak
parents 1ee18329 ed6de456
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -1583,7 +1583,7 @@ static void zfcp_fsf_open_wka_port_handler(struct zfcp_fsf_req *req)
int zfcp_fsf_open_wka_port(struct zfcp_fc_wka_port *wka_port)
{
	struct zfcp_qdio *qdio = wka_port->adapter->qdio;
	struct zfcp_fsf_req *req = NULL;
	struct zfcp_fsf_req *req;
	int retval = -EIO;

	spin_lock_irq(&qdio->req_q_lock);
@@ -1612,7 +1612,7 @@ int zfcp_fsf_open_wka_port(struct zfcp_fc_wka_port *wka_port)
		zfcp_fsf_req_free(req);
out:
	spin_unlock_irq(&qdio->req_q_lock);
	if (req && !IS_ERR(req))
	if (!retval)
		zfcp_dbf_rec_run_wka("fsowp_1", wka_port, req->req_id);
	return retval;
}
@@ -1638,7 +1638,7 @@ static void zfcp_fsf_close_wka_port_handler(struct zfcp_fsf_req *req)
int zfcp_fsf_close_wka_port(struct zfcp_fc_wka_port *wka_port)
{
	struct zfcp_qdio *qdio = wka_port->adapter->qdio;
	struct zfcp_fsf_req *req = NULL;
	struct zfcp_fsf_req *req;
	int retval = -EIO;

	spin_lock_irq(&qdio->req_q_lock);
@@ -1667,7 +1667,7 @@ int zfcp_fsf_close_wka_port(struct zfcp_fc_wka_port *wka_port)
		zfcp_fsf_req_free(req);
out:
	spin_unlock_irq(&qdio->req_q_lock);
	if (req && !IS_ERR(req))
	if (!retval)
		zfcp_dbf_rec_run_wka("fscwp_1", wka_port, req->req_id);
	return retval;
}
+6 −2
Original line number Diff line number Diff line
@@ -50,9 +50,13 @@ struct aac_common aac_config = {

static inline int aac_is_msix_mode(struct aac_dev *dev)
{
	u32 status;
	u32 status = 0;

	if (dev->pdev->device == PMC_DEVICE_S6 ||
		dev->pdev->device == PMC_DEVICE_S7 ||
		dev->pdev->device == PMC_DEVICE_S8) {
		status = src_readl(dev, MUnit.OMR);
	}
	return (status & AAC_INT_MODE_MSIX);
}

+18 −0
Original line number Diff line number Diff line
@@ -51,6 +51,7 @@
#include <linux/workqueue.h>
#include <linux/delay.h>
#include <linux/pci.h>
#include <linux/pci-aspm.h>
#include <linux/interrupt.h>
#include <linux/aer.h>
#include <linux/raid_class.h>
@@ -4657,6 +4658,7 @@ _scsih_io_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply)
	struct MPT3SAS_DEVICE *sas_device_priv_data;
	u32 response_code = 0;
	unsigned long flags;
	unsigned int sector_sz;

	mpi_reply = mpt3sas_base_get_reply_virt_addr(ioc, reply);
	scmd = _scsih_scsi_lookup_get_clear(ioc, smid);
@@ -4715,6 +4717,20 @@ _scsih_io_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply)
	}

	xfer_cnt = le32_to_cpu(mpi_reply->TransferCount);

	/* In case of bogus fw or device, we could end up having
	 * unaligned partial completion. We can force alignment here,
	 * then scsi-ml does not need to handle this misbehavior.
	 */
	sector_sz = scmd->device->sector_size;
	if (unlikely(scmd->request->cmd_type == REQ_TYPE_FS && sector_sz &&
		     xfer_cnt % sector_sz)) {
		sdev_printk(KERN_INFO, scmd->device,
		    "unaligned partial completion avoided (xfer_cnt=%u, sector_sz=%u)\n",
			    xfer_cnt, sector_sz);
		xfer_cnt = round_down(xfer_cnt, sector_sz);
	}

	scsi_set_resid(scmd, scsi_bufflen(scmd) - xfer_cnt);
	if (ioc_status & MPI2_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE)
		log_info =  le32_to_cpu(mpi_reply->IOCLogInfo);
@@ -8746,6 +8762,8 @@ _scsih_probe(struct pci_dev *pdev, const struct pci_device_id *id)

	switch (hba_mpi_version) {
	case MPI2_VERSION:
		pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S |
			PCIE_LINK_STATE_L1 | PCIE_LINK_STATE_CLKPM);
		/* Use mpt2sas driver host template for SAS 2.0 HBA's */
		shost = scsi_host_alloc(&mpt2sas_driver_template,
		  sizeof(struct MPT3SAS_ADAPTER));
+2 −1
Original line number Diff line number Diff line
@@ -3242,7 +3242,7 @@ qla2x00_free_irqs(scsi_qla_host_t *vha)
	 * from a probe failure context.
	 */
	if (!ha->rsp_q_map || !ha->rsp_q_map[0])
		return;
		goto free_irqs;
	rsp = ha->rsp_q_map[0];

	if (ha->flags.msix_enabled) {
@@ -3262,6 +3262,7 @@ qla2x00_free_irqs(scsi_qla_host_t *vha)
		free_irq(pci_irq_vector(ha->pdev, 0), rsp);
	}

free_irqs:
	pci_free_irq_vectors(ha->pdev);
}

+1 −1
Original line number Diff line number Diff line
@@ -1616,7 +1616,7 @@ qla2x00_abort_all_cmds(scsi_qla_host_t *vha, int res)
				/* Don't abort commands in adapter during EEH
				 * recovery as it's not accessible/responding.
				 */
				if (!ha->flags.eeh_busy) {
				if (GET_CMD_SP(sp) && !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() -