Re: [PATCH 19/43] qla2xxx: Fix session cleanup for N2N

kbuild test robot
2017-12-21T06:01:51Z

Hi Quinn,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on scsi/for-next]
[also build test WARNING on next-20171220]
[cannot apply to v4.15-rc4]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url: https://github.com/0day-ci/linux/commits/Himanshu-Madhani/qla2xxx-Driver-update/20171221-085840
base: https://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi.git for-next
reproduce:
# apt-get install sparse
make ARCH=x86_64 allmodconfig
make C=1 CF=-D__CHECK_ENDIAN__

sparse warnings: (new ones prefixed by >>)

vim +4828 drivers/scsi/qla2xxx/qla_os.c

4743
4744 static
4745 void qla24xx_create_new_sess(struct scsi_qla_host *vha, struct qla_work_evt *e)
4746 {
4747 unsigned long flags;
4748 fc_port_t *fcport = NULL, *tfcp;
4749 struct qlt_plogi_ack_t *pla =
4750 (struct qlt_plogi_ack_t *)e->u.new_sess.pla;
4751 uint8_t free_fcport = 0;
4752
4753 ql_dbg(ql_dbg_disc, vha, 0xffff,
4754 "%s %d %8phC enter\n",
4755 __func__, __LINE__, e->u.new_sess.port_name);
4756
4757 spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags);
4758 fcport = qla2x00_find_fcport_by_wwpn(vha, e->u.new_sess.port_name, 1);
4759 if (fcport) {
4760 fcport->d_id = e->u.new_sess.id;
4761 if (pla) {
4762 fcport->fw_login_state = DSC_LS_PLOGI_PEND;
4763 memcpy(fcport->node_name,
4764 pla->iocb.u.isp24.u.plogi.node_name,
4765 WWN_SIZE);
4766 qlt_plogi_ack_link(vha, pla, fcport, QLT_PLOGI_LINK_SAME_WWN);
4767 /* we took an extra ref_count to prevent PLOGI ACK when
4768 * fcport/sess has not been created.
4769 */
4770 pla->ref_count--;
4771 }
4772 } else {
4773 spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags);
4774 fcport = qla2x00_alloc_fcport(vha, GFP_KERNEL);
4775 if (fcport) {
4776 fcport->d_id = e->u.new_sess.id;
4777 fcport->scan_state = QLA_FCPORT_FOUND;
4778 fcport->flags |= FCF_FABRIC_DEVICE;
4779 fcport->fw_login_state = DSC_LS_PLOGI_PEND;
4780
4781 memcpy(fcport->port_name, e->u.new_sess.port_name,
4782 WWN_SIZE);
4783 } else {
4784 ql_dbg(ql_dbg_disc, vha, 0xffff,
4785 "%s %8phC mem alloc fail.\n",
4786 __func__, e->u.new_sess.port_name);
4787
4788 if (pla)
4789 kmem_cache_free(qla_tgt_plogi_cachep, pla);
4790 return;
4791 }
4792
4793 spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags);
4794 /* search again to make sure one else got ahead */
4795 tfcp = qla2x00_find_fcport_by_wwpn(vha,
4796 e->u.new_sess.port_name, 1);
4797 if (tfcp) {
4798 /* should rarily happen */
4799 ql_dbg(ql_dbg_disc, vha, 0xffff,
4800 "%s %8phC found existing fcport b4 add. DS %d LS %d\n",
4801 __func__, tfcp->port_name, tfcp->disc_state,
4802 tfcp->fw_login_state);
4803
4804 free_fcport = 1;
4805 } else {
4806 list_add_tail(&fcport->list, &vha->vp_fcports);
4807
4808 }
4809 if (pla) {
4810 qlt_plogi_ack_link(vha, pla, fcport,
4811 QLT_PLOGI_LINK_SAME_WWN);
4812 pla->ref_count--;
4813 }
4814 }
4815 spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags);
4816
4817 if (fcport) {
4818 if (N2N_TOPO(vha->hw))
4819 fcport->flags &= ~FCF_FABRIC_DEVICE;
4820
4821 if (pla) {
4822 if (pla->iocb.u.isp24.status_subcode == ELS_PRLI) {
4823 u16 wd3_lo;
4824
4825 fcport->fw_login_state = DSC_LS_PRLI_PEND;
4826 fcport->local = 0;
4827 fcport->loop_id =
> 4828 le16_to_cpu(
4829 pla->iocb.u.isp24.nport_handle);
4830 fcport->fw_login_state = DSC_LS_PRLI_PEND;
4831 wd3_lo =
4832 le16_to_cpu(
4833 pla->iocb.u.isp24.u.prli.wd3_lo);
4834
4835 if (wd3_lo & BIT_7)
4836 fcport->conf_compl_supported = 1;
4837
4838 if ((wd3_lo & BIT_4) == 0)
4839 fcport->port_type = FCT_INITIATOR;
4840 else
4841 fcport->port_type = FCT_TARGET;
4842 }
4843 qlt_plogi_ack_unref(vha, pla);
4844 } else {
4845 spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags);
4846 tfcp = qla2x00_find_fcport_by_nportid(vha,
4847 &e->u.new_sess.id, 1);
4848 if (tfcp && (tfcp != fcport)) {
4849 /*
4850 * We have a conflict fcport with same NportID.
4851 */
4852 ql_dbg(ql_dbg_disc, vha, 0xffff,
4853 "%s %8phC found conflict b4 add. DS %d LS %d\n",
4854 __func__, tfcp->port_name, tfcp->disc_state,
4855 tfcp->fw_login_state);
4856
4857 switch (tfcp->disc_state) {
4858 case DSC_DELETED:
4859 break;
4860 case DSC_DELETE_PEND:
4861 fcport->login_pause = 1;
4862 tfcp->conflict = fcport;
4863 break;
4864 default:
4865 fcport->login_pause = 1;
4866 tfcp->conflict = fcport;
4867 qlt_schedule_sess_for_deletion_lock
4868 (tfcp);
4869 break;
4870 }
4871 }
4872 spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags);
4873 qla24xx_async_gnl(vha, fcport);
4874 }
4875 }
4876
4877 if (free_fcport) {
4878 qla2x00_free_fcport(fcport);
4879 if (pla)
4880 kmem_cache_free(qla_tgt_plogi_cachep, pla);
4881 }
4882 }
4883

---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation