diff options
author | Florian Westphal <fw@strlen.de> | 2017-12-02 15:44:08 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-12-04 11:32:53 -0500 |
commit | 16feebcf2350aa369001a529f50ce33f2472c01c (patch) | |
tree | dadfbed703d39870e77cd6625453c5c8126f9962 | |
parent | c1c502b511503ee5de55382744859b622411f32b (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.h | 2 | ||||
-rw-r--r-- | net/core/rtnetlink.c | 33 | ||||
-rw-r--r-- | net/ipv6/addrconf.c | 44 | ||||
-rw-r--r-- | net/ipv6/addrlabel.c | 13 | ||||
-rw-r--r-- | net/ipv6/ip6_fib.c | 4 | ||||
-rw-r--r-- | net/ipv6/route.c | 20 |
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 | ||
16 | int __rtnl_register(int protocol, int msgtype, | ||
17 | rtnl_doit_func, rtnl_dumpit_func, unsigned int flags); | ||
18 | void rtnl_register(int protocol, int msgtype, | 16 | void 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); |
20 | int rtnl_register_module(struct module *owner, int protocol, int msgtype, | 18 | int 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, | |||
238 | EXPORT_SYMBOL_GPL(rtnl_register_module); | 238 | EXPORT_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 | */ | ||
258 | int __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 | } | ||
265 | EXPORT_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 | */ |
276 | void rtnl_register(int protocol, int msgtype, | 256 | void 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 | } |
285 | EXPORT_SYMBOL_GPL(rtnl_register); | 268 | EXPORT_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; |
6618 | errout: | 6633 | errout: |
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); |
6621 | errlo: | 6637 | errlo: |
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 | ||
550 | void __init ipv6_addr_label_rtnl_register(void) | 550 | void __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 | ||
4796 | out_register_late_subsys: | 4805 | out_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); |
4798 | fib6_rules_init: | 4808 | fib6_rules_init: |
4799 | fib6_rules_cleanup(); | 4809 | fib6_rules_cleanup(); |