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

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

 



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



[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