diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/bridge/br_mdb.c | 6 | ||||
| -rw-r--r-- | net/can/gw.c | 6 | ||||
| -rw-r--r-- | net/core/fib_rules.c | 6 | ||||
| -rw-r--r-- | net/core/neighbour.c | 10 | ||||
| -rw-r--r-- | net/core/net_namespace.c | 5 | ||||
| -rw-r--r-- | net/core/rtnetlink.c | 216 | ||||
| -rw-r--r-- | net/dcb/dcbnl.c | 4 | ||||
| -rw-r--r-- | net/decnet/dn_dev.c | 6 | ||||
| -rw-r--r-- | net/decnet/dn_fib.c | 4 | ||||
| -rw-r--r-- | net/decnet/dn_route.c | 4 | ||||
| -rw-r--r-- | net/ipv4/devinet.c | 8 | ||||
| -rw-r--r-- | net/ipv4/fib_frontend.c | 6 | ||||
| -rw-r--r-- | net/ipv4/ipmr.c | 8 | ||||
| -rw-r--r-- | net/ipv4/route.c | 2 | ||||
| -rw-r--r-- | net/ipv6/addrconf.c | 14 | ||||
| -rw-r--r-- | net/ipv6/addrlabel.c | 6 | ||||
| -rw-r--r-- | net/ipv6/ip6_fib.c | 2 | ||||
| -rw-r--r-- | net/ipv6/ip6mr.c | 2 | ||||
| -rw-r--r-- | net/ipv6/route.c | 6 | ||||
| -rw-r--r-- | net/mpls/af_mpls.c | 8 | ||||
| -rw-r--r-- | net/phonet/pn_netlink.c | 12 | ||||
| -rw-r--r-- | net/qrtr/qrtr.c | 2 | ||||
| -rw-r--r-- | net/sched/act_api.c | 6 | ||||
| -rw-r--r-- | net/sched/cls_api.c | 6 | ||||
| -rw-r--r-- | net/sched/sch_api.c | 12 |
25 files changed, 195 insertions, 172 deletions
diff --git a/net/bridge/br_mdb.c b/net/bridge/br_mdb.c index a0b11e7d67d9..ca01def49af0 100644 --- a/net/bridge/br_mdb.c +++ b/net/bridge/br_mdb.c | |||
| @@ -713,9 +713,9 @@ static int br_mdb_del(struct sk_buff *skb, struct nlmsghdr *nlh, | |||
| 713 | 713 | ||
| 714 | void br_mdb_init(void) | 714 | void br_mdb_init(void) |
| 715 | { | 715 | { |
| 716 | rtnl_register(PF_BRIDGE, RTM_GETMDB, NULL, br_mdb_dump, NULL); | 716 | rtnl_register(PF_BRIDGE, RTM_GETMDB, NULL, br_mdb_dump, 0); |
| 717 | rtnl_register(PF_BRIDGE, RTM_NEWMDB, br_mdb_add, NULL, NULL); | 717 | rtnl_register(PF_BRIDGE, RTM_NEWMDB, br_mdb_add, NULL, 0); |
| 718 | rtnl_register(PF_BRIDGE, RTM_DELMDB, br_mdb_del, NULL, NULL); | 718 | rtnl_register(PF_BRIDGE, RTM_DELMDB, br_mdb_del, NULL, 0); |
| 719 | } | 719 | } |
| 720 | 720 | ||
| 721 | void br_mdb_uninit(void) | 721 | void br_mdb_uninit(void) |
diff --git a/net/can/gw.c b/net/can/gw.c index 29748d844c3f..73a02af4b5d7 100644 --- a/net/can/gw.c +++ b/net/can/gw.c | |||
| @@ -1031,15 +1031,15 @@ static __init int cgw_module_init(void) | |||
| 1031 | notifier.notifier_call = cgw_notifier; | 1031 | notifier.notifier_call = cgw_notifier; |
| 1032 | register_netdevice_notifier(¬ifier); | 1032 | register_netdevice_notifier(¬ifier); |
| 1033 | 1033 | ||
| 1034 | if (__rtnl_register(PF_CAN, RTM_GETROUTE, NULL, cgw_dump_jobs, NULL)) { | 1034 | if (__rtnl_register(PF_CAN, RTM_GETROUTE, NULL, cgw_dump_jobs, 0)) { |
| 1035 | unregister_netdevice_notifier(¬ifier); | 1035 | unregister_netdevice_notifier(¬ifier); |
| 1036 | kmem_cache_destroy(cgw_cache); | 1036 | kmem_cache_destroy(cgw_cache); |
| 1037 | return -ENOBUFS; | 1037 | return -ENOBUFS; |
| 1038 | } | 1038 | } |
| 1039 | 1039 | ||
| 1040 | /* Only the first call to __rtnl_register can fail */ | 1040 | /* Only the first call to __rtnl_register can fail */ |
| 1041 | __rtnl_register(PF_CAN, RTM_NEWROUTE, cgw_create_job, NULL, NULL); | 1041 | __rtnl_register(PF_CAN, RTM_NEWROUTE, cgw_create_job, NULL, 0); |
| 1042 | __rtnl_register(PF_CAN, RTM_DELROUTE, cgw_remove_job, NULL, NULL); | 1042 | __rtnl_register(PF_CAN, RTM_DELROUTE, cgw_remove_job, NULL, 0); |
| 1043 | 1043 | ||
| 1044 | return 0; | 1044 | return 0; |
| 1045 | } | 1045 | } |
diff --git a/net/core/fib_rules.c b/net/core/fib_rules.c index fc0b65093417..9a6d97c1d810 100644 --- a/net/core/fib_rules.c +++ b/net/core/fib_rules.c | |||
| @@ -1026,9 +1026,9 @@ static struct pernet_operations fib_rules_net_ops = { | |||
| 1026 | static int __init fib_rules_init(void) | 1026 | static int __init fib_rules_init(void) |
| 1027 | { | 1027 | { |
| 1028 | int err; | 1028 | int err; |
| 1029 | rtnl_register(PF_UNSPEC, RTM_NEWRULE, fib_nl_newrule, NULL, NULL); | 1029 | rtnl_register(PF_UNSPEC, RTM_NEWRULE, fib_nl_newrule, NULL, 0); |
| 1030 | rtnl_register(PF_UNSPEC, RTM_DELRULE, fib_nl_delrule, NULL, NULL); | 1030 | rtnl_register(PF_UNSPEC, RTM_DELRULE, fib_nl_delrule, NULL, 0); |
| 1031 | rtnl_register(PF_UNSPEC, RTM_GETRULE, NULL, fib_nl_dumprule, NULL); | 1031 | rtnl_register(PF_UNSPEC, RTM_GETRULE, NULL, fib_nl_dumprule, 0); |
| 1032 | 1032 | ||
| 1033 | err = register_pernet_subsys(&fib_rules_net_ops); | 1033 | err = register_pernet_subsys(&fib_rules_net_ops); |
| 1034 | if (err < 0) | 1034 | if (err < 0) |
diff --git a/net/core/neighbour.c b/net/core/neighbour.c index d0713627deb6..16a1a4c4eb57 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c | |||
| @@ -3261,13 +3261,13 @@ EXPORT_SYMBOL(neigh_sysctl_unregister); | |||
| 3261 | 3261 | ||
| 3262 | static int __init neigh_init(void) | 3262 | static int __init neigh_init(void) |
| 3263 | { | 3263 | { |
| 3264 | rtnl_register(PF_UNSPEC, RTM_NEWNEIGH, neigh_add, NULL, NULL); | 3264 | rtnl_register(PF_UNSPEC, RTM_NEWNEIGH, neigh_add, NULL, 0); |
| 3265 | rtnl_register(PF_UNSPEC, RTM_DELNEIGH, neigh_delete, NULL, NULL); | 3265 | rtnl_register(PF_UNSPEC, RTM_DELNEIGH, neigh_delete, NULL, 0); |
| 3266 | rtnl_register(PF_UNSPEC, RTM_GETNEIGH, NULL, neigh_dump_info, NULL); | 3266 | rtnl_register(PF_UNSPEC, RTM_GETNEIGH, NULL, neigh_dump_info, 0); |
| 3267 | 3267 | ||
| 3268 | rtnl_register(PF_UNSPEC, RTM_GETNEIGHTBL, NULL, neightbl_dump_info, | 3268 | rtnl_register(PF_UNSPEC, RTM_GETNEIGHTBL, NULL, neightbl_dump_info, |
| 3269 | NULL); | 3269 | 0); |
| 3270 | rtnl_register(PF_UNSPEC, RTM_SETNEIGHTBL, neightbl_set, NULL, NULL); | 3270 | rtnl_register(PF_UNSPEC, RTM_SETNEIGHTBL, neightbl_set, NULL, 0); |
| 3271 | 3271 | ||
| 3272 | return 0; | 3272 | return 0; |
| 3273 | } | 3273 | } |
diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c index 8726d051f31d..6cfdc7c84c48 100644 --- a/net/core/net_namespace.c +++ b/net/core/net_namespace.c | |||
| @@ -855,9 +855,10 @@ static int __init net_ns_init(void) | |||
| 855 | 855 | ||
| 856 | register_pernet_subsys(&net_ns_ops); | 856 | register_pernet_subsys(&net_ns_ops); |
| 857 | 857 | ||
| 858 | rtnl_register(PF_UNSPEC, RTM_NEWNSID, rtnl_net_newid, NULL, NULL); | 858 | rtnl_register(PF_UNSPEC, RTM_NEWNSID, rtnl_net_newid, NULL, |
| 859 | RTNL_FLAG_DOIT_UNLOCKED); | ||
| 859 | rtnl_register(PF_UNSPEC, RTM_GETNSID, rtnl_net_getid, rtnl_net_dumpid, | 860 | rtnl_register(PF_UNSPEC, RTM_GETNSID, rtnl_net_getid, rtnl_net_dumpid, |
| 860 | NULL); | 861 | RTNL_FLAG_DOIT_UNLOCKED); |
| 861 | 862 | ||
| 862 | return 0; | 863 | return 0; |
| 863 | } | 864 | } |
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 9201e3621351..dd4e50dfa248 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
| @@ -62,7 +62,7 @@ | |||
| 62 | struct rtnl_link { | 62 | struct rtnl_link { |
| 63 | rtnl_doit_func doit; | 63 | rtnl_doit_func doit; |
| 64 | rtnl_dumpit_func dumpit; | 64 | rtnl_dumpit_func dumpit; |
| 65 | rtnl_calcit_func calcit; | 65 | unsigned int flags; |
| 66 | }; | 66 | }; |
| 67 | 67 | ||
| 68 | static DEFINE_MUTEX(rtnl_mutex); | 68 | static DEFINE_MUTEX(rtnl_mutex); |
| @@ -127,7 +127,8 @@ bool lockdep_rtnl_is_held(void) | |||
| 127 | EXPORT_SYMBOL(lockdep_rtnl_is_held); | 127 | EXPORT_SYMBOL(lockdep_rtnl_is_held); |
| 128 | #endif /* #ifdef CONFIG_PROVE_LOCKING */ | 128 | #endif /* #ifdef CONFIG_PROVE_LOCKING */ |
| 129 | 129 | ||
| 130 | static struct rtnl_link *rtnl_msg_handlers[RTNL_FAMILY_MAX + 1]; | 130 | static struct rtnl_link __rcu *rtnl_msg_handlers[RTNL_FAMILY_MAX + 1]; |
| 131 | static refcount_t rtnl_msg_handlers_ref[RTNL_FAMILY_MAX + 1]; | ||
| 131 | 132 | ||
| 132 | static inline int rtm_msgindex(int msgtype) | 133 | static inline int rtm_msgindex(int msgtype) |
| 133 | { | 134 | { |
| @@ -143,58 +144,13 @@ static inline int rtm_msgindex(int msgtype) | |||
| 143 | return msgindex; | 144 | return msgindex; |
| 144 | } | 145 | } |
| 145 | 146 | ||
| 146 | static rtnl_doit_func rtnl_get_doit(int protocol, int msgindex) | ||
| 147 | { | ||
| 148 | struct rtnl_link *tab; | ||
| 149 | |||
| 150 | if (protocol <= RTNL_FAMILY_MAX) | ||
| 151 | tab = rtnl_msg_handlers[protocol]; | ||
| 152 | else | ||
| 153 | tab = NULL; | ||
| 154 | |||
| 155 | if (tab == NULL || tab[msgindex].doit == NULL) | ||
| 156 | tab = rtnl_msg_handlers[PF_UNSPEC]; | ||
| 157 | |||
| 158 | return tab[msgindex].doit; | ||
| 159 | } | ||
| 160 | |||
| 161 | static rtnl_dumpit_func rtnl_get_dumpit(int protocol, int msgindex) | ||
| 162 | { | ||
| 163 | struct rtnl_link *tab; | ||
| 164 | |||
| 165 | if (protocol <= RTNL_FAMILY_MAX) | ||
| 166 | tab = rtnl_msg_handlers[protocol]; | ||
| 167 | else | ||
| 168 | tab = NULL; | ||
| 169 | |||
| 170 | if (tab == NULL || tab[msgindex].dumpit == NULL) | ||
| 171 | tab = rtnl_msg_handlers[PF_UNSPEC]; | ||
| 172 | |||
| 173 | return tab[msgindex].dumpit; | ||
| 174 | } | ||
| 175 | |||
| 176 | static rtnl_calcit_func rtnl_get_calcit(int protocol, int msgindex) | ||
| 177 | { | ||
| 178 | struct rtnl_link *tab; | ||
| 179 | |||
| 180 | if (protocol <= RTNL_FAMILY_MAX) | ||
| 181 | tab = rtnl_msg_handlers[protocol]; | ||
| 182 | else | ||
| 183 | tab = NULL; | ||
| 184 | |||
| 185 | if (tab == NULL || tab[msgindex].calcit == NULL) | ||
| 186 | tab = rtnl_msg_handlers[PF_UNSPEC]; | ||
| 187 | |||
| 188 | return tab[msgindex].calcit; | ||
| 189 | } | ||
| 190 | |||
| 191 | /** | 147 | /** |
| 192 | * __rtnl_register - Register a rtnetlink message type | 148 | * __rtnl_register - Register a rtnetlink message type |
| 193 | * @protocol: Protocol family or PF_UNSPEC | 149 | * @protocol: Protocol family or PF_UNSPEC |
| 194 | * @msgtype: rtnetlink message type | 150 | * @msgtype: rtnetlink message type |
| 195 | * @doit: Function pointer called for each request message | 151 | * @doit: Function pointer called for each request message |
| 196 | * @dumpit: Function pointer called for each dump request (NLM_F_DUMP) message | 152 | * @dumpit: Function pointer called for each dump request (NLM_F_DUMP) message |
| 197 | * @calcit: Function pointer to calc size of dump message | 153 | * @flags: rtnl_link_flags to modifiy behaviour of doit/dumpit functions |
| 198 | * | 154 | * |
| 199 | * Registers the specified function pointers (at least one of them has | 155 | * Registers the specified function pointers (at least one of them has |
| 200 | * to be non-NULL) to be called whenever a request message for the | 156 | * to be non-NULL) to be called whenever a request message for the |
| @@ -208,7 +164,7 @@ static rtnl_calcit_func rtnl_get_calcit(int protocol, int msgindex) | |||
| 208 | */ | 164 | */ |
| 209 | int __rtnl_register(int protocol, int msgtype, | 165 | int __rtnl_register(int protocol, int msgtype, |
| 210 | rtnl_doit_func doit, rtnl_dumpit_func dumpit, | 166 | rtnl_doit_func doit, rtnl_dumpit_func dumpit, |
| 211 | rtnl_calcit_func calcit) | 167 | unsigned int flags) |
| 212 | { | 168 | { |
| 213 | struct rtnl_link *tab; | 169 | struct rtnl_link *tab; |
| 214 | int msgindex; | 170 | int msgindex; |
| @@ -216,23 +172,20 @@ int __rtnl_register(int protocol, int msgtype, | |||
| 216 | BUG_ON(protocol < 0 || protocol > RTNL_FAMILY_MAX); | 172 | BUG_ON(protocol < 0 || protocol > RTNL_FAMILY_MAX); |
| 217 | msgindex = rtm_msgindex(msgtype); | 173 | msgindex = rtm_msgindex(msgtype); |
| 218 | 174 | ||
| 219 | tab = rtnl_msg_handlers[protocol]; | 175 | tab = rcu_dereference(rtnl_msg_handlers[protocol]); |
| 220 | if (tab == NULL) { | 176 | if (tab == NULL) { |
| 221 | tab = kcalloc(RTM_NR_MSGTYPES, sizeof(*tab), GFP_KERNEL); | 177 | tab = kcalloc(RTM_NR_MSGTYPES, sizeof(*tab), GFP_KERNEL); |
| 222 | if (tab == NULL) | 178 | if (tab == NULL) |
| 223 | return -ENOBUFS; | 179 | return -ENOBUFS; |
| 224 | 180 | ||
| 225 | rtnl_msg_handlers[protocol] = tab; | 181 | rcu_assign_pointer(rtnl_msg_handlers[protocol], tab); |
| 226 | } | 182 | } |
| 227 | 183 | ||
| 228 | if (doit) | 184 | if (doit) |
| 229 | tab[msgindex].doit = doit; | 185 | tab[msgindex].doit = doit; |
| 230 | |||
| 231 | if (dumpit) | 186 | if (dumpit) |
| 232 | tab[msgindex].dumpit = dumpit; | 187 | tab[msgindex].dumpit = dumpit; |
| 233 | 188 | tab[msgindex].flags |= flags; | |
| 234 | if (calcit) | ||
| 235 | tab[msgindex].calcit = calcit; | ||
| 236 | 189 | ||
| 237 | return 0; | 190 | return 0; |
| 238 | } | 191 | } |
| @@ -249,9 +202,9 @@ EXPORT_SYMBOL_GPL(__rtnl_register); | |||
| 249 | */ | 202 | */ |
| 250 | void rtnl_register(int protocol, int msgtype, | 203 | void rtnl_register(int protocol, int msgtype, |
| 251 | rtnl_doit_func doit, rtnl_dumpit_func dumpit, | 204 | rtnl_doit_func doit, rtnl_dumpit_func dumpit, |
| 252 | rtnl_calcit_func calcit) | 205 | unsigned int flags) |
| 253 | { | 206 | { |
| 254 | if (__rtnl_register(protocol, msgtype, doit, dumpit, calcit) < 0) | 207 | if (__rtnl_register(protocol, msgtype, doit, dumpit, flags) < 0) |
| 255 | panic("Unable to register rtnetlink message handler, " | 208 | panic("Unable to register rtnetlink message handler, " |
| 256 | "protocol = %d, message type = %d\n", | 209 | "protocol = %d, message type = %d\n", |
| 257 | protocol, msgtype); | 210 | protocol, msgtype); |
| @@ -267,17 +220,23 @@ EXPORT_SYMBOL_GPL(rtnl_register); | |||
| 267 | */ | 220 | */ |
| 268 | int rtnl_unregister(int protocol, int msgtype) | 221 | int rtnl_unregister(int protocol, int msgtype) |
| 269 | { | 222 | { |
| 223 | struct rtnl_link *handlers; | ||
| 270 | int msgindex; | 224 | int msgindex; |
| 271 | 225 | ||
| 272 | BUG_ON(protocol < 0 || protocol > RTNL_FAMILY_MAX); | 226 | BUG_ON(protocol < 0 || protocol > RTNL_FAMILY_MAX); |
| 273 | msgindex = rtm_msgindex(msgtype); | 227 | msgindex = rtm_msgindex(msgtype); |
| 274 | 228 | ||
| 275 | if (rtnl_msg_handlers[protocol] == NULL) | 229 | rtnl_lock(); |
| 230 | handlers = rtnl_dereference(rtnl_msg_handlers[protocol]); | ||
| 231 | if (!handlers) { | ||
| 232 | rtnl_unlock(); | ||
| 276 | return -ENOENT; | 233 | return -ENOENT; |
| 234 | } | ||
| 277 | 235 | ||
| 278 | rtnl_msg_handlers[protocol][msgindex].doit = NULL; | 236 | handlers[msgindex].doit = NULL; |
| 279 | rtnl_msg_handlers[protocol][msgindex].dumpit = NULL; | 237 | handlers[msgindex].dumpit = NULL; |
| 280 | rtnl_msg_handlers[protocol][msgindex].calcit = NULL; | 238 | handlers[msgindex].flags = 0; |
| 239 | rtnl_unlock(); | ||
| 281 | 240 | ||
| 282 | return 0; | 241 | return 0; |
| 283 | } | 242 | } |
| @@ -292,10 +251,20 @@ EXPORT_SYMBOL_GPL(rtnl_unregister); | |||
| 292 | */ | 251 | */ |
| 293 | void rtnl_unregister_all(int protocol) | 252 | void rtnl_unregister_all(int protocol) |
| 294 | { | 253 | { |
| 254 | struct rtnl_link *handlers; | ||
| 255 | |||
| 295 | BUG_ON(protocol < 0 || protocol > RTNL_FAMILY_MAX); | 256 | BUG_ON(protocol < 0 || protocol > RTNL_FAMILY_MAX); |
| 296 | 257 | ||
| 297 | kfree(rtnl_msg_handlers[protocol]); | 258 | rtnl_lock(); |
| 298 | rtnl_msg_handlers[protocol] = NULL; | 259 | handlers = rtnl_dereference(rtnl_msg_handlers[protocol]); |
| 260 | RCU_INIT_POINTER(rtnl_msg_handlers[protocol], NULL); | ||
| 261 | rtnl_unlock(); | ||
| 262 | |||
| 263 | synchronize_net(); | ||
| 264 | |||
| 265 | while (refcount_read(&rtnl_msg_handlers_ref[protocol]) > 0) | ||
| 266 | schedule(); | ||
| 267 | kfree(handlers); | ||
| 299 | } | 268 | } |
| 300 | EXPORT_SYMBOL_GPL(rtnl_unregister_all); | 269 | EXPORT_SYMBOL_GPL(rtnl_unregister_all); |
| 301 | 270 | ||
| @@ -2831,11 +2800,13 @@ static u16 rtnl_calcit(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
| 2831 | * traverse the list of net devices and compute the minimum | 2800 | * traverse the list of net devices and compute the minimum |
| 2832 | * buffer size based upon the filter mask. | 2801 | * buffer size based upon the filter mask. |
| 2833 | */ | 2802 | */ |
| 2834 | list_for_each_entry(dev, &net->dev_base_head, dev_list) { | 2803 | rcu_read_lock(); |
| 2804 | for_each_netdev_rcu(net, dev) { | ||
| 2835 | min_ifinfo_dump_size = max_t(u16, min_ifinfo_dump_size, | 2805 | min_ifinfo_dump_size = max_t(u16, min_ifinfo_dump_size, |
| 2836 | if_nlmsg_size(dev, | 2806 | if_nlmsg_size(dev, |
| 2837 | ext_filter_mask)); | 2807 | ext_filter_mask)); |
| 2838 | } | 2808 | } |
| 2809 | rcu_read_unlock(); | ||
| 2839 | 2810 | ||
| 2840 | return nlmsg_total_size(min_ifinfo_dump_size); | 2811 | return nlmsg_total_size(min_ifinfo_dump_size); |
| 2841 | } | 2812 | } |
| @@ -2847,19 +2818,29 @@ static int rtnl_dump_all(struct sk_buff *skb, struct netlink_callback *cb) | |||
| 2847 | 2818 | ||
| 2848 | if (s_idx == 0) | 2819 | if (s_idx == 0) |
| 2849 | s_idx = 1; | 2820 | s_idx = 1; |
| 2821 | |||
| 2850 | for (idx = 1; idx <= RTNL_FAMILY_MAX; idx++) { | 2822 | for (idx = 1; idx <= RTNL_FAMILY_MAX; idx++) { |
| 2851 | int type = cb->nlh->nlmsg_type-RTM_BASE; | 2823 | int type = cb->nlh->nlmsg_type-RTM_BASE; |
| 2824 | struct rtnl_link *handlers; | ||
| 2825 | rtnl_dumpit_func dumpit; | ||
| 2826 | |||
| 2852 | if (idx < s_idx || idx == PF_PACKET) | 2827 | if (idx < s_idx || idx == PF_PACKET) |
| 2853 | continue; | 2828 | continue; |
| 2854 | if (rtnl_msg_handlers[idx] == NULL || | 2829 | |
| 2855 | rtnl_msg_handlers[idx][type].dumpit == NULL) | 2830 | handlers = rtnl_dereference(rtnl_msg_handlers[idx]); |
| 2831 | if (!handlers) | ||
| 2856 | continue; | 2832 | continue; |
| 2833 | |||
| 2834 | dumpit = READ_ONCE(handlers[type].dumpit); | ||
| 2835 | if (!dumpit) | ||
| 2836 | continue; | ||
| 2837 | |||
| 2857 | if (idx > s_idx) { | 2838 | if (idx > s_idx) { |
| 2858 | memset(&cb->args[0], 0, sizeof(cb->args)); | 2839 | memset(&cb->args[0], 0, sizeof(cb->args)); |
| 2859 | cb->prev_seq = 0; | 2840 | cb->prev_seq = 0; |
| 2860 | cb->seq = 0; | 2841 | cb->seq = 0; |
| 2861 | } | 2842 | } |
| 2862 | if (rtnl_msg_handlers[idx][type].dumpit(skb, cb)) | 2843 | if (dumpit(skb, cb)) |
| 2863 | break; | 2844 | break; |
| 2864 | } | 2845 | } |
| 2865 | cb->family = idx; | 2846 | cb->family = idx; |
| @@ -4162,11 +4143,13 @@ static int rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, | |||
| 4162 | struct netlink_ext_ack *extack) | 4143 | struct netlink_ext_ack *extack) |
| 4163 | { | 4144 | { |
| 4164 | struct net *net = sock_net(skb->sk); | 4145 | struct net *net = sock_net(skb->sk); |
| 4146 | struct rtnl_link *handlers; | ||
| 4147 | int err = -EOPNOTSUPP; | ||
| 4165 | rtnl_doit_func doit; | 4148 | rtnl_doit_func doit; |
| 4149 | unsigned int flags; | ||
| 4166 | int kind; | 4150 | int kind; |
| 4167 | int family; | 4151 | int family; |
| 4168 | int type; | 4152 | int type; |
| 4169 | int err; | ||
| 4170 | 4153 | ||
| 4171 | type = nlh->nlmsg_type; | 4154 | type = nlh->nlmsg_type; |
| 4172 | if (type > RTM_MAX) | 4155 | if (type > RTM_MAX) |
| @@ -4184,20 +4167,40 @@ static int rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, | |||
| 4184 | if (kind != 2 && !netlink_net_capable(skb, CAP_NET_ADMIN)) | 4167 | if (kind != 2 && !netlink_net_capable(skb, CAP_NET_ADMIN)) |
| 4185 | return -EPERM; | 4168 | return -EPERM; |
| 4186 | 4169 | ||
| 4170 | if (family > ARRAY_SIZE(rtnl_msg_handlers)) | ||
| 4171 | family = PF_UNSPEC; | ||
| 4172 | |||
| 4173 | rcu_read_lock(); | ||
| 4174 | handlers = rcu_dereference(rtnl_msg_handlers[family]); | ||
| 4175 | if (!handlers) { | ||
| 4176 | family = PF_UNSPEC; | ||
| 4177 | handlers = rcu_dereference(rtnl_msg_handlers[family]); | ||
| 4178 | } | ||
| 4179 | |||
| 4187 | if (kind == 2 && nlh->nlmsg_flags&NLM_F_DUMP) { | 4180 | if (kind == 2 && nlh->nlmsg_flags&NLM_F_DUMP) { |
| 4188 | struct sock *rtnl; | 4181 | struct sock *rtnl; |
| 4189 | rtnl_dumpit_func dumpit; | 4182 | rtnl_dumpit_func dumpit; |
| 4190 | rtnl_calcit_func calcit; | ||
| 4191 | u16 min_dump_alloc = 0; | 4183 | u16 min_dump_alloc = 0; |
| 4192 | 4184 | ||
| 4193 | dumpit = rtnl_get_dumpit(family, type); | 4185 | dumpit = READ_ONCE(handlers[type].dumpit); |
| 4194 | if (dumpit == NULL) | 4186 | if (!dumpit) { |
| 4195 | return -EOPNOTSUPP; | 4187 | family = PF_UNSPEC; |
| 4196 | calcit = rtnl_get_calcit(family, type); | 4188 | handlers = rcu_dereference(rtnl_msg_handlers[PF_UNSPEC]); |
| 4197 | if (calcit) | 4189 | if (!handlers) |
| 4198 | min_dump_alloc = calcit(skb, nlh); | 4190 | goto err_unlock; |
| 4191 | |||
| 4192 | dumpit = READ_ONCE(handlers[type].dumpit); | ||
| 4193 | if (!dumpit) | ||
| 4194 | goto err_unlock; | ||
| 4195 | } | ||
| 4196 | |||
| 4197 | refcount_inc(&rtnl_msg_handlers_ref[family]); | ||
| 4198 | |||
| 4199 | if (type == RTM_GETLINK) | ||
| 4200 | min_dump_alloc = rtnl_calcit(skb, nlh); | ||
| 4201 | |||
| 4202 | rcu_read_unlock(); | ||
| 4199 | 4203 | ||
| 4200 | __rtnl_unlock(); | ||
| 4201 | rtnl = net->rtnl; | 4204 | rtnl = net->rtnl; |
| 4202 | { | 4205 | { |
| 4203 | struct netlink_dump_control c = { | 4206 | struct netlink_dump_control c = { |
| @@ -4206,22 +4209,41 @@ static int rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, | |||
| 4206 | }; | 4209 | }; |
| 4207 | err = netlink_dump_start(rtnl, skb, nlh, &c); | 4210 | err = netlink_dump_start(rtnl, skb, nlh, &c); |
| 4208 | } | 4211 | } |
| 4209 | rtnl_lock(); | 4212 | refcount_dec(&rtnl_msg_handlers_ref[family]); |
| 4210 | return err; | 4213 | return err; |
| 4211 | } | 4214 | } |
| 4212 | 4215 | ||
| 4213 | doit = rtnl_get_doit(family, type); | 4216 | flags = READ_ONCE(handlers[type].flags); |
| 4214 | if (doit == NULL) | 4217 | if (flags & RTNL_FLAG_DOIT_UNLOCKED) { |
| 4215 | return -EOPNOTSUPP; | 4218 | refcount_inc(&rtnl_msg_handlers_ref[family]); |
| 4219 | doit = READ_ONCE(handlers[type].doit); | ||
| 4220 | rcu_read_unlock(); | ||
| 4221 | if (doit) | ||
| 4222 | err = doit(skb, nlh, extack); | ||
| 4223 | refcount_dec(&rtnl_msg_handlers_ref[family]); | ||
| 4224 | return err; | ||
| 4225 | } | ||
| 4226 | |||
| 4227 | rcu_read_unlock(); | ||
| 4216 | 4228 | ||
| 4217 | return doit(skb, nlh, extack); | 4229 | rtnl_lock(); |
| 4230 | handlers = rtnl_dereference(rtnl_msg_handlers[family]); | ||
| 4231 | if (handlers) { | ||
| 4232 | doit = READ_ONCE(handlers[type].doit); | ||
| 4233 | if (doit) | ||
| 4234 | err = doit(skb, nlh, extack); | ||
| 4235 | } | ||
| 4236 | rtnl_unlock(); | ||
| 4237 | return err; | ||
| 4238 | |||
| 4239 | err_unlock: | ||
| 4240 | rcu_read_unlock(); | ||
| 4241 | return -EOPNOTSUPP; | ||
| 4218 | } | 4242 | } |
| 4219 | 4243 | ||
| 4220 | static void rtnetlink_rcv(struct sk_buff *skb) | 4244 | static void rtnetlink_rcv(struct sk_buff *skb) |
| 4221 | { | 4245 | { |
| 4222 | rtnl_lock(); | ||
| 4223 | netlink_rcv_skb(skb, &rtnetlink_rcv_msg); | 4246 | netlink_rcv_skb(skb, &rtnetlink_rcv_msg); |
| 4224 | rtnl_unlock(); | ||
| 4225 | } | 4247 | } |
| 4226 | 4248 | ||
| 4227 | static int rtnetlink_bind(struct net *net, int group) | 4249 | static int rtnetlink_bind(struct net *net, int group) |
| @@ -4300,23 +4322,23 @@ void __init rtnetlink_init(void) | |||
| 4300 | register_netdevice_notifier(&rtnetlink_dev_notifier); | 4322 | register_netdevice_notifier(&rtnetlink_dev_notifier); |
| 4301 | 4323 | ||
| 4302 | rtnl_register(PF_UNSPEC, RTM_GETLINK, rtnl_getlink, | 4324 | rtnl_register(PF_UNSPEC, RTM_GETLINK, rtnl_getlink, |
| 4303 | rtnl_dump_ifinfo, rtnl_calcit); | 4325 | rtnl_dump_ifinfo, 0); |
| 4304 | rtnl_register(PF_UNSPEC, RTM_SETLINK, rtnl_setlink, NULL, NULL); | 4326 | rtnl_register(PF_UNSPEC, RTM_SETLINK, rtnl_setlink, NULL, 0); |
| 4305 | rtnl_register(PF_UNSPEC, RTM_NEWLINK, rtnl_newlink, NULL, NULL); | 4327 | rtnl_register(PF_UNSPEC, RTM_NEWLINK, rtnl_newlink, NULL, 0); |
| 4306 | rtnl_register(PF_UNSPEC, RTM_DELLINK, rtnl_dellink, NULL, NULL); | 4328 | rtnl_register(PF_UNSPEC, RTM_DELLINK, rtnl_dellink, NULL, 0); |
| 4307 | 4329 | ||
| 4308 | rtnl_register(PF_UNSPEC, RTM_GETADDR, NULL, rtnl_dump_all, NULL); | 4330 | rtnl_register(PF_UNSPEC, RTM_GETADDR, NULL, rtnl_dump_all, 0); |
| 4309 | rtnl_register(PF_UNSPEC, RTM_GETROUTE, NULL, rtnl_dump_all, NULL); | 4331 | rtnl_register(PF_UNSPEC, RTM_GETROUTE, NULL, rtnl_dump_all, 0); |
| 4310 | rtnl_register(PF_UNSPEC, RTM_GETNETCONF, NULL, rtnl_dump_all, NULL); | 4332 | rtnl_register(PF_UNSPEC, RTM_GETNETCONF, NULL, rtnl_dump_all, 0); |
| 4311 | 4333 | ||
| 4312 | rtnl_register(PF_BRIDGE, RTM_NEWNEIGH, rtnl_fdb_add, NULL, NULL); | 4334 | rtnl_register(PF_BRIDGE, RTM_NEWNEIGH, rtnl_fdb_add, NULL, 0); |
| 4313 | rtnl_register(PF_BRIDGE, RTM_DELNEIGH, rtnl_fdb_del, NULL, NULL); | 4335 | rtnl_register(PF_BRIDGE, RTM_DELNEIGH, rtnl_fdb_del, NULL, 0); |
| 4314 | rtnl_register(PF_BRIDGE, RTM_GETNEIGH, NULL, rtnl_fdb_dump, NULL); | 4336 | rtnl_register(PF_BRIDGE, RTM_GETNEIGH, NULL, rtnl_fdb_dump, 0); |
| 4315 | 4337 | ||
| 4316 | rtnl_register(PF_BRIDGE, RTM_GETLINK, NULL, rtnl_bridge_getlink, NULL); | 4338 | rtnl_register(PF_BRIDGE, RTM_GETLINK, NULL, rtnl_bridge_getlink, 0); |
| 4317 | rtnl_register(PF_BRIDGE, RTM_DELLINK, rtnl_bridge_dellink, NULL, NULL); | 4339 | rtnl_register(PF_BRIDGE, RTM_DELLINK, rtnl_bridge_dellink, NULL, 0); |
| 4318 | rtnl_register(PF_BRIDGE, RTM_SETLINK, rtnl_bridge_setlink, NULL, NULL); | 4340 | rtnl_register(PF_BRIDGE, RTM_SETLINK, rtnl_bridge_setlink, NULL, 0); |
| 4319 | 4341 | ||
| 4320 | rtnl_register(PF_UNSPEC, RTM_GETSTATS, rtnl_stats_get, rtnl_stats_dump, | 4342 | rtnl_register(PF_UNSPEC, RTM_GETSTATS, rtnl_stats_get, rtnl_stats_dump, |
| 4321 | NULL); | 4343 | 0); |
| 4322 | } | 4344 | } |
diff --git a/net/dcb/dcbnl.c b/net/dcb/dcbnl.c index 733f523707ac..bae7d78aa068 100644 --- a/net/dcb/dcbnl.c +++ b/net/dcb/dcbnl.c | |||
| @@ -1938,8 +1938,8 @@ static int __init dcbnl_init(void) | |||
| 1938 | { | 1938 | { |
| 1939 | INIT_LIST_HEAD(&dcb_app_list); | 1939 | INIT_LIST_HEAD(&dcb_app_list); |
| 1940 | 1940 | ||
| 1941 | rtnl_register(PF_UNSPEC, RTM_GETDCB, dcb_doit, NULL, NULL); | 1941 | rtnl_register(PF_UNSPEC, RTM_GETDCB, dcb_doit, NULL, 0); |
| 1942 | rtnl_register(PF_UNSPEC, RTM_SETDCB, dcb_doit, NULL, NULL); | 1942 | rtnl_register(PF_UNSPEC, RTM_SETDCB, dcb_doit, NULL, 0); |
| 1943 | 1943 | ||
| 1944 | return 0; | 1944 | return 0; |
| 1945 | } | 1945 | } |
diff --git a/net/decnet/dn_dev.c b/net/decnet/dn_dev.c index fa0110b57ca1..4d339de56862 100644 --- a/net/decnet/dn_dev.c +++ b/net/decnet/dn_dev.c | |||
| @@ -1419,9 +1419,9 @@ void __init dn_dev_init(void) | |||
| 1419 | 1419 | ||
| 1420 | dn_dev_devices_on(); | 1420 | dn_dev_devices_on(); |
| 1421 | 1421 | ||
| 1422 | rtnl_register(PF_DECnet, RTM_NEWADDR, dn_nl_newaddr, NULL, NULL); | 1422 | rtnl_register(PF_DECnet, RTM_NEWADDR, dn_nl_newaddr, NULL, 0); |
| 1423 | rtnl_register(PF_DECnet, RTM_DELADDR, dn_nl_deladdr, NULL, NULL); | 1423 | rtnl_register(PF_DECnet, RTM_DELADDR, dn_nl_deladdr, NULL, 0); |
| 1424 | rtnl_register(PF_DECnet, RTM_GETADDR, NULL, dn_nl_dump_ifaddr, NULL); | 1424 | rtnl_register(PF_DECnet, RTM_GETADDR, NULL, dn_nl_dump_ifaddr, 0); |
| 1425 | 1425 | ||
| 1426 | proc_create("decnet_dev", S_IRUGO, init_net.proc_net, &dn_dev_seq_fops); | 1426 | proc_create("decnet_dev", S_IRUGO, init_net.proc_net, &dn_dev_seq_fops); |
| 1427 | 1427 | ||
diff --git a/net/decnet/dn_fib.c b/net/decnet/dn_fib.c index f9f6fb3f3c5b..3d37464c8b4a 100644 --- a/net/decnet/dn_fib.c +++ b/net/decnet/dn_fib.c | |||
| @@ -791,8 +791,8 @@ void __init dn_fib_init(void) | |||
| 791 | 791 | ||
| 792 | register_dnaddr_notifier(&dn_fib_dnaddr_notifier); | 792 | register_dnaddr_notifier(&dn_fib_dnaddr_notifier); |
| 793 | 793 | ||
| 794 | rtnl_register(PF_DECnet, RTM_NEWROUTE, dn_fib_rtm_newroute, NULL, NULL); | 794 | rtnl_register(PF_DECnet, RTM_NEWROUTE, dn_fib_rtm_newroute, NULL, 0); |
| 795 | rtnl_register(PF_DECnet, RTM_DELROUTE, dn_fib_rtm_delroute, NULL, NULL); | 795 | rtnl_register(PF_DECnet, RTM_DELROUTE, dn_fib_rtm_delroute, NULL, 0); |
| 796 | } | 796 | } |
| 797 | 797 | ||
| 798 | 798 | ||
diff --git a/net/decnet/dn_route.c b/net/decnet/dn_route.c index bcbe548f8854..0bd3afd01dd2 100644 --- a/net/decnet/dn_route.c +++ b/net/decnet/dn_route.c | |||
| @@ -1922,10 +1922,10 @@ void __init dn_route_init(void) | |||
| 1922 | 1922 | ||
| 1923 | #ifdef CONFIG_DECNET_ROUTER | 1923 | #ifdef CONFIG_DECNET_ROUTER |
| 1924 | rtnl_register(PF_DECnet, RTM_GETROUTE, dn_cache_getroute, | 1924 | rtnl_register(PF_DECnet, RTM_GETROUTE, dn_cache_getroute, |
| 1925 | dn_fib_dump, NULL); | 1925 | dn_fib_dump, 0); |
| 1926 | #else | 1926 | #else |
| 1927 | rtnl_register(PF_DECnet, RTM_GETROUTE, dn_cache_getroute, | 1927 | rtnl_register(PF_DECnet, RTM_GETROUTE, dn_cache_getroute, |
| 1928 | dn_cache_dump, NULL); | 1928 | dn_cache_dump, 0); |
| 1929 | #endif | 1929 | #endif |
| 1930 | } | 1930 | } |
| 1931 | 1931 | ||
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index 38d9af9b917c..d7adc0616599 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c | |||
| @@ -2491,9 +2491,9 @@ void __init devinet_init(void) | |||
| 2491 | 2491 | ||
| 2492 | rtnl_af_register(&inet_af_ops); | 2492 | rtnl_af_register(&inet_af_ops); |
| 2493 | 2493 | ||
| 2494 | rtnl_register(PF_INET, RTM_NEWADDR, inet_rtm_newaddr, NULL, NULL); | 2494 | rtnl_register(PF_INET, RTM_NEWADDR, inet_rtm_newaddr, NULL, 0); |
| 2495 | rtnl_register(PF_INET, RTM_DELADDR, inet_rtm_deladdr, NULL, NULL); | 2495 | rtnl_register(PF_INET, RTM_DELADDR, inet_rtm_deladdr, NULL, 0); |
| 2496 | rtnl_register(PF_INET, RTM_GETADDR, NULL, inet_dump_ifaddr, NULL); | 2496 | rtnl_register(PF_INET, RTM_GETADDR, NULL, inet_dump_ifaddr, 0); |
| 2497 | rtnl_register(PF_INET, RTM_GETNETCONF, inet_netconf_get_devconf, | 2497 | rtnl_register(PF_INET, RTM_GETNETCONF, inet_netconf_get_devconf, |
| 2498 | inet_netconf_dump_devconf, NULL); | 2498 | inet_netconf_dump_devconf, 0); |
| 2499 | } | 2499 | } |
diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c index 2cba559f14df..37819ab4cc74 100644 --- a/net/ipv4/fib_frontend.c +++ b/net/ipv4/fib_frontend.c | |||
| @@ -1348,7 +1348,7 @@ void __init ip_fib_init(void) | |||
| 1348 | register_netdevice_notifier(&fib_netdev_notifier); | 1348 | register_netdevice_notifier(&fib_netdev_notifier); |
| 1349 | register_inetaddr_notifier(&fib_inetaddr_notifier); | 1349 | register_inetaddr_notifier(&fib_inetaddr_notifier); |
| 1350 | 1350 | ||
| 1351 | rtnl_register(PF_INET, RTM_NEWROUTE, inet_rtm_newroute, NULL, NULL); | 1351 | rtnl_register(PF_INET, RTM_NEWROUTE, inet_rtm_newroute, NULL, 0); |
| 1352 | rtnl_register(PF_INET, RTM_DELROUTE, inet_rtm_delroute, NULL, NULL); | 1352 | rtnl_register(PF_INET, RTM_DELROUTE, inet_rtm_delroute, NULL, 0); |
| 1353 | rtnl_register(PF_INET, RTM_GETROUTE, NULL, inet_dump_fib, NULL); | 1353 | rtnl_register(PF_INET, RTM_GETROUTE, NULL, inet_dump_fib, 0); |
| 1354 | } | 1354 | } |
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index 06863ea3fc5b..c9b3e6e069ae 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c | |||
| @@ -3114,14 +3114,14 @@ int __init ip_mr_init(void) | |||
| 3114 | } | 3114 | } |
| 3115 | #endif | 3115 | #endif |
| 3116 | rtnl_register(RTNL_FAMILY_IPMR, RTM_GETROUTE, | 3116 | rtnl_register(RTNL_FAMILY_IPMR, RTM_GETROUTE, |
| 3117 | ipmr_rtm_getroute, ipmr_rtm_dumproute, NULL); | 3117 | ipmr_rtm_getroute, ipmr_rtm_dumproute, 0); |
| 3118 | rtnl_register(RTNL_FAMILY_IPMR, RTM_NEWROUTE, | 3118 | rtnl_register(RTNL_FAMILY_IPMR, RTM_NEWROUTE, |
| 3119 | ipmr_rtm_route, NULL, NULL); | 3119 | ipmr_rtm_route, NULL, 0); |
| 3120 | rtnl_register(RTNL_FAMILY_IPMR, RTM_DELROUTE, | 3120 | rtnl_register(RTNL_FAMILY_IPMR, RTM_DELROUTE, |
| 3121 | ipmr_rtm_route, NULL, NULL); | 3121 | ipmr_rtm_route, NULL, 0); |
| 3122 | 3122 | ||
| 3123 | rtnl_register(RTNL_FAMILY_IPMR, RTM_GETLINK, | 3123 | rtnl_register(RTNL_FAMILY_IPMR, RTM_GETLINK, |
| 3124 | NULL, ipmr_rtm_dumplink, NULL); | 3124 | NULL, ipmr_rtm_dumplink, 0); |
| 3125 | return 0; | 3125 | return 0; |
| 3126 | 3126 | ||
| 3127 | #ifdef CONFIG_IP_PIMSM_V2 | 3127 | #ifdef CONFIG_IP_PIMSM_V2 |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 0383e66f59bc..2ef46294475f 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
| @@ -3067,7 +3067,7 @@ int __init ip_rt_init(void) | |||
| 3067 | xfrm_init(); | 3067 | xfrm_init(); |
| 3068 | xfrm4_init(); | 3068 | xfrm4_init(); |
| 3069 | #endif | 3069 | #endif |
| 3070 | rtnl_register(PF_INET, RTM_GETROUTE, inet_rtm_getroute, NULL, NULL); | 3070 | rtnl_register(PF_INET, RTM_GETROUTE, inet_rtm_getroute, NULL, 0); |
| 3071 | 3071 | ||
| 3072 | #ifdef CONFIG_SYSCTL | 3072 | #ifdef CONFIG_SYSCTL |
| 3073 | register_pernet_subsys(&sysctl_route_ops); | 3073 | register_pernet_subsys(&sysctl_route_ops); |
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 30ee23eef268..640792e1ecb7 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
| @@ -6605,21 +6605,21 @@ int __init addrconf_init(void) | |||
| 6605 | rtnl_af_register(&inet6_ops); | 6605 | rtnl_af_register(&inet6_ops); |
| 6606 | 6606 | ||
| 6607 | err = __rtnl_register(PF_INET6, RTM_GETLINK, NULL, inet6_dump_ifinfo, | 6607 | err = __rtnl_register(PF_INET6, RTM_GETLINK, NULL, inet6_dump_ifinfo, |
| 6608 | NULL); | 6608 | 0); |
| 6609 | if (err < 0) | 6609 | if (err < 0) |
| 6610 | goto errout; | 6610 | goto errout; |
| 6611 | 6611 | ||
| 6612 | /* Only the first call to __rtnl_register can fail */ | 6612 | /* Only the first call to __rtnl_register can fail */ |
| 6613 | __rtnl_register(PF_INET6, RTM_NEWADDR, inet6_rtm_newaddr, NULL, NULL); | 6613 | __rtnl_register(PF_INET6, RTM_NEWADDR, inet6_rtm_newaddr, NULL, 0); |
| 6614 | __rtnl_register(PF_INET6, RTM_DELADDR, inet6_rtm_deladdr, NULL, NULL); | 6614 | __rtnl_register(PF_INET6, RTM_DELADDR, inet6_rtm_deladdr, NULL, 0); |
| 6615 | __rtnl_register(PF_INET6, RTM_GETADDR, inet6_rtm_getaddr, | 6615 | __rtnl_register(PF_INET6, RTM_GETADDR, inet6_rtm_getaddr, |
| 6616 | inet6_dump_ifaddr, NULL); | 6616 | inet6_dump_ifaddr, 0); |
| 6617 | __rtnl_register(PF_INET6, RTM_GETMULTICAST, NULL, | 6617 | __rtnl_register(PF_INET6, RTM_GETMULTICAST, NULL, |
| 6618 | inet6_dump_ifmcaddr, NULL); | 6618 | inet6_dump_ifmcaddr, 0); |
| 6619 | __rtnl_register(PF_INET6, RTM_GETANYCAST, NULL, | 6619 | __rtnl_register(PF_INET6, RTM_GETANYCAST, NULL, |
| 6620 | inet6_dump_ifacaddr, NULL); | 6620 | inet6_dump_ifacaddr, 0); |
| 6621 | __rtnl_register(PF_INET6, RTM_GETNETCONF, inet6_netconf_get_devconf, | 6621 | __rtnl_register(PF_INET6, RTM_GETNETCONF, inet6_netconf_get_devconf, |
| 6622 | inet6_netconf_dump_devconf, NULL); | 6622 | inet6_netconf_dump_devconf, 0); |
| 6623 | 6623 | ||
| 6624 | ipv6_addr_label_rtnl_register(); | 6624 | ipv6_addr_label_rtnl_register(); |
| 6625 | 6625 | ||
diff --git a/net/ipv6/addrlabel.c b/net/ipv6/addrlabel.c index 7a428f65c7ec..cea5eb488013 100644 --- a/net/ipv6/addrlabel.c +++ b/net/ipv6/addrlabel.c | |||
| @@ -593,10 +593,10 @@ out: | |||
| 593 | void __init ipv6_addr_label_rtnl_register(void) | 593 | void __init ipv6_addr_label_rtnl_register(void) |
| 594 | { | 594 | { |
| 595 | __rtnl_register(PF_INET6, RTM_NEWADDRLABEL, ip6addrlbl_newdel, | 595 | __rtnl_register(PF_INET6, RTM_NEWADDRLABEL, ip6addrlbl_newdel, |
| 596 | NULL, NULL); | 596 | NULL, 0); |
| 597 | __rtnl_register(PF_INET6, RTM_DELADDRLABEL, ip6addrlbl_newdel, | 597 | __rtnl_register(PF_INET6, RTM_DELADDRLABEL, ip6addrlbl_newdel, |
| 598 | NULL, NULL); | 598 | NULL, 0); |
| 599 | __rtnl_register(PF_INET6, RTM_GETADDRLABEL, ip6addrlbl_get, | 599 | __rtnl_register(PF_INET6, RTM_GETADDRLABEL, ip6addrlbl_get, |
| 600 | ip6addrlbl_dump, NULL); | 600 | ip6addrlbl_dump, 0); |
| 601 | } | 601 | } |
| 602 | 602 | ||
diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c index 69ed0043d117..8c58c7558de0 100644 --- a/net/ipv6/ip6_fib.c +++ b/net/ipv6/ip6_fib.c | |||
| @@ -2038,7 +2038,7 @@ int __init fib6_init(void) | |||
| 2038 | goto out_kmem_cache_create; | 2038 | goto out_kmem_cache_create; |
| 2039 | 2039 | ||
| 2040 | ret = __rtnl_register(PF_INET6, RTM_GETROUTE, NULL, inet6_dump_fib, | 2040 | ret = __rtnl_register(PF_INET6, RTM_GETROUTE, NULL, inet6_dump_fib, |
| 2041 | NULL); | 2041 | 0); |
| 2042 | if (ret) | 2042 | if (ret) |
| 2043 | goto out_unregister_subsys; | 2043 | goto out_unregister_subsys; |
| 2044 | 2044 | ||
diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c index 7454850f2098..f5500f5444e9 100644 --- a/net/ipv6/ip6mr.c +++ b/net/ipv6/ip6mr.c | |||
| @@ -1427,7 +1427,7 @@ int __init ip6_mr_init(void) | |||
| 1427 | } | 1427 | } |
| 1428 | #endif | 1428 | #endif |
| 1429 | rtnl_register(RTNL_FAMILY_IP6MR, RTM_GETROUTE, NULL, | 1429 | rtnl_register(RTNL_FAMILY_IP6MR, RTM_GETROUTE, NULL, |
| 1430 | ip6mr_rtm_dumproute, NULL); | 1430 | ip6mr_rtm_dumproute, 0); |
| 1431 | return 0; | 1431 | return 0; |
| 1432 | #ifdef CONFIG_IPV6_PIMSM_V2 | 1432 | #ifdef CONFIG_IPV6_PIMSM_V2 |
| 1433 | add_proto_fail: | 1433 | add_proto_fail: |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index c73e61750642..035762fed07d 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
| @@ -4105,9 +4105,9 @@ int __init ip6_route_init(void) | |||
| 4105 | goto fib6_rules_init; | 4105 | goto fib6_rules_init; |
| 4106 | 4106 | ||
| 4107 | ret = -ENOBUFS; | 4107 | ret = -ENOBUFS; |
| 4108 | if (__rtnl_register(PF_INET6, RTM_NEWROUTE, inet6_rtm_newroute, NULL, NULL) || | 4108 | if (__rtnl_register(PF_INET6, RTM_NEWROUTE, inet6_rtm_newroute, NULL, 0) || |
| 4109 | __rtnl_register(PF_INET6, RTM_DELROUTE, inet6_rtm_delroute, NULL, NULL) || | 4109 | __rtnl_register(PF_INET6, RTM_DELROUTE, inet6_rtm_delroute, NULL, 0) || |
| 4110 | __rtnl_register(PF_INET6, RTM_GETROUTE, inet6_rtm_getroute, NULL, NULL)) | 4110 | __rtnl_register(PF_INET6, RTM_GETROUTE, inet6_rtm_getroute, NULL, 0)) |
| 4111 | goto out_register_late_subsys; | 4111 | goto out_register_late_subsys; |
| 4112 | 4112 | ||
| 4113 | ret = register_netdevice_notifier(&ip6_route_dev_notifier); | 4113 | ret = register_netdevice_notifier(&ip6_route_dev_notifier); |
diff --git a/net/mpls/af_mpls.c b/net/mpls/af_mpls.c index ea4f481839dd..c5b9ce41d66f 100644 --- a/net/mpls/af_mpls.c +++ b/net/mpls/af_mpls.c | |||
| @@ -2479,12 +2479,12 @@ static int __init mpls_init(void) | |||
| 2479 | 2479 | ||
| 2480 | rtnl_af_register(&mpls_af_ops); | 2480 | rtnl_af_register(&mpls_af_ops); |
| 2481 | 2481 | ||
| 2482 | rtnl_register(PF_MPLS, RTM_NEWROUTE, mpls_rtm_newroute, NULL, NULL); | 2482 | rtnl_register(PF_MPLS, RTM_NEWROUTE, mpls_rtm_newroute, NULL, 0); |
| 2483 | rtnl_register(PF_MPLS, RTM_DELROUTE, mpls_rtm_delroute, NULL, NULL); | 2483 | rtnl_register(PF_MPLS, RTM_DELROUTE, mpls_rtm_delroute, NULL, 0); |
| 2484 | rtnl_register(PF_MPLS, RTM_GETROUTE, mpls_getroute, mpls_dump_routes, | 2484 | rtnl_register(PF_MPLS, RTM_GETROUTE, mpls_getroute, mpls_dump_routes, |
| 2485 | NULL); | 2485 | 0); |
| 2486 | rtnl_register(PF_MPLS, RTM_GETNETCONF, mpls_netconf_get_devconf, | 2486 | rtnl_register(PF_MPLS, RTM_GETNETCONF, mpls_netconf_get_devconf, |
| 2487 | mpls_netconf_dump_devconf, NULL); | 2487 | mpls_netconf_dump_devconf, 0); |
| 2488 | err = 0; | 2488 | err = 0; |
| 2489 | out: | 2489 | out: |
| 2490 | return err; | 2490 | return err; |
diff --git a/net/phonet/pn_netlink.c b/net/phonet/pn_netlink.c index 45b3af3080d8..da754fc926e7 100644 --- a/net/phonet/pn_netlink.c +++ b/net/phonet/pn_netlink.c | |||
| @@ -300,15 +300,15 @@ out: | |||
| 300 | int __init phonet_netlink_register(void) | 300 | int __init phonet_netlink_register(void) |
| 301 | { | 301 | { |
| 302 | int err = __rtnl_register(PF_PHONET, RTM_NEWADDR, addr_doit, | 302 | int err = __rtnl_register(PF_PHONET, RTM_NEWADDR, addr_doit, |
| 303 | NULL, NULL); | 303 | NULL, 0); |
| 304 | if (err) | 304 | if (err) |
| 305 | return err; | 305 | return err; |
| 306 | 306 | ||
| 307 | /* Further __rtnl_register() cannot fail */ | 307 | /* Further __rtnl_register() cannot fail */ |
| 308 | __rtnl_register(PF_PHONET, RTM_DELADDR, addr_doit, NULL, NULL); | 308 | __rtnl_register(PF_PHONET, RTM_DELADDR, addr_doit, NULL, 0); |
| 309 | __rtnl_register(PF_PHONET, RTM_GETADDR, NULL, getaddr_dumpit, NULL); | 309 | __rtnl_register(PF_PHONET, RTM_GETADDR, NULL, getaddr_dumpit, 0); |
| 310 | __rtnl_register(PF_PHONET, RTM_NEWROUTE, route_doit, NULL, NULL); | 310 | __rtnl_register(PF_PHONET, RTM_NEWROUTE, route_doit, NULL, 0); |
| 311 | __rtnl_register(PF_PHONET, RTM_DELROUTE, route_doit, NULL, NULL); | 311 | __rtnl_register(PF_PHONET, RTM_DELROUTE, route_doit, NULL, 0); |
| 312 | __rtnl_register(PF_PHONET, RTM_GETROUTE, NULL, route_dumpit, NULL); | 312 | __rtnl_register(PF_PHONET, RTM_GETROUTE, NULL, route_dumpit, 0); |
| 313 | return 0; | 313 | return 0; |
| 314 | } | 314 | } |
diff --git a/net/qrtr/qrtr.c b/net/qrtr/qrtr.c index 5586609afa27..c2f5c13550c0 100644 --- a/net/qrtr/qrtr.c +++ b/net/qrtr/qrtr.c | |||
| @@ -1081,7 +1081,7 @@ static int __init qrtr_proto_init(void) | |||
| 1081 | return rc; | 1081 | return rc; |
| 1082 | } | 1082 | } |
| 1083 | 1083 | ||
| 1084 | rtnl_register(PF_QIPCRTR, RTM_NEWADDR, qrtr_addr_doit, NULL, NULL); | 1084 | rtnl_register(PF_QIPCRTR, RTM_NEWADDR, qrtr_addr_doit, NULL, 0); |
| 1085 | 1085 | ||
| 1086 | return 0; | 1086 | return 0; |
| 1087 | } | 1087 | } |
diff --git a/net/sched/act_api.c b/net/sched/act_api.c index a2915d958279..02fcb0c78a28 100644 --- a/net/sched/act_api.c +++ b/net/sched/act_api.c | |||
| @@ -1255,10 +1255,10 @@ out_module_put: | |||
| 1255 | 1255 | ||
| 1256 | static int __init tc_action_init(void) | 1256 | static int __init tc_action_init(void) |
| 1257 | { | 1257 | { |
| 1258 | rtnl_register(PF_UNSPEC, RTM_NEWACTION, tc_ctl_action, NULL, NULL); | 1258 | rtnl_register(PF_UNSPEC, RTM_NEWACTION, tc_ctl_action, NULL, 0); |
| 1259 | rtnl_register(PF_UNSPEC, RTM_DELACTION, tc_ctl_action, NULL, NULL); | 1259 | rtnl_register(PF_UNSPEC, RTM_DELACTION, tc_ctl_action, NULL, 0); |
| 1260 | rtnl_register(PF_UNSPEC, RTM_GETACTION, tc_ctl_action, tc_dump_action, | 1260 | rtnl_register(PF_UNSPEC, RTM_GETACTION, tc_ctl_action, tc_dump_action, |
| 1261 | NULL); | 1261 | 0); |
| 1262 | 1262 | ||
| 1263 | return 0; | 1263 | return 0; |
| 1264 | } | 1264 | } |
diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c index 8d1157aebaf7..ebeeb87e6d44 100644 --- a/net/sched/cls_api.c +++ b/net/sched/cls_api.c | |||
| @@ -1010,10 +1010,10 @@ EXPORT_SYMBOL(tcf_exts_get_dev); | |||
| 1010 | 1010 | ||
| 1011 | static int __init tc_filter_init(void) | 1011 | static int __init tc_filter_init(void) |
| 1012 | { | 1012 | { |
| 1013 | rtnl_register(PF_UNSPEC, RTM_NEWTFILTER, tc_ctl_tfilter, NULL, NULL); | 1013 | rtnl_register(PF_UNSPEC, RTM_NEWTFILTER, tc_ctl_tfilter, NULL, 0); |
| 1014 | rtnl_register(PF_UNSPEC, RTM_DELTFILTER, tc_ctl_tfilter, NULL, NULL); | 1014 | rtnl_register(PF_UNSPEC, RTM_DELTFILTER, tc_ctl_tfilter, NULL, 0); |
| 1015 | rtnl_register(PF_UNSPEC, RTM_GETTFILTER, tc_ctl_tfilter, | 1015 | rtnl_register(PF_UNSPEC, RTM_GETTFILTER, tc_ctl_tfilter, |
| 1016 | tc_dump_tfilter, NULL); | 1016 | tc_dump_tfilter, 0); |
| 1017 | 1017 | ||
| 1018 | return 0; | 1018 | return 0; |
| 1019 | } | 1019 | } |
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c index bd24a550e0f9..816c8092e601 100644 --- a/net/sched/sch_api.c +++ b/net/sched/sch_api.c | |||
| @@ -1952,14 +1952,14 @@ static int __init pktsched_init(void) | |||
| 1952 | register_qdisc(&mq_qdisc_ops); | 1952 | register_qdisc(&mq_qdisc_ops); |
| 1953 | register_qdisc(&noqueue_qdisc_ops); | 1953 | register_qdisc(&noqueue_qdisc_ops); |
| 1954 | 1954 | ||
| 1955 | rtnl_register(PF_UNSPEC, RTM_NEWQDISC, tc_modify_qdisc, NULL, NULL); | 1955 | rtnl_register(PF_UNSPEC, RTM_NEWQDISC, tc_modify_qdisc, NULL, 0); |
| 1956 | rtnl_register(PF_UNSPEC, RTM_DELQDISC, tc_get_qdisc, NULL, NULL); | 1956 | rtnl_register(PF_UNSPEC, RTM_DELQDISC, tc_get_qdisc, NULL, 0); |
| 1957 | rtnl_register(PF_UNSPEC, RTM_GETQDISC, tc_get_qdisc, tc_dump_qdisc, | 1957 | rtnl_register(PF_UNSPEC, RTM_GETQDISC, tc_get_qdisc, tc_dump_qdisc, |
| 1958 | NULL); | 1958 | 0); |
| 1959 | rtnl_register(PF_UNSPEC, RTM_NEWTCLASS, tc_ctl_tclass, NULL, NULL); | 1959 | rtnl_register(PF_UNSPEC, RTM_NEWTCLASS, tc_ctl_tclass, NULL, 0); |
| 1960 | rtnl_register(PF_UNSPEC, RTM_DELTCLASS, tc_ctl_tclass, NULL, NULL); | 1960 | rtnl_register(PF_UNSPEC, RTM_DELTCLASS, tc_ctl_tclass, NULL, 0); |
| 1961 | rtnl_register(PF_UNSPEC, RTM_GETTCLASS, tc_ctl_tclass, tc_dump_tclass, | 1961 | rtnl_register(PF_UNSPEC, RTM_GETTCLASS, tc_ctl_tclass, tc_dump_tclass, |
| 1962 | NULL); | 1962 | 0); |
| 1963 | 1963 | ||
| 1964 | return 0; | 1964 | return 0; |
| 1965 | } | 1965 | } |
