aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
Diffstat (limited to 'net')
-rw-r--r--net/bridge/br_mdb.c6
-rw-r--r--net/can/gw.c6
-rw-r--r--net/core/fib_rules.c6
-rw-r--r--net/core/neighbour.c10
-rw-r--r--net/core/net_namespace.c5
-rw-r--r--net/core/rtnetlink.c216
-rw-r--r--net/dcb/dcbnl.c4
-rw-r--r--net/decnet/dn_dev.c6
-rw-r--r--net/decnet/dn_fib.c4
-rw-r--r--net/decnet/dn_route.c4
-rw-r--r--net/ipv4/devinet.c8
-rw-r--r--net/ipv4/fib_frontend.c6
-rw-r--r--net/ipv4/ipmr.c8
-rw-r--r--net/ipv4/route.c2
-rw-r--r--net/ipv6/addrconf.c14
-rw-r--r--net/ipv6/addrlabel.c6
-rw-r--r--net/ipv6/ip6_fib.c2
-rw-r--r--net/ipv6/ip6mr.c2
-rw-r--r--net/ipv6/route.c6
-rw-r--r--net/mpls/af_mpls.c8
-rw-r--r--net/phonet/pn_netlink.c12
-rw-r--r--net/qrtr/qrtr.c2
-rw-r--r--net/sched/act_api.c6
-rw-r--r--net/sched/cls_api.c6
-rw-r--r--net/sched/sch_api.c12
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
714void br_mdb_init(void) 714void 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
721void br_mdb_uninit(void) 721void 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(&notifier); 1032 register_netdevice_notifier(&notifier);
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(&notifier); 1035 unregister_netdevice_notifier(&notifier);
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 = {
1026static int __init fib_rules_init(void) 1026static 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
3262static int __init neigh_init(void) 3262static 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 @@
62struct rtnl_link { 62struct 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
68static DEFINE_MUTEX(rtnl_mutex); 68static DEFINE_MUTEX(rtnl_mutex);
@@ -127,7 +127,8 @@ bool lockdep_rtnl_is_held(void)
127EXPORT_SYMBOL(lockdep_rtnl_is_held); 127EXPORT_SYMBOL(lockdep_rtnl_is_held);
128#endif /* #ifdef CONFIG_PROVE_LOCKING */ 128#endif /* #ifdef CONFIG_PROVE_LOCKING */
129 129
130static struct rtnl_link *rtnl_msg_handlers[RTNL_FAMILY_MAX + 1]; 130static struct rtnl_link __rcu *rtnl_msg_handlers[RTNL_FAMILY_MAX + 1];
131static refcount_t rtnl_msg_handlers_ref[RTNL_FAMILY_MAX + 1];
131 132
132static inline int rtm_msgindex(int msgtype) 133static 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
146static 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
161static 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
176static 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 */
209int __rtnl_register(int protocol, int msgtype, 165int __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 */
250void rtnl_register(int protocol, int msgtype, 203void 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 */
268int rtnl_unregister(int protocol, int msgtype) 221int 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 */
293void rtnl_unregister_all(int protocol) 252void 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}
300EXPORT_SYMBOL_GPL(rtnl_unregister_all); 269EXPORT_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
4239err_unlock:
4240 rcu_read_unlock();
4241 return -EOPNOTSUPP;
4218} 4242}
4219 4243
4220static void rtnetlink_rcv(struct sk_buff *skb) 4244static 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
4227static int rtnetlink_bind(struct net *net, int group) 4249static 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:
593void __init ipv6_addr_label_rtnl_register(void) 593void __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
1433add_proto_fail: 1433add_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;
2489out: 2489out:
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:
300int __init phonet_netlink_register(void) 300int __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
1256static int __init tc_action_init(void) 1256static 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
1011static int __init tc_filter_init(void) 1011static 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}