diff options
-rw-r--r-- | net/core/neighbour.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/net/core/neighbour.c b/net/core/neighbour.c index 43449649cf73..909ecb3c2a33 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c | |||
@@ -1168,10 +1168,14 @@ int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new, | |||
1168 | struct dst_entry *dst = skb_dst(skb); | 1168 | struct dst_entry *dst = skb_dst(skb); |
1169 | struct neighbour *n2, *n1 = neigh; | 1169 | struct neighbour *n2, *n1 = neigh; |
1170 | write_unlock_bh(&neigh->lock); | 1170 | write_unlock_bh(&neigh->lock); |
1171 | |||
1172 | rcu_read_lock(); | ||
1171 | /* On shaper/eql skb->dst->neighbour != neigh :( */ | 1173 | /* On shaper/eql skb->dst->neighbour != neigh :( */ |
1172 | if (dst && (n2 = dst_get_neighbour(dst)) != NULL) | 1174 | if (dst && (n2 = dst_get_neighbour(dst)) != NULL) |
1173 | n1 = n2; | 1175 | n1 = n2; |
1174 | n1->output(n1, skb); | 1176 | n1->output(n1, skb); |
1177 | rcu_read_unlock(); | ||
1178 | |||
1175 | write_lock_bh(&neigh->lock); | 1179 | write_lock_bh(&neigh->lock); |
1176 | } | 1180 | } |
1177 | skb_queue_purge(&neigh->arp_queue); | 1181 | skb_queue_purge(&neigh->arp_queue); |