diff options
Diffstat (limited to 'drivers/infiniband/ulp/ipoib/ipoib_multicast.c')
| -rw-r--r-- | drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 13 | 
1 files changed, 9 insertions, 4 deletions
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c index 1b7a9768635..873bff97e69 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c @@ -240,8 +240,11 @@ static int ipoib_mcast_join_finish(struct ipoib_mcast *mcast,  		av.grh.dgid = mcast->mcmember.mgid;  		ah = ipoib_create_ah(dev, priv->pd, &av); -		if (!ah) { -			ipoib_warn(priv, "ib_address_create failed\n"); +		if (IS_ERR(ah)) { +			ipoib_warn(priv, "ib_address_create failed %ld\n", +				-PTR_ERR(ah)); +			/* use original error */ +			return PTR_ERR(ah);  		} else {  			spin_lock_irq(&priv->lock);  			mcast->ah = ah; @@ -266,7 +269,7 @@ static int ipoib_mcast_join_finish(struct ipoib_mcast *mcast,  		skb->dev = dev;  		if (dst) -			n = dst_get_neighbour(dst); +			n = dst_get_neighbour_raw(dst);  		if (!dst || !n) {  			/* put pseudoheader back on for next time */  			skb_push(skb, sizeof (struct ipoib_pseudoheader)); @@ -722,6 +725,8 @@ out:  	if (mcast && mcast->ah) {  		struct dst_entry *dst = skb_dst(skb);  		struct neighbour *n = NULL; + +		rcu_read_lock();  		if (dst)  			n = dst_get_neighbour(dst);  		if (n && !*to_ipoib_neigh(n)) { @@ -734,7 +739,7 @@ out:  				list_add_tail(&neigh->list, &mcast->neigh_list);  			}  		} - +		rcu_read_unlock();  		spin_unlock_irqrestore(&priv->lock, flags);  		ipoib_send(dev, skb, mcast->ah, IB_MULTICAST_QPN);  		return;  |