ipv4: Make output route lookup return rtable directly.
[pandora-kernel.git] / net / ipv4 / arp.c
index 04c8b69..fa9988d 100644 (file)
@@ -440,7 +440,8 @@ static int arp_filter(__be32 sip, __be32 tip, struct net_device *dev)
        /*unsigned long now; */
        struct net *net = dev_net(dev);
 
-       if (ip_route_output_key(net, &rt, &fl) < 0)
+       rt = ip_route_output_key(net, &fl);
+       if (IS_ERR(rt))
                return 1;
        if (rt->dst.dev != dev) {
                NET_INC_STATS_BH(net, LINUX_MIB_ARPFILTER);
@@ -1017,14 +1018,13 @@ static int arp_req_set_proxy(struct net *net, struct net_device *dev, int on)
                IPV4_DEVCONF_ALL(net, PROXY_ARP) = on;
                return 0;
        }
-       if (__in_dev_get_rcu(dev)) {
-               IN_DEV_CONF_SET(__in_dev_get_rcu(dev), PROXY_ARP, on);
+       if (__in_dev_get_rtnl(dev)) {
+               IN_DEV_CONF_SET(__in_dev_get_rtnl(dev), PROXY_ARP, on);
                return 0;
        }
        return -ENXIO;
 }
 
-/* must be called with rcu_read_lock() */
 static int arp_req_set_public(struct net *net, struct arpreq *r,
                struct net_device *dev)
 {
@@ -1064,10 +1064,10 @@ static int arp_req_set(struct net *net, struct arpreq *r,
        if (dev == NULL) {
                struct flowi fl = { .fl4_dst = ip,
                                    .fl4_tos = RTO_ONLINK };
-               struct rtable *rt;
-               err = ip_route_output_key(net, &rt, &fl);
-               if (err != 0)
-                       return err;
+               struct rtable *rt = ip_route_output_key(net, &fl);
+
+               if (IS_ERR(rt))
+                       return PTR_ERR(rt);
                dev = rt->dst.dev;
                ip_rt_put(rt);
                if (!dev)
@@ -1178,7 +1178,6 @@ static int arp_req_delete_public(struct net *net, struct arpreq *r,
 static int arp_req_delete(struct net *net, struct arpreq *r,
                          struct net_device *dev)
 {
-       int err;
        __be32 ip;
 
        if (r->arp_flags & ATF_PUBL)
@@ -1188,10 +1187,9 @@ static int arp_req_delete(struct net *net, struct arpreq *r,
        if (dev == NULL) {
                struct flowi fl = { .fl4_dst = ip,
                                    .fl4_tos = RTO_ONLINK };
-               struct rtable *rt;
-               err = ip_route_output_key(net, &rt, &fl);
-               if (err != 0)
-                       return err;
+               struct rtable *rt = ip_route_output_key(net, &fl);
+               if (IS_ERR(rt))
+                       return PTR_ERR(rt);
                dev = rt->dst.dev;
                ip_rt_put(rt);
                if (!dev)
@@ -1233,10 +1231,10 @@ int arp_ioctl(struct net *net, unsigned int cmd, void __user *arg)
        if (!(r.arp_flags & ATF_NETMASK))
                ((struct sockaddr_in *)&r.arp_netmask)->sin_addr.s_addr =
                                                           htonl(0xFFFFFFFFUL);
-       rcu_read_lock();
+       rtnl_lock();
        if (r.arp_dev[0]) {
                err = -ENODEV;
-               dev = dev_get_by_name_rcu(net, r.arp_dev);
+               dev = __dev_get_by_name(net, r.arp_dev);
                if (dev == NULL)
                        goto out;
 
@@ -1263,7 +1261,7 @@ int arp_ioctl(struct net *net, unsigned int cmd, void __user *arg)
                break;
        }
 out:
-       rcu_read_unlock();
+       rtnl_unlock();
        if (cmd == SIOCGARP && !err && copy_to_user(arg, &r, sizeof(r)))
                err = -EFAULT;
        return err;