icmp: RCU conversion in icmp_address_reply()
authorEric Dumazet <eric.dumazet@gmail.com>
Mon, 7 Jun 2010 22:34:35 +0000 (22:34 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 10 Jun 2010 01:06:13 +0000 (18:06 -0700)
- rcu_read_lock() already held by caller
- use __in_dev_get_rcu() instead of in_dev_get() / in_dev_put()
- remove goto out;

Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/icmp.c

index d65e9215bcd77c2b15d6facdc0d75a67310c68f2..bdb6c71e72a631e179fce4462c2cc407f5d1ee03 100644 (file)
@@ -925,6 +925,7 @@ static void icmp_address(struct sk_buff *skb)
 /*
  * RFC1812 (4.3.3.9).  A router SHOULD listen all replies, and complain
  *                     loudly if an inconsistency is found.
+ * called with rcu_read_lock()
  */
 
 static void icmp_address_reply(struct sk_buff *skb)
@@ -935,12 +936,12 @@ static void icmp_address_reply(struct sk_buff *skb)
        struct in_ifaddr *ifa;
 
        if (skb->len < 4 || !(rt->rt_flags&RTCF_DIRECTSRC))
-               goto out;
+               return;
 
-       in_dev = in_dev_get(dev);
+       in_dev = __in_dev_get_rcu(dev);
        if (!in_dev)
-               goto out;
-       rcu_read_lock();
+               return;
+
        if (in_dev->ifa_list &&
            IN_DEV_LOG_MARTIANS(in_dev) &&
            IN_DEV_FORWARD(in_dev)) {
@@ -958,9 +959,6 @@ static void icmp_address_reply(struct sk_buff *skb)
                               mp, dev->name, &rt->rt_src);
                }
        }
-       rcu_read_unlock();
-       in_dev_put(in_dev);
-out:;
 }
 
 static void icmp_discard(struct sk_buff *skb)