]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - net/ipv6/route.c
[NETFILTER]: Kill some supper dupper bloatry
[linux-2.6-omap-h63xx.git] / net / ipv6 / route.c
index 452111fa4c5242340367a53fb615db501a0a951f..b80ef578420727e1208bf811a9081a3933aed05c 100644 (file)
@@ -609,7 +609,8 @@ static int __ip6_ins_rt(struct rt6_info *rt, struct nl_info *info)
 
 int ip6_ins_rt(struct rt6_info *rt)
 {
-       return __ip6_ins_rt(rt, NULL);
+       struct nl_info info = {};
+       return __ip6_ins_rt(rt, &info);
 }
 
 static struct rt6_info *rt6_alloc_cow(struct rt6_info *ort, struct in6_addr *daddr,
@@ -1266,7 +1267,8 @@ static int __ip6_del_rt(struct rt6_info *rt, struct nl_info *info)
 
 int ip6_del_rt(struct rt6_info *rt)
 {
-       return __ip6_del_rt(rt, NULL);
+       struct nl_info info = {};
+       return __ip6_del_rt(rt, &info);
 }
 
 static int ip6_route_del(struct fib6_config *cfg)
@@ -2243,29 +2245,26 @@ errout:
 void inet6_rt_notify(int event, struct rt6_info *rt, struct nl_info *info)
 {
        struct sk_buff *skb;
-       u32 pid = 0, seq = 0;
-       struct nlmsghdr *nlh = NULL;
-       int err = -ENOBUFS;
-
-       if (info) {
-               pid = info->pid;
-               nlh = info->nlh;
-               if (nlh)
-                       seq = nlh->nlmsg_seq;
-       }
+       u32 seq;
+       int err;
+
+       err = -ENOBUFS;
+       seq = info->nlh != NULL ? info->nlh->nlmsg_seq : 0;
 
        skb = nlmsg_new(rt6_nlmsg_size(), gfp_any());
        if (skb == NULL)
                goto errout;
 
-       err = rt6_fill_node(skb, rt, NULL, NULL, 0, event, pid, seq, 0, 0);
+       err = rt6_fill_node(skb, rt, NULL, NULL, 0,
+                               event, info->pid, seq, 0, 0);
        if (err < 0) {
                /* -EMSGSIZE implies BUG in rt6_nlmsg_size() */
                WARN_ON(err == -EMSGSIZE);
                kfree_skb(skb);
                goto errout;
        }
-       err = rtnl_notify(skb, &init_net, pid, RTNLGRP_IPV6_ROUTE, nlh, gfp_any());
+       err = rtnl_notify(skb, &init_net, info->pid,
+                               RTNLGRP_IPV6_ROUTE, info->nlh, gfp_any());
 errout:
        if (err < 0)
                rtnl_set_sk_err(&init_net, RTNLGRP_IPV6_ROUTE, err);
@@ -2358,6 +2357,40 @@ static const struct file_operations rt6_stats_seq_fops = {
        .llseek  = seq_lseek,
        .release = single_release,
 };
+
+static int ipv6_route_proc_init(struct net *net)
+{
+       int ret = -ENOMEM;
+       if (!proc_net_fops_create(net, "ipv6_route",
+                                 0, &ipv6_route_proc_fops))
+               goto out;
+
+       if (!proc_net_fops_create(net, "rt6_stats",
+                                 S_IRUGO, &rt6_stats_seq_fops))
+               goto out_ipv6_route;
+
+       ret = 0;
+out:
+       return ret;
+out_ipv6_route:
+       proc_net_remove(net, "ipv6_route");
+       goto out;
+}
+
+static void ipv6_route_proc_fini(struct net *net)
+{
+       proc_net_remove(net, "ipv6_route");
+       proc_net_remove(net, "rt6_stats");
+}
+#else
+static inline int ipv6_route_proc_init(struct net *net)
+{
+       return 0;
+}
+static inline void ipv6_route_proc_fini(struct net *net)
+{
+       return ;
+}
 #endif /* CONFIG_PROC_FS */
 
 #ifdef CONFIG_SYSCTL
@@ -2468,40 +2501,63 @@ ctl_table ipv6_route_table[] = {
 
 #endif
 
-void __init ip6_route_init(void)
+int __init ip6_route_init(void)
 {
+       int ret;
+
        ip6_dst_ops.kmem_cachep =
                kmem_cache_create("ip6_dst_cache", sizeof(struct rt6_info), 0,
-                                 SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL);
+                                 SLAB_HWCACHE_ALIGN, NULL);
+       if (!ip6_dst_ops.kmem_cachep)
+               return -ENOMEM;
+
        ip6_dst_blackhole_ops.kmem_cachep = ip6_dst_ops.kmem_cachep;
 
-       fib6_init();
-       proc_net_fops_create(&init_net, "ipv6_route", 0, &ipv6_route_proc_fops);
-       proc_net_fops_create(&init_net, "rt6_stats", S_IRUGO, &rt6_stats_seq_fops);
-#ifdef CONFIG_XFRM
-       xfrm6_init();
-#endif
-#ifdef CONFIG_IPV6_MULTIPLE_TABLES
-       fib6_rules_init();
-#endif
+       ret = fib6_init();
+       if (ret)
+               goto out_kmem_cache;
+
+       ret = ipv6_route_proc_init(&init_net);
+       if (ret)
+               goto out_fib6_init;
+
+       ret = xfrm6_init();
+       if (ret)
+               goto out_proc_init;
+
+       ret = fib6_rules_init();
+       if (ret)
+               goto xfrm6_init;
+
+       ret = -ENOBUFS;
+       if (__rtnl_register(PF_INET6, RTM_NEWROUTE, inet6_rtm_newroute, NULL) ||
+           __rtnl_register(PF_INET6, RTM_DELROUTE, inet6_rtm_delroute, NULL) ||
+           __rtnl_register(PF_INET6, RTM_GETROUTE, inet6_rtm_getroute, NULL))
+               goto fib6_rules_init;
+
+       ret = 0;
+out:
+       return ret;
 
-       __rtnl_register(PF_INET6, RTM_NEWROUTE, inet6_rtm_newroute, NULL);
-       __rtnl_register(PF_INET6, RTM_DELROUTE, inet6_rtm_delroute, NULL);
-       __rtnl_register(PF_INET6, RTM_GETROUTE, inet6_rtm_getroute, NULL);
+fib6_rules_init:
+       fib6_rules_cleanup();
+xfrm6_init:
+       xfrm6_fini();
+out_proc_init:
+       ipv6_route_proc_fini(&init_net);
+out_fib6_init:
+       rt6_ifdown(NULL);
+       fib6_gc_cleanup();
+out_kmem_cache:
+       kmem_cache_destroy(ip6_dst_ops.kmem_cachep);
+       goto out;
 }
 
 void ip6_route_cleanup(void)
 {
-#ifdef CONFIG_IPV6_MULTIPLE_TABLES
        fib6_rules_cleanup();
-#endif
-#ifdef CONFIG_PROC_FS
-       proc_net_remove(&init_net, "ipv6_route");
-       proc_net_remove(&init_net, "rt6_stats");
-#endif
-#ifdef CONFIG_XFRM
+       ipv6_route_proc_fini(&init_net);
        xfrm6_fini();
-#endif
        rt6_ifdown(NULL);
        fib6_gc_cleanup();
        kmem_cache_destroy(ip6_dst_ops.kmem_cachep);