diff options
Diffstat (limited to 'net/smc/smc_core.c')
| -rw-r--r-- | net/smc/smc_core.c | 37 | 
1 files changed, 27 insertions, 10 deletions
diff --git a/net/smc/smc_core.c b/net/smc/smc_core.c index d520ee62c8ec..95cc95458e2d 100644 --- a/net/smc/smc_core.c +++ b/net/smc/smc_core.c @@ -506,6 +506,7 @@ static int smc_nl_fill_smcd_lgr(struct smc_link_group *lgr,  {  	char smc_pnet[SMC_MAX_PNETID_LEN + 1];  	struct smcd_dev *smcd = lgr->smcd; +	struct smcd_gid smcd_gid;  	struct nlattr *attrs;  	void *nlh; @@ -521,13 +522,19 @@ static int smc_nl_fill_smcd_lgr(struct smc_link_group *lgr,  	if (nla_put_u32(skb, SMC_NLA_LGR_D_ID, *((u32 *)&lgr->id)))  		goto errattr; +	smcd->ops->get_local_gid(smcd, &smcd_gid);  	if (nla_put_u64_64bit(skb, SMC_NLA_LGR_D_GID, -			      smcd->ops->get_local_gid(smcd), -				  SMC_NLA_LGR_D_PAD)) +			      smcd_gid.gid, SMC_NLA_LGR_D_PAD))  		goto errattr; -	if (nla_put_u64_64bit(skb, SMC_NLA_LGR_D_PEER_GID, lgr->peer_gid, +	if (nla_put_u64_64bit(skb, SMC_NLA_LGR_D_EXT_GID, +			      smcd_gid.gid_ext, SMC_NLA_LGR_D_PAD)) +		goto errattr; +	if (nla_put_u64_64bit(skb, SMC_NLA_LGR_D_PEER_GID, lgr->peer_gid.gid,  			      SMC_NLA_LGR_D_PAD))  		goto errattr; +	if (nla_put_u64_64bit(skb, SMC_NLA_LGR_D_PEER_EXT_GID, +			      lgr->peer_gid.gid_ext, SMC_NLA_LGR_D_PAD)) +		goto errattr;  	if (nla_put_u8(skb, SMC_NLA_LGR_D_VLAN_ID, lgr->vlan_id))  		goto errattr;  	if (nla_put_u32(skb, SMC_NLA_LGR_D_CONNS_NUM, lgr->conns_num)) @@ -876,7 +883,10 @@ static int smc_lgr_create(struct smc_sock *smc, struct smc_init_info *ini)  		/* SMC-D specific settings */  		smcd = ini->ism_dev[ini->ism_selected];  		get_device(smcd->ops->get_dev(smcd)); -		lgr->peer_gid = ini->ism_peer_gid[ini->ism_selected]; +		lgr->peer_gid.gid = +			ini->ism_peer_gid[ini->ism_selected].gid; +		lgr->peer_gid.gid_ext = +			ini->ism_peer_gid[ini->ism_selected].gid_ext;  		lgr->smcd = ini->ism_dev[ini->ism_selected];  		lgr_list = &ini->ism_dev[ini->ism_selected]->lgr_list;  		lgr_lock = &lgr->smcd->lgr_lock; @@ -1514,7 +1524,8 @@ void smc_lgr_terminate_sched(struct smc_link_group *lgr)  }  /* Called when peer lgr shutdown (regularly or abnormally) is received */ -void smc_smcd_terminate(struct smcd_dev *dev, u64 peer_gid, unsigned short vlan) +void smc_smcd_terminate(struct smcd_dev *dev, struct smcd_gid *peer_gid, +			unsigned short vlan)  {  	struct smc_link_group *lgr, *l;  	LIST_HEAD(lgr_free_list); @@ -1522,9 +1533,12 @@ void smc_smcd_terminate(struct smcd_dev *dev, u64 peer_gid, unsigned short vlan)  	/* run common cleanup function and build free list */  	spin_lock_bh(&dev->lgr_lock);  	list_for_each_entry_safe(lgr, l, &dev->lgr_list, list) { -		if ((!peer_gid || lgr->peer_gid == peer_gid) && +		if ((!peer_gid->gid || +		     (lgr->peer_gid.gid == peer_gid->gid && +		      !smc_ism_is_virtual(dev) ? 1 : +		      lgr->peer_gid.gid_ext == peer_gid->gid_ext)) &&  		    (vlan == VLAN_VID_MASK || lgr->vlan_id == vlan)) { -			if (peer_gid) /* peer triggered termination */ +			if (peer_gid->gid) /* peer triggered termination */  				lgr->peer_shutdown = 1;  			list_move(&lgr->list, &lgr_free_list);  			lgr->freeing = 1; @@ -1860,9 +1874,12 @@ static bool smcr_lgr_match(struct smc_link_group *lgr, u8 smcr_version,  }  static bool smcd_lgr_match(struct smc_link_group *lgr, -			   struct smcd_dev *smcismdev, u64 peer_gid) +			   struct smcd_dev *smcismdev, +			   struct smcd_gid *peer_gid)  { -	return lgr->peer_gid == peer_gid && lgr->smcd == smcismdev; +	return lgr->peer_gid.gid == peer_gid->gid && lgr->smcd == smcismdev && +		smc_ism_is_virtual(smcismdev) ? +		(lgr->peer_gid.gid_ext == peer_gid->gid_ext) : 1;  }  /* create a new SMC connection (and a new link group if necessary) */ @@ -1892,7 +1909,7 @@ int smc_conn_create(struct smc_sock *smc, struct smc_init_info *ini)  		write_lock_bh(&lgr->conns_lock);  		if ((ini->is_smcd ?  		     smcd_lgr_match(lgr, ini->ism_dev[ini->ism_selected], -				    ini->ism_peer_gid[ini->ism_selected]) : +				    &ini->ism_peer_gid[ini->ism_selected]) :  		     smcr_lgr_match(lgr, ini->smcr_version,  				    ini->peer_systemid,  				    ini->peer_gid, ini->peer_mac, role,  | 
