mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-27 04:54:41 +08:00
scsi: lpfc: fix pci hot plug crash in list_add call
During pci hot plug, the kernel crashes in a list_add_call The lookup by tag function will return null if the IOCB is out of range or does not have the on txcmplq flag set. Fix: Check for null return from lookup by tag. Cc: <stable@vger.kernel.org> # 4.12+ Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com> Signed-off-by: James Smart <james.smart@broadcom.com> Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
1901762f2c
commit
401bb4169d
@ -12507,19 +12507,21 @@ lpfc_sli4_els_wcqe_to_rspiocbq(struct lpfc_hba *phba,
|
||||
/* Look up the ELS command IOCB and create pseudo response IOCB */
|
||||
cmdiocbq = lpfc_sli_iocbq_lookup_by_tag(phba, pring,
|
||||
bf_get(lpfc_wcqe_c_request_tag, wcqe));
|
||||
/* Put the iocb back on the txcmplq */
|
||||
lpfc_sli_ringtxcmpl_put(phba, pring, cmdiocbq);
|
||||
spin_unlock_irqrestore(&pring->ring_lock, iflags);
|
||||
|
||||
if (unlikely(!cmdiocbq)) {
|
||||
spin_unlock_irqrestore(&pring->ring_lock, iflags);
|
||||
lpfc_printf_log(phba, KERN_WARNING, LOG_SLI,
|
||||
"0386 ELS complete with no corresponding "
|
||||
"cmdiocb: iotag (%d)\n",
|
||||
bf_get(lpfc_wcqe_c_request_tag, wcqe));
|
||||
"cmdiocb: 0x%x 0x%x 0x%x 0x%x\n",
|
||||
wcqe->word0, wcqe->total_data_placed,
|
||||
wcqe->parameter, wcqe->word3);
|
||||
lpfc_sli_release_iocbq(phba, irspiocbq);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Put the iocb back on the txcmplq */
|
||||
lpfc_sli_ringtxcmpl_put(phba, pring, cmdiocbq);
|
||||
spin_unlock_irqrestore(&pring->ring_lock, iflags);
|
||||
|
||||
/* Fake the irspiocbq and copy necessary response information */
|
||||
lpfc_sli4_iocb_param_transfer(phba, irspiocbq, cmdiocbq, wcqe);
|
||||
|
||||
@ -17134,7 +17136,8 @@ exit:
|
||||
if (pcmd && pcmd->virt)
|
||||
dma_pool_free(phba->lpfc_drb_pool, pcmd->virt, pcmd->phys);
|
||||
kfree(pcmd);
|
||||
lpfc_sli_release_iocbq(phba, iocbq);
|
||||
if (iocbq)
|
||||
lpfc_sli_release_iocbq(phba, iocbq);
|
||||
lpfc_in_buf_free(phba, &dmabuf->dbuf);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user