[bug report] scsi: lpfc: Add EDC ELS support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello James Smart,

The patch 9064aeb2df8e: "scsi: lpfc: Add EDC ELS support" from Aug
16, 2021 (linux-next), leads to the following Smatch static checker
warning:

	drivers/scsi/lpfc/lpfc_els.c:4353 lpfc_issue_els_edc()
	warn: missing unwind goto?

drivers/scsi/lpfc/lpfc_els.c
    4290 int
    4291 lpfc_issue_els_edc(struct lpfc_vport *vport, uint8_t retry)
    4292 {
    4293         struct lpfc_hba  *phba = vport->phba;
    4294         struct lpfc_iocbq *elsiocb;
    4295         struct fc_els_edc *edc_req;
    4296         struct fc_tlv_desc *tlv;
    4297         u16 cmdsize;
    4298         struct lpfc_nodelist *ndlp;
    4299         u8 *pcmd = NULL;
    4300         u32 cgn_desc_size, lft_desc_size;
    4301         int rc;
    4302 
    4303         if (vport->port_type == LPFC_NPIV_PORT)
    4304                 return -EACCES;
    4305 
    4306         ndlp = lpfc_findnode_did(vport, Fabric_DID);
    4307         if (!ndlp || ndlp->nlp_state != NLP_STE_UNMAPPED_NODE)
    4308                 return -ENODEV;
    4309 
    4310         cgn_desc_size = (phba->cgn_init_reg_signal) ?
    4311                                 sizeof(struct fc_diag_cg_sig_desc) : 0;
    4312         lft_desc_size = (lpfc_link_is_lds_capable(phba)) ?
    4313                                 sizeof(struct fc_diag_lnkflt_desc) : 0;
    4314         cmdsize = cgn_desc_size + lft_desc_size;
    4315 
    4316         /* Skip EDC if no applicable descriptors */
    4317         if (!cmdsize)
    4318                 goto try_rdf;
    4319 
    4320         cmdsize += sizeof(struct fc_els_edc);
    4321         elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp,
    4322                                      ndlp->nlp_DID, ELS_CMD_EDC);
    4323         if (!elsiocb)
    4324                 goto try_rdf;
    4325 
    4326         /* Configure the payload for the supported Diagnostics capabilities. */
    4327         pcmd = (u8 *)elsiocb->cmd_dmabuf->virt;
    4328         memset(pcmd, 0, cmdsize);
    4329         edc_req = (struct fc_els_edc *)pcmd;
    4330         edc_req->desc_len = cpu_to_be32(cgn_desc_size + lft_desc_size);
    4331         edc_req->edc_cmd = ELS_EDC;
    4332         tlv = edc_req->desc;
    4333 
    4334         if (cgn_desc_size) {
    4335                 lpfc_format_edc_cgn_desc(phba, tlv);
    4336                 phba->cgn_sig_freq = lpfc_fabric_cgn_frequency;
    4337                 tlv = fc_tlv_next_desc(tlv);
    4338         }
    4339 
    4340         if (lft_desc_size)
    4341                 lpfc_format_edc_lft_desc(phba, tlv);
    4342 
    4343         lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS | LOG_CGN_MGMT,
    4344                          "4623 Xmit EDC to remote "
    4345                          "NPORT x%x reg_sig x%x reg_fpin:x%x\n",
    4346                          ndlp->nlp_DID, phba->cgn_reg_signal,
    4347                          phba->cgn_reg_fpin);
    4348 
    4349         elsiocb->cmd_cmpl = lpfc_cmpl_els_disc_cmd;
    4350         elsiocb->ndlp = lpfc_nlp_get(ndlp);
    4351         if (!elsiocb->ndlp) {
    4352                 lpfc_els_free_iocb(phba, elsiocb);
--> 4353                 return -EIO;

This is a couple years old but apparently, but I've never reported it
before.  Smatch wanted a goto try_rdf; here.  Not sure if Smatch is
correct.  If not just ignore this it.  These are one time emails.

    4354         }
    4355 
    4356         lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
    4357                               "Issue EDC:     did:x%x refcnt %d",
    4358                               ndlp->nlp_DID, kref_read(&ndlp->kref), 0);
    4359         rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
    4360         if (rc == IOCB_ERROR) {
    4361                 /* The additional lpfc_nlp_put will cause the following
    4362                  * lpfc_els_free_iocb routine to trigger the rlease of
    4363                  * the node.
    4364                  */
    4365                 lpfc_els_free_iocb(phba, elsiocb);
    4366                 lpfc_nlp_put(ndlp);
    4367                 goto try_rdf;
    4368         }
    4369         return 0;
    4370 try_rdf:
    4371         phba->cgn_reg_fpin = LPFC_CGN_FPIN_WARN | LPFC_CGN_FPIN_ALARM;
    4372         phba->cgn_reg_signal = EDC_CG_SIG_NOTSUPPORTED;
    4373         rc = lpfc_issue_els_rdf(vport, 0);
    4374         return rc;
    4375 }

regards,
dan carpenter



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]

  Powered by Linux