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>
This commit is contained in:
parent
93b2d4a208
commit
9ff5660746
@ -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);
|
||||
|
@ -368,6 +368,7 @@ static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb)
|
||||
if (!(neigh->nud_state&NUD_VALID))
|
||||
printk(KERN_DEBUG "trying to ucast probe in NUD_INVALID\n");
|
||||
dst_ha = neigh->ha;
|
||||
read_lock_bh(&neigh->lock);
|
||||
} else if ((probes -= neigh->parms->app_probes) < 0) {
|
||||
#ifdef CONFIG_ARPD
|
||||
neigh_app_ns(neigh);
|
||||
@ -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,
|
||||
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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user