|
@@ -493,7 +493,6 @@ static void path_rec_completion(int status,
|
|
|
path,
|
|
|
neigh));
|
|
|
if (!ipoib_cm_get(neigh)) {
|
|
|
- list_del(&neigh->list);
|
|
|
ipoib_neigh_free(neigh);
|
|
|
continue;
|
|
|
}
|
|
@@ -618,7 +617,6 @@ static void neigh_add_path(struct sk_buff *skb, u8 *daddr,
|
|
|
if (!ipoib_cm_get(neigh))
|
|
|
ipoib_cm_set(neigh, ipoib_cm_create_tx(dev, path, neigh));
|
|
|
if (!ipoib_cm_get(neigh)) {
|
|
|
- list_del(&neigh->list);
|
|
|
ipoib_neigh_free(neigh);
|
|
|
goto err_drop;
|
|
|
}
|
|
@@ -639,7 +637,7 @@ static void neigh_add_path(struct sk_buff *skb, u8 *daddr,
|
|
|
neigh->ah = NULL;
|
|
|
|
|
|
if (!path->query && path_rec_start(dev, path))
|
|
|
- goto err_list;
|
|
|
+ goto err_path;
|
|
|
|
|
|
__skb_queue_tail(&neigh->queue, skb);
|
|
|
}
|
|
@@ -648,9 +646,6 @@ static void neigh_add_path(struct sk_buff *skb, u8 *daddr,
|
|
|
ipoib_neigh_put(neigh);
|
|
|
return;
|
|
|
|
|
|
-err_list:
|
|
|
- list_del(&neigh->list);
|
|
|
-
|
|
|
err_path:
|
|
|
ipoib_neigh_free(neigh);
|
|
|
err_drop:
|
|
@@ -1098,6 +1093,8 @@ void ipoib_neigh_free(struct ipoib_neigh *neigh)
|
|
|
rcu_assign_pointer(*np,
|
|
|
rcu_dereference_protected(neigh->hnext,
|
|
|
lockdep_is_held(&priv->lock)));
|
|
|
+ /* remove from parent list */
|
|
|
+ list_del(&neigh->list);
|
|
|
call_rcu(&neigh->rcu, ipoib_neigh_reclaim);
|
|
|
return;
|
|
|
} else {
|