diff options
author | David S. Miller <davem@davemloft.net> | 2008-02-17 18:39:54 -0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-02-17 18:39:54 -0800 |
commit | 9ff566074689e3aed1488780b97714ec43ba361d (patch) | |
tree | 10bfc8ab214696ba08e5e25018d24c3de8018801 /net/core | |
parent | 93b2d4a208eeb19bff95e98c34503ce4b03cd0f9 (diff) | |
download | op-kernel-dev-9ff566074689e3aed1488780b97714ec43ba361d.zip op-kernel-dev-9ff566074689e3aed1488780b97714ec43ba361d.tar.gz |
Revert "[NDISC]: Fix race in generic address resolution"
This reverts commit 69cc64d8d92bf852f933e90c888dfff083bd4fc9.
It causes recursive locking in IPV6 because unlike other
neighbour layer clients, it even needs neighbour cache
entries to send neighbour soliciation messages :-(
We'll have to find another way to fix this race.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core')
-rw-r--r-- | net/core/neighbour.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/net/core/neighbour.c b/net/core/neighbour.c index 7bb6a9a..a16cf1e 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c @@ -834,12 +834,18 @@ static void neigh_timer_handler(unsigned long arg) } if (neigh->nud_state & (NUD_INCOMPLETE | NUD_PROBE)) { struct sk_buff *skb = skb_peek(&neigh->arp_queue); - + /* keep skb alive even if arp_queue overflows */ + if (skb) + skb_get(skb); + write_unlock(&neigh->lock); neigh->ops->solicit(neigh, skb); atomic_inc(&neigh->probes); - } + if (skb) + kfree_skb(skb); + } else { out: - write_unlock(&neigh->lock); + write_unlock(&neigh->lock); + } if (notify) neigh_update_notify(neigh); |