From a00113980fed8f222fa00d0e0facd549f418ef18 Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Tue, 22 Jun 2010 07:43:15 +0000 Subject: [PATCH] --- yaml --- r: 203183 b: refs/heads/master c: 4b4194c40f4ac8d03a700845f8978cba53246b5a h: refs/heads/master i: 203181: 798027ab2ac0d14892c1b2f779a56415aaf1fe03 203179: 587bfa386b50dfc5db69778892870fbf61531cc0 203175: 63543dd54424d79c3e1fa0b9dcb4c2feda1c7e80 203167: 70a88e9f52e43da9dd65d8e7f05d69feb8d29407 v: v3 --- [refs] | 2 +- trunk/net/ipv4/arp.c | 12 +++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/[refs] b/[refs] index 90ad4fa98a1a..ddff7670a7df 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 59b80802a8a18b64d38b51aa168253684b2649d5 +refs/heads/master: 4b4194c40f4ac8d03a700845f8978cba53246b5a diff --git a/trunk/net/ipv4/arp.c b/trunk/net/ipv4/arp.c index cf78f41830ca..09ead1baa99e 100644 --- a/trunk/net/ipv4/arp.c +++ b/trunk/net/ipv4/arp.c @@ -333,11 +333,14 @@ static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb) struct net_device *dev = neigh->dev; __be32 target = *(__be32*)neigh->primary_key; int probes = atomic_read(&neigh->probes); - struct in_device *in_dev = in_dev_get(dev); + struct in_device *in_dev; - if (!in_dev) + rcu_read_lock(); + in_dev = __in_dev_get_rcu(dev); + if (!in_dev) { + rcu_read_unlock(); return; - + } switch (IN_DEV_ARP_ANNOUNCE(in_dev)) { default: case 0: /* By default announce any local IP */ @@ -358,9 +361,8 @@ static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb) case 2: /* Avoid secondary IPs, get a primary/preferred one */ break; } + rcu_read_unlock(); - if (in_dev) - in_dev_put(in_dev); if (!saddr) saddr = inet_select_addr(dev, target, RT_SCOPE_LINK);