summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorian Westphal <fw@strlen.de>2017-12-02 15:44:08 -0500
committerDavid S. Miller <davem@davemloft.net>2017-12-04 11:32:53 -0500
commit16feebcf2350aa369001a529f50ce33f2472c01c (patch)
treedadfbed703d39870e77cd6625453c5c8126f9962
parentc1c502b511503ee5de55382744859b622411f32b (diff)
rtnetlink: remove __rtnl_register
This removes __rtnl_register and switches callers to either rtnl_register or rtnl_register_module. Also, rtnl_register() will now print an error if memory allocation failed rather than panic the kernel. Signed-off-by: Florian Westphal <fw@strlen.de> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--include/net/rtnetlink.h2
-rw-r--r--net/core/rtnetlink.c33
-rw-r--r--net/ipv6/addrconf.c44
-rw-r--r--net/ipv6/addrlabel.c13
-rw-r--r--net/ipv6/ip6_fib.c4
-rw-r--r--net/ipv6/route.c20
6 files changed, 61 insertions, 55 deletions
diff --git a/include/net/rtnetlink.h b/include/net/rtnetlink.h
index e326b3f9eb5f..14b6b3af8918 100644
--- a/include/net/rtnetlink.h
+++ b/include/net/rtnetlink.h
@@ -13,8 +13,6 @@ enum rtnl_link_flags {
13 RTNL_FLAG_DOIT_UNLOCKED = 1, 13 RTNL_FLAG_DOIT_UNLOCKED = 1,
14}; 14};
15 15
16int __rtnl_register(int protocol, int msgtype,
17 rtnl_doit_func, rtnl_dumpit_func, unsigned int flags);
18void rtnl_register(int protocol, int msgtype, 16void rtnl_register(int protocol, int msgtype,
19 rtnl_doit_func, rtnl_dumpit_func, unsigned int flags); 17 rtnl_doit_func, rtnl_dumpit_func, unsigned int flags);
20int rtnl_register_module(struct module *owner, int protocol, int msgtype, 18int rtnl_register_module(struct module *owner, int protocol, int msgtype,
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index de6390365c90..fb2d61df1e2f 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -238,7 +238,7 @@ int rtnl_register_module(struct module *owner,
238EXPORT_SYMBOL_GPL(rtnl_register_module); 238EXPORT_SYMBOL_GPL(rtnl_register_module);
239 239
240/** 240/**
241 * __rtnl_register - Register a rtnetlink message type 241 * rtnl_register - Register a rtnetlink message type
242 * @protocol: Protocol family or PF_UNSPEC 242 * @protocol: Protocol family or PF_UNSPEC
243 * @msgtype: rtnetlink message type 243 * @msgtype: rtnetlink message type
244 * @doit: Function pointer called for each request message 244 * @doit: Function pointer called for each request message
@@ -252,35 +252,18 @@ EXPORT_SYMBOL_GPL(rtnl_register_module);
252 * The special protocol family PF_UNSPEC may be used to define fallback 252 * The special protocol family PF_UNSPEC may be used to define fallback
253 * function pointers for the case when no entry for the specific protocol 253 * function pointers for the case when no entry for the specific protocol
254 * family exists. 254 * family exists.
255 *
256 * Returns 0 on success or a negative error code.
257 */
258int __rtnl_register(int protocol, int msgtype,
259 rtnl_doit_func doit, rtnl_dumpit_func dumpit,
260 unsigned int flags)
261{
262 return rtnl_register_internal(NULL, protocol, msgtype,
263 doit, dumpit, flags);
264}
265EXPORT_SYMBOL_GPL(__rtnl_register);
266
267/**
268 * rtnl_register - Register a rtnetlink message type
269 *
270 * Identical to __rtnl_register() but panics on failure. This is useful
271 * as failure of this function is very unlikely, it can only happen due
272 * to lack of memory when allocating the chain to store all message
273 * handlers for a protocol. Meant for use in init functions where lack
274 * of memory implies no sense in continuing.
275 */ 255 */
276void rtnl_register(int protocol, int msgtype, 256void rtnl_register(int protocol, int msgtype,
277 rtnl_doit_func doit, rtnl_dumpit_func dumpit, 257 rtnl_doit_func doit, rtnl_dumpit_func dumpit,
278 unsigned int flags) 258 unsigned int flags)
279{ 259{
280 if (__rtnl_register(protocol, msgtype, doit, dumpit, flags) < 0) 260 int err;
281 panic("Unable to register rtnetlink message handler, " 261
282 "protocol = %d, message type = %d\n", 262 err = rtnl_register_internal(NULL, protocol, msgtype, doit, dumpit,
283 protocol, msgtype); 263 flags);
264 if (err)
265 pr_err("Unable to register rtnetlink message handler, "
266 "protocol = %d, message type = %d\n", protocol, msgtype);
284} 267}
285EXPORT_SYMBOL_GPL(rtnl_register); 268EXPORT_SYMBOL_GPL(rtnl_register);
286 269
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index f49bd7897e95..a5ad8425551a 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -6595,27 +6595,43 @@ int __init addrconf_init(void)
6595 6595
6596 rtnl_af_register(&inet6_ops); 6596 rtnl_af_register(&inet6_ops);
6597 6597
6598 err = __rtnl_register(PF_INET6, RTM_GETLINK, NULL, inet6_dump_ifinfo, 6598 err = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_GETLINK,
6599 0); 6599 NULL, inet6_dump_ifinfo, 0);
6600 if (err < 0) 6600 if (err < 0)
6601 goto errout; 6601 goto errout;
6602 6602
6603 /* Only the first call to __rtnl_register can fail */ 6603 err = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_NEWADDR,
6604 __rtnl_register(PF_INET6, RTM_NEWADDR, inet6_rtm_newaddr, NULL, 0); 6604 inet6_rtm_newaddr, NULL, 0);
6605 __rtnl_register(PF_INET6, RTM_DELADDR, inet6_rtm_deladdr, NULL, 0); 6605 if (err < 0)
6606 __rtnl_register(PF_INET6, RTM_GETADDR, inet6_rtm_getaddr, 6606 goto errout;
6607 inet6_dump_ifaddr, RTNL_FLAG_DOIT_UNLOCKED); 6607 err = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_DELADDR,
6608 __rtnl_register(PF_INET6, RTM_GETMULTICAST, NULL, 6608 inet6_rtm_deladdr, NULL, 0);
6609 inet6_dump_ifmcaddr, 0); 6609 if (err < 0)
6610 __rtnl_register(PF_INET6, RTM_GETANYCAST, NULL, 6610 goto errout;
6611 inet6_dump_ifacaddr, 0); 6611 err = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_GETADDR,
6612 __rtnl_register(PF_INET6, RTM_GETNETCONF, inet6_netconf_get_devconf, 6612 inet6_rtm_getaddr, inet6_dump_ifaddr,
6613 inet6_netconf_dump_devconf, RTNL_FLAG_DOIT_UNLOCKED); 6613 RTNL_FLAG_DOIT_UNLOCKED);
6614 6614 if (err < 0)
6615 goto errout;
6616 err = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_GETMULTICAST,
6617 NULL, inet6_dump_ifmcaddr, 0);
6618 if (err < 0)
6619 goto errout;
6620 err = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_GETANYCAST,
6621 NULL, inet6_dump_ifacaddr, 0);
6622 if (err < 0)
6623 goto errout;
6624 err = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_GETNETCONF,
6625 inet6_netconf_get_devconf,
6626 inet6_netconf_dump_devconf,
6627 RTNL_FLAG_DOIT_UNLOCKED);
6628 if (err < 0)
6629 goto errout;
6615 ipv6_addr_label_rtnl_register(); 6630 ipv6_addr_label_rtnl_register();
6616 6631
6617 return 0; 6632 return 0;
6618errout: 6633errout:
6634 rtnl_unregister_all(PF_INET6);
6619 rtnl_af_unregister(&inet6_ops); 6635 rtnl_af_unregister(&inet6_ops);
6620 unregister_netdevice_notifier(&ipv6_dev_notf); 6636 unregister_netdevice_notifier(&ipv6_dev_notf);
6621errlo: 6637errlo:
diff --git a/net/ipv6/addrlabel.c b/net/ipv6/addrlabel.c
index 00e1f8ee08f8..303fcce5beef 100644
--- a/net/ipv6/addrlabel.c
+++ b/net/ipv6/addrlabel.c
@@ -549,11 +549,10 @@ static int ip6addrlbl_get(struct sk_buff *in_skb, struct nlmsghdr *nlh,
549 549
550void __init ipv6_addr_label_rtnl_register(void) 550void __init ipv6_addr_label_rtnl_register(void)
551{ 551{
552 __rtnl_register(PF_INET6, RTM_NEWADDRLABEL, ip6addrlbl_newdel, 552 rtnl_register(PF_INET6, RTM_NEWADDRLABEL, ip6addrlbl_newdel,
553 NULL, RTNL_FLAG_DOIT_UNLOCKED); 553 NULL, RTNL_FLAG_DOIT_UNLOCKED);
554 __rtnl_register(PF_INET6, RTM_DELADDRLABEL, ip6addrlbl_newdel, 554 rtnl_register(PF_INET6, RTM_DELADDRLABEL, ip6addrlbl_newdel,
555 NULL, RTNL_FLAG_DOIT_UNLOCKED); 555 NULL, RTNL_FLAG_DOIT_UNLOCKED);
556 __rtnl_register(PF_INET6, RTM_GETADDRLABEL, ip6addrlbl_get, 556 rtnl_register(PF_INET6, RTM_GETADDRLABEL, ip6addrlbl_get,
557 ip6addrlbl_dump, RTNL_FLAG_DOIT_UNLOCKED); 557 ip6addrlbl_dump, RTNL_FLAG_DOIT_UNLOCKED);
558} 558}
559
diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c
index c43cbaedfa35..a64d559fa513 100644
--- a/net/ipv6/ip6_fib.c
+++ b/net/ipv6/ip6_fib.c
@@ -2142,8 +2142,8 @@ int __init fib6_init(void)
2142 if (ret) 2142 if (ret)
2143 goto out_kmem_cache_create; 2143 goto out_kmem_cache_create;
2144 2144
2145 ret = __rtnl_register(PF_INET6, RTM_GETROUTE, NULL, inet6_dump_fib, 2145 ret = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_GETROUTE, NULL,
2146 0); 2146 inet6_dump_fib, 0);
2147 if (ret) 2147 if (ret)
2148 goto out_unregister_subsys; 2148 goto out_unregister_subsys;
2149 2149
diff --git a/net/ipv6/route.c b/net/ipv6/route.c
index 46fd53b268da..b3f4d19b3ca5 100644
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c
@@ -4772,11 +4772,20 @@ int __init ip6_route_init(void)
4772 if (ret) 4772 if (ret)
4773 goto fib6_rules_init; 4773 goto fib6_rules_init;
4774 4774
4775 ret = -ENOBUFS; 4775 ret = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_NEWROUTE,
4776 if (__rtnl_register(PF_INET6, RTM_NEWROUTE, inet6_rtm_newroute, NULL, 0) || 4776 inet6_rtm_newroute, NULL, 0);
4777 __rtnl_register(PF_INET6, RTM_DELROUTE, inet6_rtm_delroute, NULL, 0) || 4777 if (ret < 0)
4778 __rtnl_register(PF_INET6, RTM_GETROUTE, inet6_rtm_getroute, NULL, 4778 goto out_register_late_subsys;
4779 RTNL_FLAG_DOIT_UNLOCKED)) 4779
4780 ret = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_DELROUTE,
4781 inet6_rtm_delroute, NULL, 0);
4782 if (ret < 0)
4783 goto out_register_late_subsys;
4784
4785 ret = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_GETROUTE,
4786 inet6_rtm_getroute, NULL,
4787 RTNL_FLAG_DOIT_UNLOCKED);
4788 if (ret < 0)
4780 goto out_register_late_subsys; 4789 goto out_register_late_subsys;
4781 4790
4782 ret = register_netdevice_notifier(&ip6_route_dev_notifier); 4791 ret = register_netdevice_notifier(&ip6_route_dev_notifier);
@@ -4794,6 +4803,7 @@ out:
4794 return ret; 4803 return ret;
4795 4804
4796out_register_late_subsys: 4805out_register_late_subsys:
4806 rtnl_unregister_all(PF_INET6);
4797 unregister_pernet_subsys(&ip6_route_net_late_ops); 4807 unregister_pernet_subsys(&ip6_route_net_late_ops);
4798fib6_rules_init: 4808fib6_rules_init:
4799 fib6_rules_cleanup(); 4809 fib6_rules_cleanup();