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>
This commit is contained in:

committed by
David S. Miller

parent
c1c502b511
commit
16feebcf23
@@ -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,
|
|||||||
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);
|
|||||||
* 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)
|
|||||||
|
|
||||||
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,
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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 @@ out:
|
|||||||
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();
|
||||||
|
Reference in New Issue
Block a user