diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/bridge/br_netlink.c | 4 | ||||
| -rw-r--r-- | net/core/fib_rules.c | 4 | ||||
| -rw-r--r-- | net/core/neighbour.c | 4 | ||||
| -rw-r--r-- | net/core/rtnetlink.c | 63 | ||||
| -rw-r--r-- | net/decnet/dn_dev.c | 4 | ||||
| -rw-r--r-- | net/decnet/dn_route.c | 2 | ||||
| -rw-r--r-- | net/decnet/dn_table.c | 4 | ||||
| -rw-r--r-- | net/ipv4/devinet.c | 4 | ||||
| -rw-r--r-- | net/ipv4/fib_semantics.c | 4 | ||||
| -rw-r--r-- | net/ipv4/ipmr.c | 4 | ||||
| -rw-r--r-- | net/ipv4/route.c | 2 | ||||
| -rw-r--r-- | net/ipv6/addrconf.c | 14 | ||||
| -rw-r--r-- | net/ipv6/addrlabel.c | 2 | ||||
| -rw-r--r-- | net/ipv6/ndisc.c | 5 | ||||
| -rw-r--r-- | net/ipv6/route.c | 6 | ||||
| -rw-r--r-- | net/sched/act_api.c | 8 | ||||
| -rw-r--r-- | net/sched/cls_api.c | 2 | ||||
| -rw-r--r-- | net/sched/sch_api.c | 4 | ||||
| -rw-r--r-- | net/wireless/wext.c | 5 |
19 files changed, 95 insertions, 50 deletions
diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c index a4ffa2b63cd5..f5d69336d97b 100644 --- a/net/bridge/br_netlink.c +++ b/net/bridge/br_netlink.c | |||
| @@ -97,10 +97,10 @@ void br_ifinfo_notify(int event, struct net_bridge_port *port) | |||
| 97 | kfree_skb(skb); | 97 | kfree_skb(skb); |
| 98 | goto errout; | 98 | goto errout; |
| 99 | } | 99 | } |
| 100 | err = rtnl_notify(skb, 0, RTNLGRP_LINK, NULL, GFP_ATOMIC); | 100 | err = rtnl_notify(skb, &init_net,0, RTNLGRP_LINK, NULL, GFP_ATOMIC); |
| 101 | errout: | 101 | errout: |
| 102 | if (err < 0) | 102 | if (err < 0) |
| 103 | rtnl_set_sk_err(RTNLGRP_LINK, err); | 103 | rtnl_set_sk_err(&init_net, RTNLGRP_LINK, err); |
| 104 | } | 104 | } |
| 105 | 105 | ||
| 106 | /* | 106 | /* |
diff --git a/net/core/fib_rules.c b/net/core/fib_rules.c index 3b20b6f0982e..0af0538343da 100644 --- a/net/core/fib_rules.c +++ b/net/core/fib_rules.c | |||
| @@ -599,10 +599,10 @@ static void notify_rule_change(int event, struct fib_rule *rule, | |||
| 599 | kfree_skb(skb); | 599 | kfree_skb(skb); |
| 600 | goto errout; | 600 | goto errout; |
| 601 | } | 601 | } |
| 602 | err = rtnl_notify(skb, pid, ops->nlgroup, nlh, GFP_KERNEL); | 602 | err = rtnl_notify(skb, &init_net, pid, ops->nlgroup, nlh, GFP_KERNEL); |
| 603 | errout: | 603 | errout: |
| 604 | if (err < 0) | 604 | if (err < 0) |
| 605 | rtnl_set_sk_err(ops->nlgroup, err); | 605 | rtnl_set_sk_err(&init_net, ops->nlgroup, err); |
| 606 | } | 606 | } |
| 607 | 607 | ||
| 608 | static void attach_rules(struct list_head *rules, struct net_device *dev) | 608 | static void attach_rules(struct list_head *rules, struct net_device *dev) |
diff --git a/net/core/neighbour.c b/net/core/neighbour.c index 29f0a4d2008f..a8b72c1c7c8a 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c | |||
| @@ -2467,10 +2467,10 @@ static void __neigh_notify(struct neighbour *n, int type, int flags) | |||
| 2467 | kfree_skb(skb); | 2467 | kfree_skb(skb); |
| 2468 | goto errout; | 2468 | goto errout; |
| 2469 | } | 2469 | } |
| 2470 | err = rtnl_notify(skb, 0, RTNLGRP_NEIGH, NULL, GFP_ATOMIC); | 2470 | err = rtnl_notify(skb, &init_net, 0, RTNLGRP_NEIGH, NULL, GFP_ATOMIC); |
| 2471 | errout: | 2471 | errout: |
| 2472 | if (err < 0) | 2472 | if (err < 0) |
| 2473 | rtnl_set_sk_err(RTNLGRP_NEIGH, err); | 2473 | rtnl_set_sk_err(&init_net, RTNLGRP_NEIGH, err); |
| 2474 | } | 2474 | } |
| 2475 | 2475 | ||
| 2476 | #ifdef CONFIG_ARPD | 2476 | #ifdef CONFIG_ARPD |
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 4edc3dac4ccd..9efaf35934f4 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
| @@ -60,7 +60,6 @@ struct rtnl_link | |||
| 60 | }; | 60 | }; |
| 61 | 61 | ||
| 62 | static DEFINE_MUTEX(rtnl_mutex); | 62 | static DEFINE_MUTEX(rtnl_mutex); |
| 63 | static struct sock *rtnl; | ||
| 64 | 63 | ||
| 65 | void rtnl_lock(void) | 64 | void rtnl_lock(void) |
| 66 | { | 65 | { |
| @@ -458,8 +457,9 @@ size_t rtattr_strlcpy(char *dest, const struct rtattr *rta, size_t size) | |||
| 458 | return ret; | 457 | return ret; |
| 459 | } | 458 | } |
| 460 | 459 | ||
| 461 | int rtnetlink_send(struct sk_buff *skb, u32 pid, unsigned group, int echo) | 460 | int rtnetlink_send(struct sk_buff *skb, struct net *net, u32 pid, unsigned group, int echo) |
| 462 | { | 461 | { |
| 462 | struct sock *rtnl = net->rtnl; | ||
| 463 | int err = 0; | 463 | int err = 0; |
| 464 | 464 | ||
| 465 | NETLINK_CB(skb).dst_group = group; | 465 | NETLINK_CB(skb).dst_group = group; |
| @@ -471,14 +471,17 @@ int rtnetlink_send(struct sk_buff *skb, u32 pid, unsigned group, int echo) | |||
| 471 | return err; | 471 | return err; |
| 472 | } | 472 | } |
| 473 | 473 | ||
| 474 | int rtnl_unicast(struct sk_buff *skb, u32 pid) | 474 | int rtnl_unicast(struct sk_buff *skb, struct net *net, u32 pid) |
| 475 | { | 475 | { |
| 476 | struct sock *rtnl = net->rtnl; | ||
| 477 | |||
| 476 | return nlmsg_unicast(rtnl, skb, pid); | 478 | return nlmsg_unicast(rtnl, skb, pid); |
| 477 | } | 479 | } |
| 478 | 480 | ||
| 479 | int rtnl_notify(struct sk_buff *skb, u32 pid, u32 group, | 481 | int rtnl_notify(struct sk_buff *skb, struct net *net, u32 pid, u32 group, |
| 480 | struct nlmsghdr *nlh, gfp_t flags) | 482 | struct nlmsghdr *nlh, gfp_t flags) |
| 481 | { | 483 | { |
| 484 | struct sock *rtnl = net->rtnl; | ||
| 482 | int report = 0; | 485 | int report = 0; |
| 483 | 486 | ||
| 484 | if (nlh) | 487 | if (nlh) |
| @@ -487,8 +490,10 @@ int rtnl_notify(struct sk_buff *skb, u32 pid, u32 group, | |||
| 487 | return nlmsg_notify(rtnl, skb, pid, group, report, flags); | 490 | return nlmsg_notify(rtnl, skb, pid, group, report, flags); |
| 488 | } | 491 | } |
| 489 | 492 | ||
| 490 | void rtnl_set_sk_err(u32 group, int error) | 493 | void rtnl_set_sk_err(struct net *net, u32 group, int error) |
| 491 | { | 494 | { |
| 495 | struct sock *rtnl = net->rtnl; | ||
| 496 | |||
| 492 | netlink_set_err(rtnl, 0, group, error); | 497 | netlink_set_err(rtnl, 0, group, error); |
| 493 | } | 498 | } |
| 494 | 499 | ||
| @@ -1201,7 +1206,7 @@ static int rtnl_getlink(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg) | |||
| 1201 | kfree_skb(nskb); | 1206 | kfree_skb(nskb); |
| 1202 | goto errout; | 1207 | goto errout; |
| 1203 | } | 1208 | } |
| 1204 | err = rtnl_unicast(nskb, NETLINK_CB(skb).pid); | 1209 | err = rtnl_unicast(nskb, net, NETLINK_CB(skb).pid); |
| 1205 | errout: | 1210 | errout: |
| 1206 | dev_put(dev); | 1211 | dev_put(dev); |
| 1207 | 1212 | ||
| @@ -1252,10 +1257,10 @@ void rtmsg_ifinfo(int type, struct net_device *dev, unsigned change) | |||
| 1252 | kfree_skb(skb); | 1257 | kfree_skb(skb); |
| 1253 | goto errout; | 1258 | goto errout; |
| 1254 | } | 1259 | } |
| 1255 | err = rtnl_notify(skb, 0, RTNLGRP_LINK, NULL, GFP_KERNEL); | 1260 | err = rtnl_notify(skb, &init_net, 0, RTNLGRP_LINK, NULL, GFP_KERNEL); |
| 1256 | errout: | 1261 | errout: |
| 1257 | if (err < 0) | 1262 | if (err < 0) |
| 1258 | rtnl_set_sk_err(RTNLGRP_LINK, err); | 1263 | rtnl_set_sk_err(&init_net, RTNLGRP_LINK, err); |
| 1259 | } | 1264 | } |
| 1260 | 1265 | ||
| 1261 | /* Protected by RTNL sempahore. */ | 1266 | /* Protected by RTNL sempahore. */ |
| @@ -1266,6 +1271,7 @@ static int rtattr_max; | |||
| 1266 | 1271 | ||
| 1267 | static int rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) | 1272 | static int rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) |
| 1268 | { | 1273 | { |
| 1274 | struct net *net = skb->sk->sk_net; | ||
| 1269 | rtnl_doit_func doit; | 1275 | rtnl_doit_func doit; |
| 1270 | int sz_idx, kind; | 1276 | int sz_idx, kind; |
| 1271 | int min_len; | 1277 | int min_len; |
| @@ -1294,6 +1300,7 @@ static int rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
| 1294 | return -EPERM; | 1300 | return -EPERM; |
| 1295 | 1301 | ||
| 1296 | if (kind == 2 && nlh->nlmsg_flags&NLM_F_DUMP) { | 1302 | if (kind == 2 && nlh->nlmsg_flags&NLM_F_DUMP) { |
| 1303 | struct sock *rtnl; | ||
| 1297 | rtnl_dumpit_func dumpit; | 1304 | rtnl_dumpit_func dumpit; |
| 1298 | 1305 | ||
| 1299 | dumpit = rtnl_get_dumpit(family, type); | 1306 | dumpit = rtnl_get_dumpit(family, type); |
| @@ -1301,6 +1308,7 @@ static int rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
| 1301 | return -EOPNOTSUPP; | 1308 | return -EOPNOTSUPP; |
| 1302 | 1309 | ||
| 1303 | __rtnl_unlock(); | 1310 | __rtnl_unlock(); |
| 1311 | rtnl = net->rtnl; | ||
| 1304 | err = netlink_dump_start(rtnl, skb, nlh, dumpit, NULL); | 1312 | err = netlink_dump_start(rtnl, skb, nlh, dumpit, NULL); |
| 1305 | rtnl_lock(); | 1313 | rtnl_lock(); |
| 1306 | return err; | 1314 | return err; |
| @@ -1373,6 +1381,40 @@ static struct notifier_block rtnetlink_dev_notifier = { | |||
| 1373 | .notifier_call = rtnetlink_event, | 1381 | .notifier_call = rtnetlink_event, |
| 1374 | }; | 1382 | }; |
| 1375 | 1383 | ||
| 1384 | |||
| 1385 | static int rtnetlink_net_init(struct net *net) | ||
| 1386 | { | ||
| 1387 | struct sock *sk; | ||
| 1388 | sk = netlink_kernel_create(net, NETLINK_ROUTE, RTNLGRP_MAX, | ||
| 1389 | rtnetlink_rcv, &rtnl_mutex, THIS_MODULE); | ||
| 1390 | if (!sk) | ||
| 1391 | return -ENOMEM; | ||
| 1392 | |||
| 1393 | /* Don't hold an extra reference on the namespace */ | ||
| 1394 | put_net(sk->sk_net); | ||
| 1395 | net->rtnl = sk; | ||
| 1396 | return 0; | ||
| 1397 | } | ||
| 1398 | |||
| 1399 | static void rtnetlink_net_exit(struct net *net) | ||
| 1400 | { | ||
| 1401 | struct sock *sk = net->rtnl; | ||
| 1402 | if (sk) { | ||
| 1403 | /* At the last minute lie and say this is a socket for the | ||
| 1404 | * initial network namespace. So the socket will be safe to | ||
| 1405 | * free. | ||
| 1406 | */ | ||
| 1407 | sk->sk_net = get_net(&init_net); | ||
| 1408 | sock_put(sk); | ||
| 1409 | net->rtnl = NULL; | ||
| 1410 | } | ||
| 1411 | } | ||
| 1412 | |||
| 1413 | static struct pernet_operations rtnetlink_net_ops = { | ||
| 1414 | .init = rtnetlink_net_init, | ||
| 1415 | .exit = rtnetlink_net_exit, | ||
| 1416 | }; | ||
| 1417 | |||
| 1376 | void __init rtnetlink_init(void) | 1418 | void __init rtnetlink_init(void) |
| 1377 | { | 1419 | { |
| 1378 | int i; | 1420 | int i; |
| @@ -1385,10 +1427,9 @@ void __init rtnetlink_init(void) | |||
| 1385 | if (!rta_buf) | 1427 | if (!rta_buf) |
| 1386 | panic("rtnetlink_init: cannot allocate rta_buf\n"); | 1428 | panic("rtnetlink_init: cannot allocate rta_buf\n"); |
| 1387 | 1429 | ||
| 1388 | rtnl = netlink_kernel_create(&init_net, NETLINK_ROUTE, RTNLGRP_MAX, | 1430 | if (register_pernet_subsys(&rtnetlink_net_ops)) |
| 1389 | rtnetlink_rcv, &rtnl_mutex, THIS_MODULE); | ||
| 1390 | if (rtnl == NULL) | ||
| 1391 | panic("rtnetlink_init: cannot initialize rtnetlink\n"); | 1431 | panic("rtnetlink_init: cannot initialize rtnetlink\n"); |
| 1432 | |||
| 1392 | netlink_set_nonroot(NETLINK_ROUTE, NL_NONROOT_RECV); | 1433 | netlink_set_nonroot(NETLINK_ROUTE, NL_NONROOT_RECV); |
| 1393 | register_netdevice_notifier(&rtnetlink_dev_notifier); | 1434 | register_netdevice_notifier(&rtnetlink_dev_notifier); |
| 1394 | 1435 | ||
diff --git a/net/decnet/dn_dev.c b/net/decnet/dn_dev.c index 94256845a057..39c89c682047 100644 --- a/net/decnet/dn_dev.c +++ b/net/decnet/dn_dev.c | |||
| @@ -793,10 +793,10 @@ static void dn_ifaddr_notify(int event, struct dn_ifaddr *ifa) | |||
| 793 | kfree_skb(skb); | 793 | kfree_skb(skb); |
| 794 | goto errout; | 794 | goto errout; |
| 795 | } | 795 | } |
| 796 | err = rtnl_notify(skb, 0, RTNLGRP_DECnet_IFADDR, NULL, GFP_KERNEL); | 796 | err = rtnl_notify(skb, &init_net, 0, RTNLGRP_DECnet_IFADDR, NULL, GFP_KERNEL); |
| 797 | errout: | 797 | errout: |
| 798 | if (err < 0) | 798 | if (err < 0) |
| 799 | rtnl_set_sk_err(RTNLGRP_DECnet_IFADDR, err); | 799 | rtnl_set_sk_err(&init_net, RTNLGRP_DECnet_IFADDR, err); |
| 800 | } | 800 | } |
| 801 | 801 | ||
| 802 | static int dn_nl_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb) | 802 | static int dn_nl_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb) |
diff --git a/net/decnet/dn_route.c b/net/decnet/dn_route.c index 28aeba15cf12..5d742f1420d9 100644 --- a/net/decnet/dn_route.c +++ b/net/decnet/dn_route.c | |||
| @@ -1587,7 +1587,7 @@ static int dn_cache_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, void | |||
| 1587 | goto out_free; | 1587 | goto out_free; |
| 1588 | } | 1588 | } |
| 1589 | 1589 | ||
| 1590 | return rtnl_unicast(skb, NETLINK_CB(in_skb).pid); | 1590 | return rtnl_unicast(skb, &init_net, NETLINK_CB(in_skb).pid); |
| 1591 | 1591 | ||
| 1592 | out_free: | 1592 | out_free: |
| 1593 | kfree_skb(skb); | 1593 | kfree_skb(skb); |
diff --git a/net/decnet/dn_table.c b/net/decnet/dn_table.c index a3bdb8dd1fb2..e09d915dbd77 100644 --- a/net/decnet/dn_table.c +++ b/net/decnet/dn_table.c | |||
| @@ -375,10 +375,10 @@ static void dn_rtmsg_fib(int event, struct dn_fib_node *f, int z, u32 tb_id, | |||
| 375 | kfree_skb(skb); | 375 | kfree_skb(skb); |
| 376 | goto errout; | 376 | goto errout; |
| 377 | } | 377 | } |
| 378 | err = rtnl_notify(skb, pid, RTNLGRP_DECnet_ROUTE, nlh, GFP_KERNEL); | 378 | err = rtnl_notify(skb, &init_net, pid, RTNLGRP_DECnet_ROUTE, nlh, GFP_KERNEL); |
| 379 | errout: | 379 | errout: |
| 380 | if (err < 0) | 380 | if (err < 0) |
| 381 | rtnl_set_sk_err(RTNLGRP_DECnet_ROUTE, err); | 381 | rtnl_set_sk_err(&init_net, RTNLGRP_DECnet_ROUTE, err); |
| 382 | } | 382 | } |
| 383 | 383 | ||
| 384 | static __inline__ int dn_hash_dump_bucket(struct sk_buff *skb, | 384 | static __inline__ int dn_hash_dump_bucket(struct sk_buff *skb, |
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index c0eb26a0d0bc..6e75c884e1af 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c | |||
| @@ -1240,10 +1240,10 @@ static void rtmsg_ifa(int event, struct in_ifaddr* ifa, struct nlmsghdr *nlh, | |||
| 1240 | kfree_skb(skb); | 1240 | kfree_skb(skb); |
| 1241 | goto errout; | 1241 | goto errout; |
| 1242 | } | 1242 | } |
| 1243 | err = rtnl_notify(skb, pid, RTNLGRP_IPV4_IFADDR, nlh, GFP_KERNEL); | 1243 | err = rtnl_notify(skb, &init_net, pid, RTNLGRP_IPV4_IFADDR, nlh, GFP_KERNEL); |
| 1244 | errout: | 1244 | errout: |
| 1245 | if (err < 0) | 1245 | if (err < 0) |
| 1246 | rtnl_set_sk_err(RTNLGRP_IPV4_IFADDR, err); | 1246 | rtnl_set_sk_err(&init_net, RTNLGRP_IPV4_IFADDR, err); |
| 1247 | } | 1247 | } |
| 1248 | 1248 | ||
| 1249 | #ifdef CONFIG_SYSCTL | 1249 | #ifdef CONFIG_SYSCTL |
diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c index 1351a2617dce..33ec96001d90 100644 --- a/net/ipv4/fib_semantics.c +++ b/net/ipv4/fib_semantics.c | |||
| @@ -320,11 +320,11 @@ void rtmsg_fib(int event, __be32 key, struct fib_alias *fa, | |||
| 320 | kfree_skb(skb); | 320 | kfree_skb(skb); |
| 321 | goto errout; | 321 | goto errout; |
| 322 | } | 322 | } |
| 323 | err = rtnl_notify(skb, info->pid, RTNLGRP_IPV4_ROUTE, | 323 | err = rtnl_notify(skb, &init_net, info->pid, RTNLGRP_IPV4_ROUTE, |
| 324 | info->nlh, GFP_KERNEL); | 324 | info->nlh, GFP_KERNEL); |
| 325 | errout: | 325 | errout: |
| 326 | if (err < 0) | 326 | if (err < 0) |
| 327 | rtnl_set_sk_err(RTNLGRP_IPV4_ROUTE, err); | 327 | rtnl_set_sk_err(&init_net, RTNLGRP_IPV4_ROUTE, err); |
| 328 | } | 328 | } |
| 329 | 329 | ||
| 330 | /* Return the first fib alias matching TOS with | 330 | /* Return the first fib alias matching TOS with |
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index 8e5d47a60602..11879283ad52 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c | |||
| @@ -321,7 +321,7 @@ static void ipmr_destroy_unres(struct mfc_cache *c) | |||
| 321 | e->error = -ETIMEDOUT; | 321 | e->error = -ETIMEDOUT; |
| 322 | memset(&e->msg, 0, sizeof(e->msg)); | 322 | memset(&e->msg, 0, sizeof(e->msg)); |
| 323 | 323 | ||
| 324 | rtnl_unicast(skb, NETLINK_CB(skb).pid); | 324 | rtnl_unicast(skb, &init_net, NETLINK_CB(skb).pid); |
| 325 | } else | 325 | } else |
| 326 | kfree_skb(skb); | 326 | kfree_skb(skb); |
| 327 | } | 327 | } |
| @@ -533,7 +533,7 @@ static void ipmr_cache_resolve(struct mfc_cache *uc, struct mfc_cache *c) | |||
| 533 | memset(&e->msg, 0, sizeof(e->msg)); | 533 | memset(&e->msg, 0, sizeof(e->msg)); |
| 534 | } | 534 | } |
| 535 | 535 | ||
| 536 | rtnl_unicast(skb, NETLINK_CB(skb).pid); | 536 | rtnl_unicast(skb, &init_net, NETLINK_CB(skb).pid); |
| 537 | } else | 537 | } else |
| 538 | ip_mr_forward(skb, c, 0); | 538 | ip_mr_forward(skb, c, 0); |
| 539 | } | 539 | } |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 1d2839571d2f..e4b6fb4b1f4f 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
| @@ -2610,7 +2610,7 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void | |||
| 2610 | if (err <= 0) | 2610 | if (err <= 0) |
| 2611 | goto errout_free; | 2611 | goto errout_free; |
| 2612 | 2612 | ||
| 2613 | err = rtnl_unicast(skb, NETLINK_CB(in_skb).pid); | 2613 | err = rtnl_unicast(skb, &init_net, NETLINK_CB(in_skb).pid); |
| 2614 | errout: | 2614 | errout: |
| 2615 | return err; | 2615 | return err; |
| 2616 | 2616 | ||
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 26de8ee5095b..6c8b193474ba 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
| @@ -3397,7 +3397,7 @@ static int inet6_rtm_getaddr(struct sk_buff *in_skb, struct nlmsghdr* nlh, | |||
| 3397 | kfree_skb(skb); | 3397 | kfree_skb(skb); |
| 3398 | goto errout_ifa; | 3398 | goto errout_ifa; |
| 3399 | } | 3399 | } |
| 3400 | err = rtnl_unicast(skb, NETLINK_CB(in_skb).pid); | 3400 | err = rtnl_unicast(skb, &init_net, NETLINK_CB(in_skb).pid); |
| 3401 | errout_ifa: | 3401 | errout_ifa: |
| 3402 | in6_ifa_put(ifa); | 3402 | in6_ifa_put(ifa); |
| 3403 | errout: | 3403 | errout: |
| @@ -3420,10 +3420,10 @@ static void inet6_ifa_notify(int event, struct inet6_ifaddr *ifa) | |||
| 3420 | kfree_skb(skb); | 3420 | kfree_skb(skb); |
| 3421 | goto errout; | 3421 | goto errout; |
| 3422 | } | 3422 | } |
| 3423 | err = rtnl_notify(skb, 0, RTNLGRP_IPV6_IFADDR, NULL, GFP_ATOMIC); | 3423 | err = rtnl_notify(skb, &init_net, 0, RTNLGRP_IPV6_IFADDR, NULL, GFP_ATOMIC); |
| 3424 | errout: | 3424 | errout: |
| 3425 | if (err < 0) | 3425 | if (err < 0) |
| 3426 | rtnl_set_sk_err(RTNLGRP_IPV6_IFADDR, err); | 3426 | rtnl_set_sk_err(&init_net, RTNLGRP_IPV6_IFADDR, err); |
| 3427 | } | 3427 | } |
| 3428 | 3428 | ||
| 3429 | static inline void ipv6_store_devconf(struct ipv6_devconf *cnf, | 3429 | static inline void ipv6_store_devconf(struct ipv6_devconf *cnf, |
| @@ -3628,10 +3628,10 @@ void inet6_ifinfo_notify(int event, struct inet6_dev *idev) | |||
| 3628 | kfree_skb(skb); | 3628 | kfree_skb(skb); |
| 3629 | goto errout; | 3629 | goto errout; |
| 3630 | } | 3630 | } |
| 3631 | err = rtnl_notify(skb, 0, RTNLGRP_IPV6_IFADDR, NULL, GFP_ATOMIC); | 3631 | err = rtnl_notify(skb, &init_net, 0, RTNLGRP_IPV6_IFADDR, NULL, GFP_ATOMIC); |
| 3632 | errout: | 3632 | errout: |
| 3633 | if (err < 0) | 3633 | if (err < 0) |
| 3634 | rtnl_set_sk_err(RTNLGRP_IPV6_IFADDR, err); | 3634 | rtnl_set_sk_err(&init_net, RTNLGRP_IPV6_IFADDR, err); |
| 3635 | } | 3635 | } |
| 3636 | 3636 | ||
| 3637 | static inline size_t inet6_prefix_nlmsg_size(void) | 3637 | static inline size_t inet6_prefix_nlmsg_size(void) |
| @@ -3697,10 +3697,10 @@ static void inet6_prefix_notify(int event, struct inet6_dev *idev, | |||
| 3697 | kfree_skb(skb); | 3697 | kfree_skb(skb); |
| 3698 | goto errout; | 3698 | goto errout; |
| 3699 | } | 3699 | } |
| 3700 | err = rtnl_notify(skb, 0, RTNLGRP_IPV6_PREFIX, NULL, GFP_ATOMIC); | 3700 | err = rtnl_notify(skb, &init_net, 0, RTNLGRP_IPV6_PREFIX, NULL, GFP_ATOMIC); |
| 3701 | errout: | 3701 | errout: |
| 3702 | if (err < 0) | 3702 | if (err < 0) |
| 3703 | rtnl_set_sk_err(RTNLGRP_IPV6_PREFIX, err); | 3703 | rtnl_set_sk_err(&init_net, RTNLGRP_IPV6_PREFIX, err); |
| 3704 | } | 3704 | } |
| 3705 | 3705 | ||
| 3706 | static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp) | 3706 | static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp) |
diff --git a/net/ipv6/addrlabel.c b/net/ipv6/addrlabel.c index b9b5d5707142..6f1ca607edda 100644 --- a/net/ipv6/addrlabel.c +++ b/net/ipv6/addrlabel.c | |||
| @@ -549,7 +549,7 @@ static int ip6addrlbl_get(struct sk_buff *in_skb, struct nlmsghdr* nlh, | |||
| 549 | goto out; | 549 | goto out; |
| 550 | } | 550 | } |
| 551 | 551 | ||
| 552 | err = rtnl_unicast(skb, NETLINK_CB(in_skb).pid); | 552 | err = rtnl_unicast(skb, &init_net, NETLINK_CB(in_skb).pid); |
| 553 | out: | 553 | out: |
| 554 | return err; | 554 | return err; |
| 555 | } | 555 | } |
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index b2531f80317e..b87f9d245e2e 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c | |||
| @@ -1049,7 +1049,8 @@ static void ndisc_ra_useropt(struct sk_buff *ra, struct nd_opt_hdr *opt) | |||
| 1049 | &ipv6_hdr(ra)->saddr); | 1049 | &ipv6_hdr(ra)->saddr); |
| 1050 | nlmsg_end(skb, nlh); | 1050 | nlmsg_end(skb, nlh); |
| 1051 | 1051 | ||
| 1052 | err = rtnl_notify(skb, 0, RTNLGRP_ND_USEROPT, NULL, GFP_ATOMIC); | 1052 | err = rtnl_notify(skb, &init_net, 0, RTNLGRP_ND_USEROPT, NULL, |
| 1053 | GFP_ATOMIC); | ||
| 1053 | if (err < 0) | 1054 | if (err < 0) |
| 1054 | goto errout; | 1055 | goto errout; |
| 1055 | 1056 | ||
| @@ -1059,7 +1060,7 @@ nla_put_failure: | |||
| 1059 | nlmsg_free(skb); | 1060 | nlmsg_free(skb); |
| 1060 | err = -EMSGSIZE; | 1061 | err = -EMSGSIZE; |
| 1061 | errout: | 1062 | errout: |
| 1062 | rtnl_set_sk_err(RTNLGRP_ND_USEROPT, err); | 1063 | rtnl_set_sk_err(&init_net, RTNLGRP_ND_USEROPT, err); |
| 1063 | } | 1064 | } |
| 1064 | 1065 | ||
| 1065 | static void ndisc_router_discovery(struct sk_buff *skb) | 1066 | static void ndisc_router_discovery(struct sk_buff *skb) |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 5e1c5796761b..d7ec4c9ffc4b 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
| @@ -2230,7 +2230,7 @@ static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void | |||
| 2230 | goto errout; | 2230 | goto errout; |
| 2231 | } | 2231 | } |
| 2232 | 2232 | ||
| 2233 | err = rtnl_unicast(skb, NETLINK_CB(in_skb).pid); | 2233 | err = rtnl_unicast(skb, &init_net, NETLINK_CB(in_skb).pid); |
| 2234 | errout: | 2234 | errout: |
| 2235 | return err; | 2235 | return err; |
| 2236 | } | 2236 | } |
| @@ -2260,10 +2260,10 @@ void inet6_rt_notify(int event, struct rt6_info *rt, struct nl_info *info) | |||
| 2260 | kfree_skb(skb); | 2260 | kfree_skb(skb); |
| 2261 | goto errout; | 2261 | goto errout; |
| 2262 | } | 2262 | } |
| 2263 | err = rtnl_notify(skb, pid, RTNLGRP_IPV6_ROUTE, nlh, gfp_any()); | 2263 | err = rtnl_notify(skb, &init_net, pid, RTNLGRP_IPV6_ROUTE, nlh, gfp_any()); |
| 2264 | errout: | 2264 | errout: |
| 2265 | if (err < 0) | 2265 | if (err < 0) |
| 2266 | rtnl_set_sk_err(RTNLGRP_IPV6_ROUTE, err); | 2266 | rtnl_set_sk_err(&init_net, RTNLGRP_IPV6_ROUTE, err); |
| 2267 | } | 2267 | } |
| 2268 | 2268 | ||
| 2269 | /* | 2269 | /* |
diff --git a/net/sched/act_api.c b/net/sched/act_api.c index 852829139c67..81506474a4f7 100644 --- a/net/sched/act_api.c +++ b/net/sched/act_api.c | |||
| @@ -660,7 +660,7 @@ act_get_notify(u32 pid, struct nlmsghdr *n, struct tc_action *a, int event) | |||
| 660 | return -EINVAL; | 660 | return -EINVAL; |
| 661 | } | 661 | } |
| 662 | 662 | ||
| 663 | return rtnl_unicast(skb, pid); | 663 | return rtnl_unicast(skb, &init_net, pid); |
| 664 | } | 664 | } |
| 665 | 665 | ||
| 666 | static struct tc_action * | 666 | static struct tc_action * |
| @@ -781,7 +781,7 @@ static int tca_action_flush(struct rtattr *rta, struct nlmsghdr *n, u32 pid) | |||
| 781 | nlh->nlmsg_flags |= NLM_F_ROOT; | 781 | nlh->nlmsg_flags |= NLM_F_ROOT; |
| 782 | module_put(a->ops->owner); | 782 | module_put(a->ops->owner); |
| 783 | kfree(a); | 783 | kfree(a); |
| 784 | err = rtnetlink_send(skb, pid, RTNLGRP_TC, n->nlmsg_flags&NLM_F_ECHO); | 784 | err = rtnetlink_send(skb, &init_net, pid, RTNLGRP_TC, n->nlmsg_flags&NLM_F_ECHO); |
| 785 | if (err > 0) | 785 | if (err > 0) |
| 786 | return 0; | 786 | return 0; |
| 787 | 787 | ||
| @@ -844,7 +844,7 @@ tca_action_gd(struct rtattr *rta, struct nlmsghdr *n, u32 pid, int event) | |||
| 844 | 844 | ||
| 845 | /* now do the delete */ | 845 | /* now do the delete */ |
| 846 | tcf_action_destroy(head, 0); | 846 | tcf_action_destroy(head, 0); |
| 847 | ret = rtnetlink_send(skb, pid, RTNLGRP_TC, | 847 | ret = rtnetlink_send(skb, &init_net, pid, RTNLGRP_TC, |
| 848 | n->nlmsg_flags&NLM_F_ECHO); | 848 | n->nlmsg_flags&NLM_F_ECHO); |
| 849 | if (ret > 0) | 849 | if (ret > 0) |
| 850 | return 0; | 850 | return 0; |
| @@ -888,7 +888,7 @@ static int tcf_add_notify(struct tc_action *a, u32 pid, u32 seq, int event, | |||
| 888 | nlh->nlmsg_len = skb_tail_pointer(skb) - b; | 888 | nlh->nlmsg_len = skb_tail_pointer(skb) - b; |
| 889 | NETLINK_CB(skb).dst_group = RTNLGRP_TC; | 889 | NETLINK_CB(skb).dst_group = RTNLGRP_TC; |
| 890 | 890 | ||
| 891 | err = rtnetlink_send(skb, pid, RTNLGRP_TC, flags&NLM_F_ECHO); | 891 | err = rtnetlink_send(skb, &init_net, pid, RTNLGRP_TC, flags&NLM_F_ECHO); |
| 892 | if (err > 0) | 892 | if (err > 0) |
| 893 | err = 0; | 893 | err = 0; |
| 894 | return err; | 894 | return err; |
diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c index fdab6a530bba..80dccac769d0 100644 --- a/net/sched/cls_api.c +++ b/net/sched/cls_api.c | |||
| @@ -361,7 +361,7 @@ static int tfilter_notify(struct sk_buff *oskb, struct nlmsghdr *n, | |||
| 361 | return -EINVAL; | 361 | return -EINVAL; |
| 362 | } | 362 | } |
| 363 | 363 | ||
| 364 | return rtnetlink_send(skb, pid, RTNLGRP_TC, n->nlmsg_flags&NLM_F_ECHO); | 364 | return rtnetlink_send(skb, &init_net, pid, RTNLGRP_TC, n->nlmsg_flags&NLM_F_ECHO); |
| 365 | } | 365 | } |
| 366 | 366 | ||
| 367 | struct tcf_dump_args | 367 | struct tcf_dump_args |
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c index f30e3f7ad885..273c628be054 100644 --- a/net/sched/sch_api.c +++ b/net/sched/sch_api.c | |||
| @@ -872,7 +872,7 @@ static int qdisc_notify(struct sk_buff *oskb, struct nlmsghdr *n, | |||
| 872 | } | 872 | } |
| 873 | 873 | ||
| 874 | if (skb->len) | 874 | if (skb->len) |
| 875 | return rtnetlink_send(skb, pid, RTNLGRP_TC, n->nlmsg_flags&NLM_F_ECHO); | 875 | return rtnetlink_send(skb, &init_net, pid, RTNLGRP_TC, n->nlmsg_flags&NLM_F_ECHO); |
| 876 | 876 | ||
| 877 | err_out: | 877 | err_out: |
| 878 | kfree_skb(skb); | 878 | kfree_skb(skb); |
| @@ -1103,7 +1103,7 @@ static int tclass_notify(struct sk_buff *oskb, struct nlmsghdr *n, | |||
| 1103 | return -EINVAL; | 1103 | return -EINVAL; |
| 1104 | } | 1104 | } |
| 1105 | 1105 | ||
| 1106 | return rtnetlink_send(skb, pid, RTNLGRP_TC, n->nlmsg_flags&NLM_F_ECHO); | 1106 | return rtnetlink_send(skb, &init_net, pid, RTNLGRP_TC, n->nlmsg_flags&NLM_F_ECHO); |
| 1107 | } | 1107 | } |
| 1108 | 1108 | ||
| 1109 | struct qdisc_dump_args | 1109 | struct qdisc_dump_args |
diff --git a/net/wireless/wext.c b/net/wireless/wext.c index 47e80cc2077c..db03ed5ce055 100644 --- a/net/wireless/wext.c +++ b/net/wireless/wext.c | |||
| @@ -1137,7 +1137,7 @@ static void wireless_nlevent_process(unsigned long data) | |||
| 1137 | struct sk_buff *skb; | 1137 | struct sk_buff *skb; |
| 1138 | 1138 | ||
| 1139 | while ((skb = skb_dequeue(&wireless_nlevent_queue))) | 1139 | while ((skb = skb_dequeue(&wireless_nlevent_queue))) |
| 1140 | rtnl_notify(skb, 0, RTNLGRP_LINK, NULL, GFP_ATOMIC); | 1140 | rtnl_notify(skb, &init_net, 0, RTNLGRP_LINK, NULL, GFP_ATOMIC); |
| 1141 | } | 1141 | } |
| 1142 | 1142 | ||
| 1143 | static DECLARE_TASKLET(wireless_nlevent_tasklet, wireless_nlevent_process, 0); | 1143 | static DECLARE_TASKLET(wireless_nlevent_tasklet, wireless_nlevent_process, 0); |
| @@ -1189,6 +1189,9 @@ static void rtmsg_iwinfo(struct net_device *dev, char *event, int event_len) | |||
| 1189 | struct sk_buff *skb; | 1189 | struct sk_buff *skb; |
| 1190 | int err; | 1190 | int err; |
| 1191 | 1191 | ||
| 1192 | if (dev->nd_net != &init_net) | ||
| 1193 | return; | ||
| 1194 | |||
| 1192 | skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC); | 1195 | skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC); |
| 1193 | if (!skb) | 1196 | if (!skb) |
| 1194 | return; | 1197 | return; |
