diff options
| -rw-r--r-- | net/smc/smc_pnet.c | 43 | 
1 files changed, 22 insertions, 21 deletions
| diff --git a/net/smc/smc_pnet.c b/net/smc/smc_pnet.c index b90337f86e83..7225b5fa17a6 100644 --- a/net/smc/smc_pnet.c +++ b/net/smc/smc_pnet.c @@ -1126,37 +1126,38 @@ static void smc_pnet_find_ism_by_pnetid(struct net_device *ndev,   */  void smc_pnet_find_roce_resource(struct sock *sk, struct smc_init_info *ini)  { -	struct dst_entry *dst = sk_dst_get(sk); - -	if (!dst) -		goto out; -	if (!dst->dev) -		goto out_rel; +	struct net_device *dev; +	struct dst_entry *dst; -	smc_pnet_find_roce_by_pnetid(dst->dev, ini); +	rcu_read_lock(); +	dst = __sk_dst_get(sk); +	dev = dst ? dst_dev_rcu(dst) : NULL; +	dev_hold(dev); +	rcu_read_unlock(); -out_rel: -	dst_release(dst); -out: -	return; +	if (dev) { +		smc_pnet_find_roce_by_pnetid(dev, ini); +		dev_put(dev); +	}  }  void smc_pnet_find_ism_resource(struct sock *sk, struct smc_init_info *ini)  { -	struct dst_entry *dst = sk_dst_get(sk); +	struct net_device *dev; +	struct dst_entry *dst;  	ini->ism_dev[0] = NULL; -	if (!dst) -		goto out; -	if (!dst->dev) -		goto out_rel; -	smc_pnet_find_ism_by_pnetid(dst->dev, ini); +	rcu_read_lock(); +	dst = __sk_dst_get(sk); +	dev = dst ? dst_dev_rcu(dst) : NULL; +	dev_hold(dev); +	rcu_read_unlock(); -out_rel: -	dst_release(dst); -out: -	return; +	if (dev) { +		smc_pnet_find_ism_by_pnetid(dev, ini); +		dev_put(dev); +	}  }  /* Lookup and apply a pnet table entry to the given ib device. | 
