Commit 9ff56607 authored by David S. Miller's avatar David S. Miller

Revert "[NDISC]: Fix race in generic address resolution"

This reverts commit 69cc64d8.

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: default avatarDavid S. Miller <davem@davemloft.net>
parent 93b2d4a2
...@@ -834,12 +834,18 @@ static void neigh_timer_handler(unsigned long arg) ...@@ -834,12 +834,18 @@ static void neigh_timer_handler(unsigned long arg)
} }
if (neigh->nud_state & (NUD_INCOMPLETE | NUD_PROBE)) { if (neigh->nud_state & (NUD_INCOMPLETE | NUD_PROBE)) {
struct sk_buff *skb = skb_peek(&neigh->arp_queue); 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); neigh->ops->solicit(neigh, skb);
atomic_inc(&neigh->probes); atomic_inc(&neigh->probes);
} if (skb)
kfree_skb(skb);
} else {
out: out:
write_unlock(&neigh->lock); write_unlock(&neigh->lock);
}
if (notify) if (notify)
neigh_update_notify(neigh); neigh_update_notify(neigh);
......
...@@ -368,6 +368,7 @@ static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb) ...@@ -368,6 +368,7 @@ static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb)
if (!(neigh->nud_state&NUD_VALID)) if (!(neigh->nud_state&NUD_VALID))
printk(KERN_DEBUG "trying to ucast probe in NUD_INVALID\n"); printk(KERN_DEBUG "trying to ucast probe in NUD_INVALID\n");
dst_ha = neigh->ha; dst_ha = neigh->ha;
read_lock_bh(&neigh->lock);
} else if ((probes -= neigh->parms->app_probes) < 0) { } else if ((probes -= neigh->parms->app_probes) < 0) {
#ifdef CONFIG_ARPD #ifdef CONFIG_ARPD
neigh_app_ns(neigh); neigh_app_ns(neigh);
...@@ -377,6 +378,8 @@ static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb) ...@@ -377,6 +378,8 @@ static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb)
arp_send(ARPOP_REQUEST, ETH_P_ARP, target, dev, saddr, arp_send(ARPOP_REQUEST, ETH_P_ARP, target, dev, saddr,
dst_ha, dev->dev_addr, NULL); dst_ha, dev->dev_addr, NULL);
if (dst_ha)
read_unlock_bh(&neigh->lock);
} }
static int arp_ignore(struct in_device *in_dev, __be32 sip, __be32 tip) static int arp_ignore(struct in_device *in_dev, __be32 sip, __be32 tip)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment