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 1b7a97686356..873bff97e69e 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, | |||
240 | av.grh.dgid = mcast->mcmember.mgid; | 240 | av.grh.dgid = mcast->mcmember.mgid; |
241 | 241 | ||
242 | ah = ipoib_create_ah(dev, priv->pd, &av); | 242 | ah = ipoib_create_ah(dev, priv->pd, &av); |
243 | if (!ah) { | 243 | if (IS_ERR(ah)) { |
244 | ipoib_warn(priv, "ib_address_create failed\n"); | 244 | ipoib_warn(priv, "ib_address_create failed %ld\n", |
245 | -PTR_ERR(ah)); | ||
246 | /* use original error */ | ||
247 | return PTR_ERR(ah); | ||
245 | } else { | 248 | } else { |
246 | spin_lock_irq(&priv->lock); | 249 | spin_lock_irq(&priv->lock); |
247 | mcast->ah = ah; | 250 | mcast->ah = ah; |
@@ -266,7 +269,7 @@ static int ipoib_mcast_join_finish(struct ipoib_mcast *mcast, | |||
266 | 269 | ||
267 | skb->dev = dev; | 270 | skb->dev = dev; |
268 | if (dst) | 271 | if (dst) |
269 | n = dst_get_neighbour(dst); | 272 | n = dst_get_neighbour_raw(dst); |
270 | if (!dst || !n) { | 273 | if (!dst || !n) { |
271 | /* put pseudoheader back on for next time */ | 274 | /* put pseudoheader back on for next time */ |
272 | skb_push(skb, sizeof (struct ipoib_pseudoheader)); | 275 | skb_push(skb, sizeof (struct ipoib_pseudoheader)); |
@@ -722,6 +725,8 @@ out: | |||
722 | if (mcast && mcast->ah) { | 725 | if (mcast && mcast->ah) { |
723 | struct dst_entry *dst = skb_dst(skb); | 726 | struct dst_entry *dst = skb_dst(skb); |
724 | struct neighbour *n = NULL; | 727 | struct neighbour *n = NULL; |
728 | |||
729 | rcu_read_lock(); | ||
725 | if (dst) | 730 | if (dst) |
726 | n = dst_get_neighbour(dst); | 731 | n = dst_get_neighbour(dst); |
727 | if (n && !*to_ipoib_neigh(n)) { | 732 | if (n && !*to_ipoib_neigh(n)) { |
@@ -734,7 +739,7 @@ out: | |||
734 | list_add_tail(&neigh->list, &mcast->neigh_list); | 739 | list_add_tail(&neigh->list, &mcast->neigh_list); |
735 | } | 740 | } |
736 | } | 741 | } |
737 | 742 | rcu_read_unlock(); | |
738 | spin_unlock_irqrestore(&priv->lock, flags); | 743 | spin_unlock_irqrestore(&priv->lock, flags); |
739 | ipoib_send(dev, skb, mcast->ah, IB_MULTICAST_QPN); | 744 | ipoib_send(dev, skb, mcast->ah, IB_MULTICAST_QPN); |
740 | return; | 745 | return; |