Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 11 Feb 2017 17:01:03 +0000 (09:01 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 11 Feb 2017 17:01:03 +0000 (09:01 -0800)
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

1  2 
drivers/scsi/qla2xxx/qla_isr.c
drivers/scsi/qla2xxx/qla_os.c

@@@ -2492,10 -2492,6 +2492,10 @@@ qla2x00_error_entry(scsi_qla_host_t *vh
        if (pkt->entry_status & RF_BUSY)
                res = DID_BUS_BUSY << 16;
  
 +      if (pkt->entry_type == NOTIFY_ACK_TYPE &&
 +          pkt->handle == QLA_TGT_SKIP_HANDLE)
 +              return;
 +
        sp = qla2x00_get_sp_from_handle(vha, func, req, pkt);
        if (sp) {
                sp->done(ha, sp, res);
@@@ -3242,7 -3238,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) {
                free_irq(pci_irq_vector(ha->pdev, 0), rsp);
        }
  
+ free_irqs:
        pci_free_irq_vectors(ha->pdev);
  }
  
@@@ -1616,7 -1616,7 +1616,7 @@@ qla2x00_abort_all_cmds(scsi_qla_host_t 
                                /* 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() -
@@@ -3662,7 -3662,7 +3662,7 @@@ qla2x00_mem_alloc(struct qla_hw_data *h
                                sizeof(struct ct6_dsd), 0,
                                SLAB_HWCACHE_ALIGN, NULL);
                        if (!ctx_cachep)
 -                              goto fail_free_gid_list;
 +                              goto fail_free_srb_mempool;
                }
                ha->ctx_mempool = mempool_create_slab_pool(SRB_MIN_REQ,
                        ctx_cachep);
        ha->loop_id_map = kzalloc(BITS_TO_LONGS(LOOPID_MAP_SIZE) * sizeof(long),
            GFP_KERNEL);
        if (!ha->loop_id_map)
 -              goto fail_async_pd;
 +              goto fail_loop_id_map;
        else {
                qla2x00_set_reserved_loop_ids(ha);
                ql_dbg_pci(ql_dbg_init, ha->pdev, 0x0123,
  
        return 0;
  
 +fail_loop_id_map:
 +      dma_pool_free(ha->s_dma_pool, ha->async_pd, ha->async_pd_dma);
  fail_async_pd:
        dma_pool_free(ha->s_dma_pool, ha->ex_init_cb, ha->ex_init_cb_dma);
  fail_ex_init_cb:
@@@ -3853,10 -3851,6 +3853,10 @@@ fail_free_ms_iocb
        dma_pool_free(ha->s_dma_pool, ha->ms_iocb, ha->ms_iocb_dma);
        ha->ms_iocb = NULL;
        ha->ms_iocb_dma = 0;
 +
 +      if (ha->sns_cmd)
 +              dma_free_coherent(&ha->pdev->dev, sizeof(struct sns_cmd_pkt),
 +                  ha->sns_cmd, ha->sns_cmd_dma);
  fail_dma_pool:
        if (IS_QLA82XX(ha) || ql2xenabledif) {
                dma_pool_destroy(ha->fcp_cmnd_dma_pool);
@@@ -3874,12 -3868,10 +3874,12 @@@ fail_free_nvram
        kfree(ha->nvram);
        ha->nvram = NULL;
  fail_free_ctx_mempool:
 -      mempool_destroy(ha->ctx_mempool);
 +      if (ha->ctx_mempool)
 +              mempool_destroy(ha->ctx_mempool);
        ha->ctx_mempool = NULL;
  fail_free_srb_mempool:
 -      mempool_destroy(ha->srb_mempool);
 +      if (ha->srb_mempool)
 +              mempool_destroy(ha->srb_mempool);
        ha->srb_mempool = NULL;
  fail_free_gid_list:
        dma_free_coherent(&ha->pdev->dev, qla2x00_gid_list_size(ha),