Revert "[NDISC]: Fix race in generic address resolution"
This reverts commit 69cc64d8d9
.
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…
Reference in New Issue