scsi: lpfc: Fix resource leak in lpfc_sli4_send_seq_to_ulp()
authorJames Smart <jsmart2021@gmail.com>
Tue, 26 Apr 2022 18:14:19 +0000 (11:14 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 9 Jun 2022 08:22:34 +0000 (10:22 +0200)
[ Upstream commit 646db1a560f44236b7278b822ca99a1d3b6ea72c ]

If no handler is found in lpfc_complete_unsol_iocb() to match the rctl of a
received frame, the frame is dropped and resources are leaked.

Fix by returning resources when discarding an unhandled frame type.  Update
lpfc_fc_frame_check() handling of NOP basic link service.

Link: https://lore.kernel.org/r/20220426181419.9154-1-jsmart2021@gmail.com
Co-developed-by: Justin Tee <justin.tee@broadcom.com>
Signed-off-by: Justin Tee <justin.tee@broadcom.com>
Signed-off-by: James Smart <jsmart2021@gmail.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/scsi/lpfc/lpfc_sli.c

index 68d8e55c1205c6f47b1c5721b7ca32311f022486..d8d26cde70b65bfee39f0792851937c0bb3579c6 100644 (file)
@@ -18455,7 +18455,6 @@ lpfc_fc_frame_check(struct lpfc_hba *phba, struct fc_frame_header *fc_hdr)
        case FC_RCTL_ELS_REP:   /* extended link services reply */
        case FC_RCTL_ELS4_REQ:  /* FC-4 ELS request */
        case FC_RCTL_ELS4_REP:  /* FC-4 ELS reply */
-       case FC_RCTL_BA_NOP:    /* basic link service NOP */
        case FC_RCTL_BA_ABTS:   /* basic link service abort */
        case FC_RCTL_BA_RMC:    /* remove connection */
        case FC_RCTL_BA_ACC:    /* basic accept */
@@ -18476,6 +18475,7 @@ lpfc_fc_frame_check(struct lpfc_hba *phba, struct fc_frame_header *fc_hdr)
                fc_vft_hdr = (struct fc_vft_header *)fc_hdr;
                fc_hdr = &((struct fc_frame_header *)fc_vft_hdr)[1];
                return lpfc_fc_frame_check(phba, fc_hdr);
+       case FC_RCTL_BA_NOP:    /* basic link service NOP */
        default:
                goto drop;
        }
@@ -19288,12 +19288,14 @@ lpfc_sli4_send_seq_to_ulp(struct lpfc_vport *vport,
        if (!lpfc_complete_unsol_iocb(phba,
                                      phba->sli4_hba.els_wq->pring,
                                      iocbq, fc_hdr->fh_r_ctl,
-                                     fc_hdr->fh_type))
+                                     fc_hdr->fh_type)) {
                lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
                                "2540 Ring %d handler: unexpected Rctl "
                                "x%x Type x%x received\n",
                                LPFC_ELS_RING,
                                fc_hdr->fh_r_ctl, fc_hdr->fh_type);
+               lpfc_in_buf_free(phba, &seq_dmabuf->dbuf);
+       }
 
        /* Free iocb created in lpfc_prep_seq */
        list_for_each_entry_safe(curr_iocb, next_iocb,