diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-08 10:55:01 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-08 10:55:01 -0500 |
| commit | d7fc02c7bae7b1cf69269992cf880a43a350cdaa (patch) | |
| tree | a43d56fa72913a1cc98a0bbebe054d08581b3a7c /net/decnet | |
| parent | ee1262dbc65ce0b6234a915d8432171e8d77f518 (diff) | |
| parent | 28b4d5cc17c20786848cdc07b7ea237a309776bb (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6: (1815 commits)
mac80211: fix reorder buffer release
iwmc3200wifi: Enable wimax core through module parameter
iwmc3200wifi: Add wifi-wimax coexistence mode as a module parameter
iwmc3200wifi: Coex table command does not expect a response
iwmc3200wifi: Update wiwi priority table
iwlwifi: driver version track kernel version
iwlwifi: indicate uCode type when fail dump error/event log
iwl3945: remove duplicated event logging code
b43: fix two warnings
ipw2100: fix rebooting hang with driver loaded
cfg80211: indent regulatory messages with spaces
iwmc3200wifi: fix NULL pointer dereference in pmkid update
mac80211: Fix TX status reporting for injected data frames
ath9k: enable 2GHz band only if the device supports it
airo: Fix integer overflow warning
rt2x00: Fix padding bug on L2PAD devices.
WE: Fix set events not propagated
b43legacy: avoid PPC fault during resume
b43: avoid PPC fault during resume
tcp: fix a timewait refcnt race
...
Fix up conflicts due to sysctl cleanups (dead sysctl_check code and
CTL_UNNUMBERED removed) in
kernel/sysctl_check.c
net/ipv4/sysctl_net_ipv4.c
net/ipv6/addrconf.c
net/sctp/sysctl.c
Diffstat (limited to 'net/decnet')
| -rw-r--r-- | net/decnet/af_decnet.c | 15 | ||||
| -rw-r--r-- | net/decnet/dn_dev.c | 53 | ||||
| -rw-r--r-- | net/decnet/dn_fib.c | 10 | ||||
| -rw-r--r-- | net/decnet/dn_route.c | 10 | ||||
| -rw-r--r-- | net/decnet/dn_rules.c | 22 | ||||
| -rw-r--r-- | net/decnet/dn_table.c | 7 |
6 files changed, 65 insertions, 52 deletions
diff --git a/net/decnet/af_decnet.c b/net/decnet/af_decnet.c index 7a58c87baf17..2b494fac9468 100644 --- a/net/decnet/af_decnet.c +++ b/net/decnet/af_decnet.c | |||
| @@ -675,11 +675,12 @@ char *dn_addr2asc(__u16 addr, char *buf) | |||
| 675 | 675 | ||
| 676 | 676 | ||
| 677 | 677 | ||
| 678 | static int dn_create(struct net *net, struct socket *sock, int protocol) | 678 | static int dn_create(struct net *net, struct socket *sock, int protocol, |
| 679 | int kern) | ||
| 679 | { | 680 | { |
| 680 | struct sock *sk; | 681 | struct sock *sk; |
| 681 | 682 | ||
| 682 | if (net != &init_net) | 683 | if (!net_eq(net, &init_net)) |
| 683 | return -EAFNOSUPPORT; | 684 | return -EAFNOSUPPORT; |
| 684 | 685 | ||
| 685 | switch(sock->type) { | 686 | switch(sock->type) { |
| @@ -749,9 +750,9 @@ static int dn_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) | |||
| 749 | 750 | ||
| 750 | if (!(saddr->sdn_flags & SDF_WILD)) { | 751 | if (!(saddr->sdn_flags & SDF_WILD)) { |
| 751 | if (le16_to_cpu(saddr->sdn_nodeaddrl)) { | 752 | if (le16_to_cpu(saddr->sdn_nodeaddrl)) { |
| 752 | read_lock(&dev_base_lock); | 753 | rcu_read_lock(); |
| 753 | ldev = NULL; | 754 | ldev = NULL; |
| 754 | for_each_netdev(&init_net, dev) { | 755 | for_each_netdev_rcu(&init_net, dev) { |
| 755 | if (!dev->dn_ptr) | 756 | if (!dev->dn_ptr) |
| 756 | continue; | 757 | continue; |
| 757 | if (dn_dev_islocal(dev, dn_saddr2dn(saddr))) { | 758 | if (dn_dev_islocal(dev, dn_saddr2dn(saddr))) { |
| @@ -759,7 +760,7 @@ static int dn_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) | |||
| 759 | break; | 760 | break; |
| 760 | } | 761 | } |
| 761 | } | 762 | } |
| 762 | read_unlock(&dev_base_lock); | 763 | rcu_read_unlock(); |
| 763 | if (ldev == NULL) | 764 | if (ldev == NULL) |
| 764 | return -EADDRNOTAVAIL; | 765 | return -EADDRNOTAVAIL; |
| 765 | } | 766 | } |
| @@ -1955,7 +1956,7 @@ static int dn_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
| 1955 | } | 1956 | } |
| 1956 | 1957 | ||
| 1957 | if ((flags & MSG_TRYHARD) && sk->sk_dst_cache) | 1958 | if ((flags & MSG_TRYHARD) && sk->sk_dst_cache) |
| 1958 | dst_negative_advice(&sk->sk_dst_cache); | 1959 | dst_negative_advice(&sk->sk_dst_cache, sk); |
| 1959 | 1960 | ||
| 1960 | mss = scp->segsize_rem; | 1961 | mss = scp->segsize_rem; |
| 1961 | fctype = scp->services_rem & NSP_FC_MASK; | 1962 | fctype = scp->services_rem & NSP_FC_MASK; |
| @@ -2325,7 +2326,7 @@ static const struct file_operations dn_socket_seq_fops = { | |||
| 2325 | }; | 2326 | }; |
| 2326 | #endif | 2327 | #endif |
| 2327 | 2328 | ||
| 2328 | static struct net_proto_family dn_family_ops = { | 2329 | static const struct net_proto_family dn_family_ops = { |
| 2329 | .family = AF_DECnet, | 2330 | .family = AF_DECnet, |
| 2330 | .create = dn_create, | 2331 | .create = dn_create, |
| 2331 | .owner = THIS_MODULE, | 2332 | .owner = THIS_MODULE, |
diff --git a/net/decnet/dn_dev.c b/net/decnet/dn_dev.c index 1b1daeb151f2..238af093495b 100644 --- a/net/decnet/dn_dev.c +++ b/net/decnet/dn_dev.c | |||
| @@ -68,7 +68,7 @@ extern struct neigh_table dn_neigh_table; | |||
| 68 | */ | 68 | */ |
| 69 | __le16 decnet_address = 0; | 69 | __le16 decnet_address = 0; |
| 70 | 70 | ||
| 71 | static DEFINE_RWLOCK(dndev_lock); | 71 | static DEFINE_SPINLOCK(dndev_lock); |
| 72 | static struct net_device *decnet_default_device; | 72 | static struct net_device *decnet_default_device; |
| 73 | static BLOCKING_NOTIFIER_HEAD(dnaddr_chain); | 73 | static BLOCKING_NOTIFIER_HEAD(dnaddr_chain); |
| 74 | 74 | ||
| @@ -499,7 +499,8 @@ rarok: | |||
| 499 | struct net_device *dn_dev_get_default(void) | 499 | struct net_device *dn_dev_get_default(void) |
| 500 | { | 500 | { |
| 501 | struct net_device *dev; | 501 | struct net_device *dev; |
| 502 | read_lock(&dndev_lock); | 502 | |
| 503 | spin_lock(&dndev_lock); | ||
| 503 | dev = decnet_default_device; | 504 | dev = decnet_default_device; |
| 504 | if (dev) { | 505 | if (dev) { |
| 505 | if (dev->dn_ptr) | 506 | if (dev->dn_ptr) |
| @@ -507,7 +508,8 @@ struct net_device *dn_dev_get_default(void) | |||
| 507 | else | 508 | else |
| 508 | dev = NULL; | 509 | dev = NULL; |
| 509 | } | 510 | } |
| 510 | read_unlock(&dndev_lock); | 511 | spin_unlock(&dndev_lock); |
| 512 | |||
| 511 | return dev; | 513 | return dev; |
| 512 | } | 514 | } |
| 513 | 515 | ||
| @@ -517,13 +519,15 @@ int dn_dev_set_default(struct net_device *dev, int force) | |||
| 517 | int rv = -EBUSY; | 519 | int rv = -EBUSY; |
| 518 | if (!dev->dn_ptr) | 520 | if (!dev->dn_ptr) |
| 519 | return -ENODEV; | 521 | return -ENODEV; |
| 520 | write_lock(&dndev_lock); | 522 | |
| 523 | spin_lock(&dndev_lock); | ||
| 521 | if (force || decnet_default_device == NULL) { | 524 | if (force || decnet_default_device == NULL) { |
| 522 | old = decnet_default_device; | 525 | old = decnet_default_device; |
| 523 | decnet_default_device = dev; | 526 | decnet_default_device = dev; |
| 524 | rv = 0; | 527 | rv = 0; |
| 525 | } | 528 | } |
| 526 | write_unlock(&dndev_lock); | 529 | spin_unlock(&dndev_lock); |
| 530 | |||
| 527 | if (old) | 531 | if (old) |
| 528 | dev_put(old); | 532 | dev_put(old); |
| 529 | return rv; | 533 | return rv; |
| @@ -531,26 +535,29 @@ int dn_dev_set_default(struct net_device *dev, int force) | |||
| 531 | 535 | ||
| 532 | static void dn_dev_check_default(struct net_device *dev) | 536 | static void dn_dev_check_default(struct net_device *dev) |
| 533 | { | 537 | { |
| 534 | write_lock(&dndev_lock); | 538 | spin_lock(&dndev_lock); |
| 535 | if (dev == decnet_default_device) { | 539 | if (dev == decnet_default_device) { |
| 536 | decnet_default_device = NULL; | 540 | decnet_default_device = NULL; |
| 537 | } else { | 541 | } else { |
| 538 | dev = NULL; | 542 | dev = NULL; |
| 539 | } | 543 | } |
| 540 | write_unlock(&dndev_lock); | 544 | spin_unlock(&dndev_lock); |
| 545 | |||
| 541 | if (dev) | 546 | if (dev) |
| 542 | dev_put(dev); | 547 | dev_put(dev); |
| 543 | } | 548 | } |
| 544 | 549 | ||
| 550 | /* | ||
| 551 | * Called with RTNL | ||
| 552 | */ | ||
| 545 | static struct dn_dev *dn_dev_by_index(int ifindex) | 553 | static struct dn_dev *dn_dev_by_index(int ifindex) |
| 546 | { | 554 | { |
| 547 | struct net_device *dev; | 555 | struct net_device *dev; |
| 548 | struct dn_dev *dn_dev = NULL; | 556 | struct dn_dev *dn_dev = NULL; |
| 549 | dev = dev_get_by_index(&init_net, ifindex); | 557 | |
| 550 | if (dev) { | 558 | dev = __dev_get_by_index(&init_net, ifindex); |
| 559 | if (dev) | ||
| 551 | dn_dev = dev->dn_ptr; | 560 | dn_dev = dev->dn_ptr; |
| 552 | dev_put(dev); | ||
| 553 | } | ||
| 554 | 561 | ||
| 555 | return dn_dev; | 562 | return dn_dev; |
| 556 | } | 563 | } |
| @@ -571,7 +578,7 @@ static int dn_nl_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) | |||
| 571 | struct dn_ifaddr *ifa, **ifap; | 578 | struct dn_ifaddr *ifa, **ifap; |
| 572 | int err = -EINVAL; | 579 | int err = -EINVAL; |
| 573 | 580 | ||
| 574 | if (net != &init_net) | 581 | if (!net_eq(net, &init_net)) |
| 575 | goto errout; | 582 | goto errout; |
| 576 | 583 | ||
| 577 | err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, dn_ifa_policy); | 584 | err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, dn_ifa_policy); |
| @@ -610,7 +617,7 @@ static int dn_nl_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) | |||
| 610 | struct dn_ifaddr *ifa; | 617 | struct dn_ifaddr *ifa; |
| 611 | int err; | 618 | int err; |
| 612 | 619 | ||
| 613 | if (net != &init_net) | 620 | if (!net_eq(net, &init_net)) |
| 614 | return -EINVAL; | 621 | return -EINVAL; |
| 615 | 622 | ||
| 616 | err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, dn_ifa_policy); | 623 | err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, dn_ifa_policy); |
| @@ -724,7 +731,7 @@ static int dn_nl_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb) | |||
| 724 | struct dn_dev *dn_db; | 731 | struct dn_dev *dn_db; |
| 725 | struct dn_ifaddr *ifa; | 732 | struct dn_ifaddr *ifa; |
| 726 | 733 | ||
| 727 | if (net != &init_net) | 734 | if (!net_eq(net, &init_net)) |
| 728 | return 0; | 735 | return 0; |
| 729 | 736 | ||
| 730 | skip_ndevs = cb->args[0]; | 737 | skip_ndevs = cb->args[0]; |
| @@ -768,13 +775,17 @@ static int dn_dev_get_first(struct net_device *dev, __le16 *addr) | |||
| 768 | struct dn_dev *dn_db = (struct dn_dev *)dev->dn_ptr; | 775 | struct dn_dev *dn_db = (struct dn_dev *)dev->dn_ptr; |
| 769 | struct dn_ifaddr *ifa; | 776 | struct dn_ifaddr *ifa; |
| 770 | int rv = -ENODEV; | 777 | int rv = -ENODEV; |
| 778 | |||
| 771 | if (dn_db == NULL) | 779 | if (dn_db == NULL) |
| 772 | goto out; | 780 | goto out; |
| 781 | |||
| 782 | rtnl_lock(); | ||
| 773 | ifa = dn_db->ifa_list; | 783 | ifa = dn_db->ifa_list; |
| 774 | if (ifa != NULL) { | 784 | if (ifa != NULL) { |
| 775 | *addr = ifa->ifa_local; | 785 | *addr = ifa->ifa_local; |
| 776 | rv = 0; | 786 | rv = 0; |
| 777 | } | 787 | } |
| 788 | rtnl_unlock(); | ||
| 778 | out: | 789 | out: |
| 779 | return rv; | 790 | return rv; |
| 780 | } | 791 | } |
| @@ -796,9 +807,7 @@ int dn_dev_bind_default(__le16 *addr) | |||
| 796 | dev = dn_dev_get_default(); | 807 | dev = dn_dev_get_default(); |
| 797 | last_chance: | 808 | last_chance: |
| 798 | if (dev) { | 809 | if (dev) { |
| 799 | read_lock(&dev_base_lock); | ||
| 800 | rv = dn_dev_get_first(dev, addr); | 810 | rv = dn_dev_get_first(dev, addr); |
| 801 | read_unlock(&dev_base_lock); | ||
| 802 | dev_put(dev); | 811 | dev_put(dev); |
| 803 | if (rv == 0 || dev == init_net.loopback_dev) | 812 | if (rv == 0 || dev == init_net.loopback_dev) |
| 804 | return rv; | 813 | return rv; |
| @@ -1263,18 +1272,18 @@ static inline int is_dn_dev(struct net_device *dev) | |||
| 1263 | } | 1272 | } |
| 1264 | 1273 | ||
| 1265 | static void *dn_dev_seq_start(struct seq_file *seq, loff_t *pos) | 1274 | static void *dn_dev_seq_start(struct seq_file *seq, loff_t *pos) |
| 1266 | __acquires(&dev_base_lock) | 1275 | __acquires(rcu) |
| 1267 | { | 1276 | { |
| 1268 | int i; | 1277 | int i; |
| 1269 | struct net_device *dev; | 1278 | struct net_device *dev; |
| 1270 | 1279 | ||
| 1271 | read_lock(&dev_base_lock); | 1280 | rcu_read_lock(); |
| 1272 | 1281 | ||
| 1273 | if (*pos == 0) | 1282 | if (*pos == 0) |
| 1274 | return SEQ_START_TOKEN; | 1283 | return SEQ_START_TOKEN; |
| 1275 | 1284 | ||
| 1276 | i = 1; | 1285 | i = 1; |
| 1277 | for_each_netdev(&init_net, dev) { | 1286 | for_each_netdev_rcu(&init_net, dev) { |
| 1278 | if (!is_dn_dev(dev)) | 1287 | if (!is_dn_dev(dev)) |
| 1279 | continue; | 1288 | continue; |
| 1280 | 1289 | ||
| @@ -1295,7 +1304,7 @@ static void *dn_dev_seq_next(struct seq_file *seq, void *v, loff_t *pos) | |||
| 1295 | if (v == SEQ_START_TOKEN) | 1304 | if (v == SEQ_START_TOKEN) |
| 1296 | dev = net_device_entry(&init_net.dev_base_head); | 1305 | dev = net_device_entry(&init_net.dev_base_head); |
| 1297 | 1306 | ||
| 1298 | for_each_netdev_continue(&init_net, dev) { | 1307 | for_each_netdev_continue_rcu(&init_net, dev) { |
| 1299 | if (!is_dn_dev(dev)) | 1308 | if (!is_dn_dev(dev)) |
| 1300 | continue; | 1309 | continue; |
| 1301 | 1310 | ||
| @@ -1306,9 +1315,9 @@ static void *dn_dev_seq_next(struct seq_file *seq, void *v, loff_t *pos) | |||
| 1306 | } | 1315 | } |
| 1307 | 1316 | ||
| 1308 | static void dn_dev_seq_stop(struct seq_file *seq, void *v) | 1317 | static void dn_dev_seq_stop(struct seq_file *seq, void *v) |
| 1309 | __releases(&dev_base_lock) | 1318 | __releases(rcu) |
| 1310 | { | 1319 | { |
| 1311 | read_unlock(&dev_base_lock); | 1320 | rcu_read_unlock(); |
| 1312 | } | 1321 | } |
| 1313 | 1322 | ||
| 1314 | static char *dn_type2asc(char type) | 1323 | static char *dn_type2asc(char type) |
diff --git a/net/decnet/dn_fib.c b/net/decnet/dn_fib.c index 27ea2e9b080a..e9d48700e83a 100644 --- a/net/decnet/dn_fib.c +++ b/net/decnet/dn_fib.c | |||
| @@ -509,7 +509,7 @@ static int dn_fib_rtm_delroute(struct sk_buff *skb, struct nlmsghdr *nlh, void * | |||
| 509 | struct rtattr **rta = arg; | 509 | struct rtattr **rta = arg; |
| 510 | struct rtmsg *r = NLMSG_DATA(nlh); | 510 | struct rtmsg *r = NLMSG_DATA(nlh); |
| 511 | 511 | ||
| 512 | if (net != &init_net) | 512 | if (!net_eq(net, &init_net)) |
| 513 | return -EINVAL; | 513 | return -EINVAL; |
| 514 | 514 | ||
| 515 | if (dn_fib_check_attr(r, rta)) | 515 | if (dn_fib_check_attr(r, rta)) |
| @@ -529,7 +529,7 @@ static int dn_fib_rtm_newroute(struct sk_buff *skb, struct nlmsghdr *nlh, void * | |||
| 529 | struct rtattr **rta = arg; | 529 | struct rtattr **rta = arg; |
| 530 | struct rtmsg *r = NLMSG_DATA(nlh); | 530 | struct rtmsg *r = NLMSG_DATA(nlh); |
| 531 | 531 | ||
| 532 | if (net != &init_net) | 532 | if (!net_eq(net, &init_net)) |
| 533 | return -EINVAL; | 533 | return -EINVAL; |
| 534 | 534 | ||
| 535 | if (dn_fib_check_attr(r, rta)) | 535 | if (dn_fib_check_attr(r, rta)) |
| @@ -607,8 +607,8 @@ static void dn_fib_del_ifaddr(struct dn_ifaddr *ifa) | |||
| 607 | ASSERT_RTNL(); | 607 | ASSERT_RTNL(); |
| 608 | 608 | ||
| 609 | /* Scan device list */ | 609 | /* Scan device list */ |
| 610 | read_lock(&dev_base_lock); | 610 | rcu_read_lock(); |
| 611 | for_each_netdev(&init_net, dev) { | 611 | for_each_netdev_rcu(&init_net, dev) { |
| 612 | dn_db = dev->dn_ptr; | 612 | dn_db = dev->dn_ptr; |
| 613 | if (dn_db == NULL) | 613 | if (dn_db == NULL) |
| 614 | continue; | 614 | continue; |
| @@ -619,7 +619,7 @@ static void dn_fib_del_ifaddr(struct dn_ifaddr *ifa) | |||
| 619 | } | 619 | } |
| 620 | } | 620 | } |
| 621 | } | 621 | } |
| 622 | read_unlock(&dev_base_lock); | 622 | rcu_read_unlock(); |
| 623 | 623 | ||
| 624 | if (found_it == 0) { | 624 | if (found_it == 0) { |
| 625 | fib_magic(RTM_DELROUTE, RTN_LOCAL, ifa->ifa_local, 16, ifa); | 625 | fib_magic(RTM_DELROUTE, RTN_LOCAL, ifa->ifa_local, 16, ifa); |
diff --git a/net/decnet/dn_route.c b/net/decnet/dn_route.c index 57662cabaf9b..a03284061a31 100644 --- a/net/decnet/dn_route.c +++ b/net/decnet/dn_route.c | |||
| @@ -908,8 +908,8 @@ static int dn_route_output_slow(struct dst_entry **pprt, const struct flowi *old | |||
| 908 | dev_put(dev_out); | 908 | dev_put(dev_out); |
| 909 | goto out; | 909 | goto out; |
| 910 | } | 910 | } |
| 911 | read_lock(&dev_base_lock); | 911 | rcu_read_lock(); |
| 912 | for_each_netdev(&init_net, dev) { | 912 | for_each_netdev_rcu(&init_net, dev) { |
| 913 | if (!dev->dn_ptr) | 913 | if (!dev->dn_ptr) |
| 914 | continue; | 914 | continue; |
| 915 | if (!dn_dev_islocal(dev, oldflp->fld_src)) | 915 | if (!dn_dev_islocal(dev, oldflp->fld_src)) |
| @@ -922,7 +922,7 @@ static int dn_route_output_slow(struct dst_entry **pprt, const struct flowi *old | |||
| 922 | dev_out = dev; | 922 | dev_out = dev; |
| 923 | break; | 923 | break; |
| 924 | } | 924 | } |
| 925 | read_unlock(&dev_base_lock); | 925 | rcu_read_unlock(); |
| 926 | if (dev_out == NULL) | 926 | if (dev_out == NULL) |
| 927 | goto out; | 927 | goto out; |
| 928 | dev_hold(dev_out); | 928 | dev_hold(dev_out); |
| @@ -1517,7 +1517,7 @@ static int dn_cache_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, void | |||
| 1517 | struct sk_buff *skb; | 1517 | struct sk_buff *skb; |
| 1518 | struct flowi fl; | 1518 | struct flowi fl; |
| 1519 | 1519 | ||
| 1520 | if (net != &init_net) | 1520 | if (!net_eq(net, &init_net)) |
| 1521 | return -EINVAL; | 1521 | return -EINVAL; |
| 1522 | 1522 | ||
| 1523 | memset(&fl, 0, sizeof(fl)); | 1523 | memset(&fl, 0, sizeof(fl)); |
| @@ -1602,7 +1602,7 @@ int dn_cache_dump(struct sk_buff *skb, struct netlink_callback *cb) | |||
| 1602 | int h, s_h; | 1602 | int h, s_h; |
| 1603 | int idx, s_idx; | 1603 | int idx, s_idx; |
| 1604 | 1604 | ||
| 1605 | if (net != &init_net) | 1605 | if (!net_eq(net, &init_net)) |
| 1606 | return 0; | 1606 | return 0; |
| 1607 | 1607 | ||
| 1608 | if (NLMSG_PAYLOAD(cb->nlh, 0) < sizeof(struct rtmsg)) | 1608 | if (NLMSG_PAYLOAD(cb->nlh, 0) < sizeof(struct rtmsg)) |
diff --git a/net/decnet/dn_rules.c b/net/decnet/dn_rules.c index 72495f25269f..7466c546f286 100644 --- a/net/decnet/dn_rules.c +++ b/net/decnet/dn_rules.c | |||
| @@ -33,7 +33,7 @@ | |||
| 33 | #include <net/dn_dev.h> | 33 | #include <net/dn_dev.h> |
| 34 | #include <net/dn_route.h> | 34 | #include <net/dn_route.h> |
| 35 | 35 | ||
| 36 | static struct fib_rules_ops dn_fib_rules_ops; | 36 | static struct fib_rules_ops *dn_fib_rules_ops; |
| 37 | 37 | ||
| 38 | struct dn_fib_rule | 38 | struct dn_fib_rule |
| 39 | { | 39 | { |
| @@ -56,7 +56,7 @@ int dn_fib_lookup(struct flowi *flp, struct dn_fib_res *res) | |||
| 56 | }; | 56 | }; |
| 57 | int err; | 57 | int err; |
| 58 | 58 | ||
| 59 | err = fib_rules_lookup(&dn_fib_rules_ops, flp, 0, &arg); | 59 | err = fib_rules_lookup(dn_fib_rules_ops, flp, 0, &arg); |
| 60 | res->r = arg.rule; | 60 | res->r = arg.rule; |
| 61 | 61 | ||
| 62 | return err; | 62 | return err; |
| @@ -217,9 +217,9 @@ static u32 dn_fib_rule_default_pref(struct fib_rules_ops *ops) | |||
| 217 | struct list_head *pos; | 217 | struct list_head *pos; |
| 218 | struct fib_rule *rule; | 218 | struct fib_rule *rule; |
| 219 | 219 | ||
| 220 | if (!list_empty(&dn_fib_rules_ops.rules_list)) { | 220 | if (!list_empty(&dn_fib_rules_ops->rules_list)) { |
| 221 | pos = dn_fib_rules_ops.rules_list.next; | 221 | pos = dn_fib_rules_ops->rules_list.next; |
| 222 | if (pos->next != &dn_fib_rules_ops.rules_list) { | 222 | if (pos->next != &dn_fib_rules_ops->rules_list) { |
| 223 | rule = list_entry(pos->next, struct fib_rule, list); | 223 | rule = list_entry(pos->next, struct fib_rule, list); |
| 224 | if (rule->pref) | 224 | if (rule->pref) |
| 225 | return rule->pref - 1; | 225 | return rule->pref - 1; |
| @@ -234,7 +234,7 @@ static void dn_fib_rule_flush_cache(struct fib_rules_ops *ops) | |||
| 234 | dn_rt_cache_flush(-1); | 234 | dn_rt_cache_flush(-1); |
| 235 | } | 235 | } |
| 236 | 236 | ||
| 237 | static struct fib_rules_ops dn_fib_rules_ops = { | 237 | static struct fib_rules_ops dn_fib_rules_ops_template = { |
| 238 | .family = AF_DECnet, | 238 | .family = AF_DECnet, |
| 239 | .rule_size = sizeof(struct dn_fib_rule), | 239 | .rule_size = sizeof(struct dn_fib_rule), |
| 240 | .addr_size = sizeof(u16), | 240 | .addr_size = sizeof(u16), |
| @@ -247,21 +247,23 @@ static struct fib_rules_ops dn_fib_rules_ops = { | |||
| 247 | .flush_cache = dn_fib_rule_flush_cache, | 247 | .flush_cache = dn_fib_rule_flush_cache, |
| 248 | .nlgroup = RTNLGRP_DECnet_RULE, | 248 | .nlgroup = RTNLGRP_DECnet_RULE, |
| 249 | .policy = dn_fib_rule_policy, | 249 | .policy = dn_fib_rule_policy, |
| 250 | .rules_list = LIST_HEAD_INIT(dn_fib_rules_ops.rules_list), | ||
| 251 | .owner = THIS_MODULE, | 250 | .owner = THIS_MODULE, |
| 252 | .fro_net = &init_net, | 251 | .fro_net = &init_net, |
| 253 | }; | 252 | }; |
| 254 | 253 | ||
| 255 | void __init dn_fib_rules_init(void) | 254 | void __init dn_fib_rules_init(void) |
| 256 | { | 255 | { |
| 257 | BUG_ON(fib_default_rule_add(&dn_fib_rules_ops, 0x7fff, | 256 | dn_fib_rules_ops = |
| 257 | fib_rules_register(&dn_fib_rules_ops_template, &init_net); | ||
| 258 | BUG_ON(IS_ERR(dn_fib_rules_ops)); | ||
| 259 | BUG_ON(fib_default_rule_add(dn_fib_rules_ops, 0x7fff, | ||
| 258 | RT_TABLE_MAIN, 0)); | 260 | RT_TABLE_MAIN, 0)); |
| 259 | fib_rules_register(&dn_fib_rules_ops); | ||
| 260 | } | 261 | } |
| 261 | 262 | ||
| 262 | void __exit dn_fib_rules_cleanup(void) | 263 | void __exit dn_fib_rules_cleanup(void) |
| 263 | { | 264 | { |
| 264 | fib_rules_unregister(&dn_fib_rules_ops); | 265 | fib_rules_unregister(dn_fib_rules_ops); |
| 266 | rcu_barrier(); | ||
| 265 | } | 267 | } |
| 266 | 268 | ||
| 267 | 269 | ||
diff --git a/net/decnet/dn_table.c b/net/decnet/dn_table.c index 67054b0d550f..b9a33bb5e9cc 100644 --- a/net/decnet/dn_table.c +++ b/net/decnet/dn_table.c | |||
| @@ -471,7 +471,7 @@ int dn_fib_dump(struct sk_buff *skb, struct netlink_callback *cb) | |||
| 471 | struct hlist_node *node; | 471 | struct hlist_node *node; |
| 472 | int dumped = 0; | 472 | int dumped = 0; |
| 473 | 473 | ||
| 474 | if (net != &init_net) | 474 | if (!net_eq(net, &init_net)) |
| 475 | return 0; | 475 | return 0; |
| 476 | 476 | ||
| 477 | if (NLMSG_PAYLOAD(cb->nlh, 0) >= sizeof(struct rtmsg) && | 477 | if (NLMSG_PAYLOAD(cb->nlh, 0) >= sizeof(struct rtmsg) && |
| @@ -581,8 +581,9 @@ static int dn_fib_table_insert(struct dn_fib_table *tb, struct rtmsg *r, struct | |||
| 581 | DN_FIB_SCAN_KEY(f, fp, key) { | 581 | DN_FIB_SCAN_KEY(f, fp, key) { |
| 582 | if (fi->fib_priority != DN_FIB_INFO(f)->fib_priority) | 582 | if (fi->fib_priority != DN_FIB_INFO(f)->fib_priority) |
| 583 | break; | 583 | break; |
| 584 | if (f->fn_type == type && f->fn_scope == r->rtm_scope | 584 | if (f->fn_type == type && |
| 585 | && DN_FIB_INFO(f) == fi) | 585 | f->fn_scope == r->rtm_scope && |
| 586 | DN_FIB_INFO(f) == fi) | ||
| 586 | goto out; | 587 | goto out; |
| 587 | } | 588 | } |
| 588 | 589 | ||
