Commit 16feebcf authored by Florian Westphal's avatar Florian Westphal Committed by David S. Miller

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: default avatarFlorian Westphal <fw@strlen.de>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent c1c502b5
...@@ -13,8 +13,6 @@ enum rtnl_link_flags { ...@@ -13,8 +13,6 @@ enum rtnl_link_flags {
RTNL_FLAG_DOIT_UNLOCKED = 1, RTNL_FLAG_DOIT_UNLOCKED = 1,
}; };
int __rtnl_register(int protocol, int msgtype,
rtnl_doit_func, rtnl_dumpit_func, unsigned int flags);
void rtnl_register(int protocol, int msgtype, void rtnl_register(int protocol, int msgtype,
rtnl_doit_func, rtnl_dumpit_func, unsigned int flags); rtnl_doit_func, rtnl_dumpit_func, unsigned int flags);
int rtnl_register_module(struct module *owner, int protocol, int msgtype, int rtnl_register_module(struct module *owner, int protocol, int msgtype,
......
...@@ -238,7 +238,7 @@ int rtnl_register_module(struct module *owner, ...@@ -238,7 +238,7 @@ int rtnl_register_module(struct module *owner,
EXPORT_SYMBOL_GPL(rtnl_register_module); EXPORT_SYMBOL_GPL(rtnl_register_module);
/** /**
* __rtnl_register - Register a rtnetlink message type * rtnl_register - Register a rtnetlink message type
* @protocol: Protocol family or PF_UNSPEC * @protocol: Protocol family or PF_UNSPEC
* @msgtype: rtnetlink message type * @msgtype: rtnetlink message type
* @doit: Function pointer called for each request message * @doit: Function pointer called for each request message
...@@ -252,35 +252,18 @@ EXPORT_SYMBOL_GPL(rtnl_register_module); ...@@ -252,35 +252,18 @@ EXPORT_SYMBOL_GPL(rtnl_register_module);
* The special protocol family PF_UNSPEC may be used to define fallback * The special protocol family PF_UNSPEC may be used to define fallback
* function pointers for the case when no entry for the specific protocol * function pointers for the case when no entry for the specific protocol
* family exists. * family exists.
*
* Returns 0 on success or a negative error code.
*/
int __rtnl_register(int protocol, int msgtype,
rtnl_doit_func doit, rtnl_dumpit_func dumpit,
unsigned int flags)
{
return rtnl_register_internal(NULL, protocol, msgtype,
doit, dumpit, flags);
}
EXPORT_SYMBOL_GPL(__rtnl_register);
/**
* rtnl_register - Register a rtnetlink message type
*
* Identical to __rtnl_register() but panics on failure. This is useful
* as failure of this function is very unlikely, it can only happen due
* to lack of memory when allocating the chain to store all message
* handlers for a protocol. Meant for use in init functions where lack
* of memory implies no sense in continuing.
*/ */
void rtnl_register(int protocol, int msgtype, void rtnl_register(int protocol, int msgtype,
rtnl_doit_func doit, rtnl_dumpit_func dumpit, rtnl_doit_func doit, rtnl_dumpit_func dumpit,
unsigned int flags) unsigned int flags)
{ {
if (__rtnl_register(protocol, msgtype, doit, dumpit, flags) < 0) int err;
panic("Unable to register rtnetlink message handler, "
"protocol = %d, message type = %d\n", err = rtnl_register_internal(NULL, protocol, msgtype, doit, dumpit,
protocol, msgtype); flags);
if (err)
pr_err("Unable to register rtnetlink message handler, "
"protocol = %d, message type = %d\n", protocol, msgtype);
} }
EXPORT_SYMBOL_GPL(rtnl_register); EXPORT_SYMBOL_GPL(rtnl_register);
......
...@@ -6595,27 +6595,43 @@ int __init addrconf_init(void) ...@@ -6595,27 +6595,43 @@ int __init addrconf_init(void)
rtnl_af_register(&inet6_ops); rtnl_af_register(&inet6_ops);
err = __rtnl_register(PF_INET6, RTM_GETLINK, NULL, inet6_dump_ifinfo, err = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_GETLINK,
0); NULL, inet6_dump_ifinfo, 0);
if (err < 0) if (err < 0)
goto errout; goto errout;
/* Only the first call to __rtnl_register can fail */ err = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_NEWADDR,
__rtnl_register(PF_INET6, RTM_NEWADDR, inet6_rtm_newaddr, NULL, 0); inet6_rtm_newaddr, NULL, 0);
__rtnl_register(PF_INET6, RTM_DELADDR, inet6_rtm_deladdr, NULL, 0); if (err < 0)
__rtnl_register(PF_INET6, RTM_GETADDR, inet6_rtm_getaddr, goto errout;
inet6_dump_ifaddr, RTNL_FLAG_DOIT_UNLOCKED); err = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_DELADDR,
__rtnl_register(PF_INET6, RTM_GETMULTICAST, NULL, inet6_rtm_deladdr, NULL, 0);
inet6_dump_ifmcaddr, 0); if (err < 0)
__rtnl_register(PF_INET6, RTM_GETANYCAST, NULL, goto errout;
inet6_dump_ifacaddr, 0); err = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_GETADDR,
__rtnl_register(PF_INET6, RTM_GETNETCONF, inet6_netconf_get_devconf, inet6_rtm_getaddr, inet6_dump_ifaddr,
inet6_netconf_dump_devconf, RTNL_FLAG_DOIT_UNLOCKED); RTNL_FLAG_DOIT_UNLOCKED);
if (err < 0)
goto errout;
err = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_GETMULTICAST,
NULL, inet6_dump_ifmcaddr, 0);
if (err < 0)
goto errout;
err = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_GETANYCAST,
NULL, inet6_dump_ifacaddr, 0);
if (err < 0)
goto errout;
err = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_GETNETCONF,
inet6_netconf_get_devconf,
inet6_netconf_dump_devconf,
RTNL_FLAG_DOIT_UNLOCKED);
if (err < 0)
goto errout;
ipv6_addr_label_rtnl_register(); ipv6_addr_label_rtnl_register();
return 0; return 0;
errout: errout:
rtnl_unregister_all(PF_INET6);
rtnl_af_unregister(&inet6_ops); rtnl_af_unregister(&inet6_ops);
unregister_netdevice_notifier(&ipv6_dev_notf); unregister_netdevice_notifier(&ipv6_dev_notf);
errlo: errlo:
......
...@@ -549,11 +549,10 @@ static int ip6addrlbl_get(struct sk_buff *in_skb, struct nlmsghdr *nlh, ...@@ -549,11 +549,10 @@ static int ip6addrlbl_get(struct sk_buff *in_skb, struct nlmsghdr *nlh,
void __init ipv6_addr_label_rtnl_register(void) void __init ipv6_addr_label_rtnl_register(void)
{ {
__rtnl_register(PF_INET6, RTM_NEWADDRLABEL, ip6addrlbl_newdel, rtnl_register(PF_INET6, RTM_NEWADDRLABEL, ip6addrlbl_newdel,
NULL, RTNL_FLAG_DOIT_UNLOCKED); NULL, RTNL_FLAG_DOIT_UNLOCKED);
__rtnl_register(PF_INET6, RTM_DELADDRLABEL, ip6addrlbl_newdel, rtnl_register(PF_INET6, RTM_DELADDRLABEL, ip6addrlbl_newdel,
NULL, RTNL_FLAG_DOIT_UNLOCKED); NULL, RTNL_FLAG_DOIT_UNLOCKED);
__rtnl_register(PF_INET6, RTM_GETADDRLABEL, ip6addrlbl_get, rtnl_register(PF_INET6, RTM_GETADDRLABEL, ip6addrlbl_get,
ip6addrlbl_dump, RTNL_FLAG_DOIT_UNLOCKED); ip6addrlbl_dump, RTNL_FLAG_DOIT_UNLOCKED);
} }
...@@ -2142,8 +2142,8 @@ int __init fib6_init(void) ...@@ -2142,8 +2142,8 @@ int __init fib6_init(void)
if (ret) if (ret)
goto out_kmem_cache_create; goto out_kmem_cache_create;
ret = __rtnl_register(PF_INET6, RTM_GETROUTE, NULL, inet6_dump_fib, ret = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_GETROUTE, NULL,
0); inet6_dump_fib, 0);
if (ret) if (ret)
goto out_unregister_subsys; goto out_unregister_subsys;
......
...@@ -4772,11 +4772,20 @@ int __init ip6_route_init(void) ...@@ -4772,11 +4772,20 @@ int __init ip6_route_init(void)
if (ret) if (ret)
goto fib6_rules_init; goto fib6_rules_init;
ret = -ENOBUFS; ret = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_NEWROUTE,
if (__rtnl_register(PF_INET6, RTM_NEWROUTE, inet6_rtm_newroute, NULL, 0) || inet6_rtm_newroute, NULL, 0);
__rtnl_register(PF_INET6, RTM_DELROUTE, inet6_rtm_delroute, NULL, 0) || if (ret < 0)
__rtnl_register(PF_INET6, RTM_GETROUTE, inet6_rtm_getroute, NULL, goto out_register_late_subsys;
RTNL_FLAG_DOIT_UNLOCKED))
ret = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_DELROUTE,
inet6_rtm_delroute, NULL, 0);
if (ret < 0)
goto out_register_late_subsys;
ret = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_GETROUTE,
inet6_rtm_getroute, NULL,
RTNL_FLAG_DOIT_UNLOCKED);
if (ret < 0)
goto out_register_late_subsys; goto out_register_late_subsys;
ret = register_netdevice_notifier(&ip6_route_dev_notifier); ret = register_netdevice_notifier(&ip6_route_dev_notifier);
...@@ -4794,6 +4803,7 @@ int __init ip6_route_init(void) ...@@ -4794,6 +4803,7 @@ int __init ip6_route_init(void)
return ret; return ret;
out_register_late_subsys: out_register_late_subsys:
rtnl_unregister_all(PF_INET6);
unregister_pernet_subsys(&ip6_route_net_late_ops); unregister_pernet_subsys(&ip6_route_net_late_ops);
fib6_rules_init: fib6_rules_init:
fib6_rules_cleanup(); fib6_rules_cleanup();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment