aboutsummaryrefslogtreecommitdiffstats
path: root/net/decnet
diff options
context:
space:
mode:
authorAndrea Bastoni <bastoni@cs.unc.edu>2010-05-30 19:16:45 -0400
committerAndrea Bastoni <bastoni@cs.unc.edu>2010-05-30 19:16:45 -0400
commitada47b5fe13d89735805b566185f4885f5a3f750 (patch)
tree644b88f8a71896307d71438e9b3af49126ffb22b /net/decnet
parent43e98717ad40a4ae64545b5ba047c7b86aa44f4f (diff)
parent3280f21d43ee541f97f8cda5792150d2dbec20d5 (diff)
Merge branch 'wip-2.6.34' into old-private-masterarchived-private-master
Diffstat (limited to 'net/decnet')
-rw-r--r--net/decnet/af_decnet.c15
-rw-r--r--net/decnet/dn_dev.c118
-rw-r--r--net/decnet/dn_fib.c11
-rw-r--r--net/decnet/dn_neigh.c1
-rw-r--r--net/decnet/dn_nsp_in.c1
-rw-r--r--net/decnet/dn_nsp_out.c1
-rw-r--r--net/decnet/dn_route.c25
-rw-r--r--net/decnet/dn_rules.c22
-rw-r--r--net/decnet/dn_table.c8
-rw-r--r--net/decnet/netfilter/dn_rtmsg.c1
-rw-r--r--net/decnet/sysctl_net_decnet.c123
11 files changed, 86 insertions, 240 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
678static int dn_create(struct net *net, struct socket *sock, int protocol) 678static 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
2328static struct net_proto_family dn_family_ops = { 2329static 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 6e1f085db06a..cead68eb254c 100644
--- a/net/decnet/dn_dev.c
+++ b/net/decnet/dn_dev.c
@@ -40,6 +40,7 @@
40#include <linux/skbuff.h> 40#include <linux/skbuff.h>
41#include <linux/sysctl.h> 41#include <linux/sysctl.h>
42#include <linux/notifier.h> 42#include <linux/notifier.h>
43#include <linux/slab.h>
43#include <asm/uaccess.h> 44#include <asm/uaccess.h>
44#include <asm/system.h> 45#include <asm/system.h>
45#include <net/net_namespace.h> 46#include <net/net_namespace.h>
@@ -68,7 +69,7 @@ extern struct neigh_table dn_neigh_table;
68 */ 69 */
69__le16 decnet_address = 0; 70__le16 decnet_address = 0;
70 71
71static DEFINE_RWLOCK(dndev_lock); 72static DEFINE_SPINLOCK(dndev_lock);
72static struct net_device *decnet_default_device; 73static struct net_device *decnet_default_device;
73static BLOCKING_NOTIFIER_HEAD(dnaddr_chain); 74static BLOCKING_NOTIFIER_HEAD(dnaddr_chain);
74 75
@@ -89,7 +90,6 @@ static struct dn_dev_parms dn_dev_list[] = {
89 .t2 = 1, 90 .t2 = 1,
90 .t3 = 10, 91 .t3 = 10,
91 .name = "ethernet", 92 .name = "ethernet",
92 .ctl_name = NET_DECNET_CONF_ETHER,
93 .up = dn_eth_up, 93 .up = dn_eth_up,
94 .down = dn_eth_down, 94 .down = dn_eth_down,
95 .timer3 = dn_send_brd_hello, 95 .timer3 = dn_send_brd_hello,
@@ -101,7 +101,6 @@ static struct dn_dev_parms dn_dev_list[] = {
101 .t2 = 1, 101 .t2 = 1,
102 .t3 = 10, 102 .t3 = 10,
103 .name = "ipgre", 103 .name = "ipgre",
104 .ctl_name = NET_DECNET_CONF_GRE,
105 .timer3 = dn_send_brd_hello, 104 .timer3 = dn_send_brd_hello,
106}, 105},
107#if 0 106#if 0
@@ -112,7 +111,6 @@ static struct dn_dev_parms dn_dev_list[] = {
112 .t2 = 1, 111 .t2 = 1,
113 .t3 = 120, 112 .t3 = 120,
114 .name = "x25", 113 .name = "x25",
115 .ctl_name = NET_DECNET_CONF_X25,
116 .timer3 = dn_send_ptp_hello, 114 .timer3 = dn_send_ptp_hello,
117}, 115},
118#endif 116#endif
@@ -124,7 +122,6 @@ static struct dn_dev_parms dn_dev_list[] = {
124 .t2 = 1, 122 .t2 = 1,
125 .t3 = 10, 123 .t3 = 10,
126 .name = "ppp", 124 .name = "ppp",
127 .ctl_name = NET_DECNET_CONF_PPP,
128 .timer3 = dn_send_brd_hello, 125 .timer3 = dn_send_brd_hello,
129}, 126},
130#endif 127#endif
@@ -135,7 +132,6 @@ static struct dn_dev_parms dn_dev_list[] = {
135 .t2 = 1, 132 .t2 = 1,
136 .t3 = 120, 133 .t3 = 120,
137 .name = "ddcmp", 134 .name = "ddcmp",
138 .ctl_name = NET_DECNET_CONF_DDCMP,
139 .timer3 = dn_send_ptp_hello, 135 .timer3 = dn_send_ptp_hello,
140}, 136},
141{ 137{
@@ -145,7 +141,6 @@ static struct dn_dev_parms dn_dev_list[] = {
145 .t2 = 1, 141 .t2 = 1,
146 .t3 = 10, 142 .t3 = 10,
147 .name = "loopback", 143 .name = "loopback",
148 .ctl_name = NET_DECNET_CONF_LOOPBACK,
149 .timer3 = dn_send_brd_hello, 144 .timer3 = dn_send_brd_hello,
150} 145}
151}; 146};
@@ -166,10 +161,6 @@ static int max_priority[] = { 127 }; /* From DECnet spec */
166 161
167static int dn_forwarding_proc(ctl_table *, int, 162static int dn_forwarding_proc(ctl_table *, int,
168 void __user *, size_t *, loff_t *); 163 void __user *, size_t *, loff_t *);
169static int dn_forwarding_sysctl(ctl_table *table,
170 void __user *oldval, size_t __user *oldlenp,
171 void __user *newval, size_t newlen);
172
173static struct dn_dev_sysctl_table { 164static struct dn_dev_sysctl_table {
174 struct ctl_table_header *sysctl_header; 165 struct ctl_table_header *sysctl_header;
175 ctl_table dn_dev_vars[5]; 166 ctl_table dn_dev_vars[5];
@@ -177,44 +168,36 @@ static struct dn_dev_sysctl_table {
177 NULL, 168 NULL,
178 { 169 {
179 { 170 {
180 .ctl_name = NET_DECNET_CONF_DEV_FORWARDING,
181 .procname = "forwarding", 171 .procname = "forwarding",
182 .data = (void *)DN_DEV_PARMS_OFFSET(forwarding), 172 .data = (void *)DN_DEV_PARMS_OFFSET(forwarding),
183 .maxlen = sizeof(int), 173 .maxlen = sizeof(int),
184 .mode = 0644, 174 .mode = 0644,
185 .proc_handler = dn_forwarding_proc, 175 .proc_handler = dn_forwarding_proc,
186 .strategy = dn_forwarding_sysctl,
187 }, 176 },
188 { 177 {
189 .ctl_name = NET_DECNET_CONF_DEV_PRIORITY,
190 .procname = "priority", 178 .procname = "priority",
191 .data = (void *)DN_DEV_PARMS_OFFSET(priority), 179 .data = (void *)DN_DEV_PARMS_OFFSET(priority),
192 .maxlen = sizeof(int), 180 .maxlen = sizeof(int),
193 .mode = 0644, 181 .mode = 0644,
194 .proc_handler = proc_dointvec_minmax, 182 .proc_handler = proc_dointvec_minmax,
195 .strategy = sysctl_intvec,
196 .extra1 = &min_priority, 183 .extra1 = &min_priority,
197 .extra2 = &max_priority 184 .extra2 = &max_priority
198 }, 185 },
199 { 186 {
200 .ctl_name = NET_DECNET_CONF_DEV_T2,
201 .procname = "t2", 187 .procname = "t2",
202 .data = (void *)DN_DEV_PARMS_OFFSET(t2), 188 .data = (void *)DN_DEV_PARMS_OFFSET(t2),
203 .maxlen = sizeof(int), 189 .maxlen = sizeof(int),
204 .mode = 0644, 190 .mode = 0644,
205 .proc_handler = proc_dointvec_minmax, 191 .proc_handler = proc_dointvec_minmax,
206 .strategy = sysctl_intvec,
207 .extra1 = &min_t2, 192 .extra1 = &min_t2,
208 .extra2 = &max_t2 193 .extra2 = &max_t2
209 }, 194 },
210 { 195 {
211 .ctl_name = NET_DECNET_CONF_DEV_T3,
212 .procname = "t3", 196 .procname = "t3",
213 .data = (void *)DN_DEV_PARMS_OFFSET(t3), 197 .data = (void *)DN_DEV_PARMS_OFFSET(t3),
214 .maxlen = sizeof(int), 198 .maxlen = sizeof(int),
215 .mode = 0644, 199 .mode = 0644,
216 .proc_handler = proc_dointvec_minmax, 200 .proc_handler = proc_dointvec_minmax,
217 .strategy = sysctl_intvec,
218 .extra1 = &min_t3, 201 .extra1 = &min_t3,
219 .extra2 = &max_t3 202 .extra2 = &max_t3
220 }, 203 },
@@ -230,9 +213,9 @@ static void dn_dev_sysctl_register(struct net_device *dev, struct dn_dev_parms *
230#define DN_CTL_PATH_DEV 3 213#define DN_CTL_PATH_DEV 3
231 214
232 struct ctl_path dn_ctl_path[] = { 215 struct ctl_path dn_ctl_path[] = {
233 { .procname = "net", .ctl_name = CTL_NET, }, 216 { .procname = "net", },
234 { .procname = "decnet", .ctl_name = NET_DECNET, }, 217 { .procname = "decnet", },
235 { .procname = "conf", .ctl_name = NET_DECNET_CONF, }, 218 { .procname = "conf", },
236 { /* to be set */ }, 219 { /* to be set */ },
237 { }, 220 { },
238 }; 221 };
@@ -248,10 +231,8 @@ static void dn_dev_sysctl_register(struct net_device *dev, struct dn_dev_parms *
248 231
249 if (dev) { 232 if (dev) {
250 dn_ctl_path[DN_CTL_PATH_DEV].procname = dev->name; 233 dn_ctl_path[DN_CTL_PATH_DEV].procname = dev->name;
251 dn_ctl_path[DN_CTL_PATH_DEV].ctl_name = dev->ifindex;
252 } else { 234 } else {
253 dn_ctl_path[DN_CTL_PATH_DEV].procname = parms->name; 235 dn_ctl_path[DN_CTL_PATH_DEV].procname = parms->name;
254 dn_ctl_path[DN_CTL_PATH_DEV].ctl_name = parms->ctl_name;
255 } 236 }
256 237
257 t->dn_dev_vars[0].extra1 = (void *)dev; 238 t->dn_dev_vars[0].extra1 = (void *)dev;
@@ -317,44 +298,6 @@ static int dn_forwarding_proc(ctl_table *table, int write,
317#endif 298#endif
318} 299}
319 300
320static int dn_forwarding_sysctl(ctl_table *table,
321 void __user *oldval, size_t __user *oldlenp,
322 void __user *newval, size_t newlen)
323{
324#ifdef CONFIG_DECNET_ROUTER
325 struct net_device *dev = table->extra1;
326 struct dn_dev *dn_db;
327 int value;
328
329 if (table->extra1 == NULL)
330 return -EINVAL;
331
332 dn_db = dev->dn_ptr;
333
334 if (newval && newlen) {
335 if (newlen != sizeof(int))
336 return -EINVAL;
337
338 if (get_user(value, (int __user *)newval))
339 return -EFAULT;
340 if (value < 0)
341 return -EINVAL;
342 if (value > 2)
343 return -EINVAL;
344
345 if (dn_db->parms.down)
346 dn_db->parms.down(dev);
347 dn_db->parms.forwarding = value;
348 if (dn_db->parms.up)
349 dn_db->parms.up(dev);
350 }
351
352 return 0;
353#else
354 return -EINVAL;
355#endif
356}
357
358#else /* CONFIG_SYSCTL */ 301#else /* CONFIG_SYSCTL */
359static void dn_dev_sysctl_unregister(struct dn_dev_parms *parms) 302static void dn_dev_sysctl_unregister(struct dn_dev_parms *parms)
360{ 303{
@@ -557,7 +500,8 @@ rarok:
557struct net_device *dn_dev_get_default(void) 500struct net_device *dn_dev_get_default(void)
558{ 501{
559 struct net_device *dev; 502 struct net_device *dev;
560 read_lock(&dndev_lock); 503
504 spin_lock(&dndev_lock);
561 dev = decnet_default_device; 505 dev = decnet_default_device;
562 if (dev) { 506 if (dev) {
563 if (dev->dn_ptr) 507 if (dev->dn_ptr)
@@ -565,7 +509,8 @@ struct net_device *dn_dev_get_default(void)
565 else 509 else
566 dev = NULL; 510 dev = NULL;
567 } 511 }
568 read_unlock(&dndev_lock); 512 spin_unlock(&dndev_lock);
513
569 return dev; 514 return dev;
570} 515}
571 516
@@ -575,13 +520,15 @@ int dn_dev_set_default(struct net_device *dev, int force)
575 int rv = -EBUSY; 520 int rv = -EBUSY;
576 if (!dev->dn_ptr) 521 if (!dev->dn_ptr)
577 return -ENODEV; 522 return -ENODEV;
578 write_lock(&dndev_lock); 523
524 spin_lock(&dndev_lock);
579 if (force || decnet_default_device == NULL) { 525 if (force || decnet_default_device == NULL) {
580 old = decnet_default_device; 526 old = decnet_default_device;
581 decnet_default_device = dev; 527 decnet_default_device = dev;
582 rv = 0; 528 rv = 0;
583 } 529 }
584 write_unlock(&dndev_lock); 530 spin_unlock(&dndev_lock);
531
585 if (old) 532 if (old)
586 dev_put(old); 533 dev_put(old);
587 return rv; 534 return rv;
@@ -589,26 +536,29 @@ int dn_dev_set_default(struct net_device *dev, int force)
589 536
590static void dn_dev_check_default(struct net_device *dev) 537static void dn_dev_check_default(struct net_device *dev)
591{ 538{
592 write_lock(&dndev_lock); 539 spin_lock(&dndev_lock);
593 if (dev == decnet_default_device) { 540 if (dev == decnet_default_device) {
594 decnet_default_device = NULL; 541 decnet_default_device = NULL;
595 } else { 542 } else {
596 dev = NULL; 543 dev = NULL;
597 } 544 }
598 write_unlock(&dndev_lock); 545 spin_unlock(&dndev_lock);
546
599 if (dev) 547 if (dev)
600 dev_put(dev); 548 dev_put(dev);
601} 549}
602 550
551/*
552 * Called with RTNL
553 */
603static struct dn_dev *dn_dev_by_index(int ifindex) 554static struct dn_dev *dn_dev_by_index(int ifindex)
604{ 555{
605 struct net_device *dev; 556 struct net_device *dev;
606 struct dn_dev *dn_dev = NULL; 557 struct dn_dev *dn_dev = NULL;
607 dev = dev_get_by_index(&init_net, ifindex); 558
608 if (dev) { 559 dev = __dev_get_by_index(&init_net, ifindex);
560 if (dev)
609 dn_dev = dev->dn_ptr; 561 dn_dev = dev->dn_ptr;
610 dev_put(dev);
611 }
612 562
613 return dn_dev; 563 return dn_dev;
614} 564}
@@ -629,7 +579,7 @@ static int dn_nl_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
629 struct dn_ifaddr *ifa, **ifap; 579 struct dn_ifaddr *ifa, **ifap;
630 int err = -EINVAL; 580 int err = -EINVAL;
631 581
632 if (net != &init_net) 582 if (!net_eq(net, &init_net))
633 goto errout; 583 goto errout;
634 584
635 err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, dn_ifa_policy); 585 err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, dn_ifa_policy);
@@ -668,7 +618,7 @@ static int dn_nl_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
668 struct dn_ifaddr *ifa; 618 struct dn_ifaddr *ifa;
669 int err; 619 int err;
670 620
671 if (net != &init_net) 621 if (!net_eq(net, &init_net))
672 return -EINVAL; 622 return -EINVAL;
673 623
674 err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, dn_ifa_policy); 624 err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, dn_ifa_policy);
@@ -782,7 +732,7 @@ static int dn_nl_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb)
782 struct dn_dev *dn_db; 732 struct dn_dev *dn_db;
783 struct dn_ifaddr *ifa; 733 struct dn_ifaddr *ifa;
784 734
785 if (net != &init_net) 735 if (!net_eq(net, &init_net))
786 return 0; 736 return 0;
787 737
788 skip_ndevs = cb->args[0]; 738 skip_ndevs = cb->args[0];
@@ -826,13 +776,17 @@ static int dn_dev_get_first(struct net_device *dev, __le16 *addr)
826 struct dn_dev *dn_db = (struct dn_dev *)dev->dn_ptr; 776 struct dn_dev *dn_db = (struct dn_dev *)dev->dn_ptr;
827 struct dn_ifaddr *ifa; 777 struct dn_ifaddr *ifa;
828 int rv = -ENODEV; 778 int rv = -ENODEV;
779
829 if (dn_db == NULL) 780 if (dn_db == NULL)
830 goto out; 781 goto out;
782
783 rtnl_lock();
831 ifa = dn_db->ifa_list; 784 ifa = dn_db->ifa_list;
832 if (ifa != NULL) { 785 if (ifa != NULL) {
833 *addr = ifa->ifa_local; 786 *addr = ifa->ifa_local;
834 rv = 0; 787 rv = 0;
835 } 788 }
789 rtnl_unlock();
836out: 790out:
837 return rv; 791 return rv;
838} 792}
@@ -854,9 +808,7 @@ int dn_dev_bind_default(__le16 *addr)
854 dev = dn_dev_get_default(); 808 dev = dn_dev_get_default();
855last_chance: 809last_chance:
856 if (dev) { 810 if (dev) {
857 read_lock(&dev_base_lock);
858 rv = dn_dev_get_first(dev, addr); 811 rv = dn_dev_get_first(dev, addr);
859 read_unlock(&dev_base_lock);
860 dev_put(dev); 812 dev_put(dev);
861 if (rv == 0 || dev == init_net.loopback_dev) 813 if (rv == 0 || dev == init_net.loopback_dev)
862 return rv; 814 return rv;
@@ -1321,18 +1273,18 @@ static inline int is_dn_dev(struct net_device *dev)
1321} 1273}
1322 1274
1323static void *dn_dev_seq_start(struct seq_file *seq, loff_t *pos) 1275static void *dn_dev_seq_start(struct seq_file *seq, loff_t *pos)
1324 __acquires(&dev_base_lock) 1276 __acquires(rcu)
1325{ 1277{
1326 int i; 1278 int i;
1327 struct net_device *dev; 1279 struct net_device *dev;
1328 1280
1329 read_lock(&dev_base_lock); 1281 rcu_read_lock();
1330 1282
1331 if (*pos == 0) 1283 if (*pos == 0)
1332 return SEQ_START_TOKEN; 1284 return SEQ_START_TOKEN;
1333 1285
1334 i = 1; 1286 i = 1;
1335 for_each_netdev(&init_net, dev) { 1287 for_each_netdev_rcu(&init_net, dev) {
1336 if (!is_dn_dev(dev)) 1288 if (!is_dn_dev(dev))
1337 continue; 1289 continue;
1338 1290
@@ -1353,7 +1305,7 @@ static void *dn_dev_seq_next(struct seq_file *seq, void *v, loff_t *pos)
1353 if (v == SEQ_START_TOKEN) 1305 if (v == SEQ_START_TOKEN)
1354 dev = net_device_entry(&init_net.dev_base_head); 1306 dev = net_device_entry(&init_net.dev_base_head);
1355 1307
1356 for_each_netdev_continue(&init_net, dev) { 1308 for_each_netdev_continue_rcu(&init_net, dev) {
1357 if (!is_dn_dev(dev)) 1309 if (!is_dn_dev(dev))
1358 continue; 1310 continue;
1359 1311
@@ -1364,9 +1316,9 @@ static void *dn_dev_seq_next(struct seq_file *seq, void *v, loff_t *pos)
1364} 1316}
1365 1317
1366static void dn_dev_seq_stop(struct seq_file *seq, void *v) 1318static void dn_dev_seq_stop(struct seq_file *seq, void *v)
1367 __releases(&dev_base_lock) 1319 __releases(rcu)
1368{ 1320{
1369 read_unlock(&dev_base_lock); 1321 rcu_read_unlock();
1370} 1322}
1371 1323
1372static char *dn_type2asc(char type) 1324static char *dn_type2asc(char type)
diff --git a/net/decnet/dn_fib.c b/net/decnet/dn_fib.c
index 27ea2e9b080a..4ab96c15166d 100644
--- a/net/decnet/dn_fib.c
+++ b/net/decnet/dn_fib.c
@@ -20,6 +20,7 @@
20#include <linux/string.h> 20#include <linux/string.h>
21#include <linux/net.h> 21#include <linux/net.h>
22#include <linux/socket.h> 22#include <linux/socket.h>
23#include <linux/slab.h>
23#include <linux/sockios.h> 24#include <linux/sockios.h>
24#include <linux/init.h> 25#include <linux/init.h>
25#include <linux/skbuff.h> 26#include <linux/skbuff.h>
@@ -509,7 +510,7 @@ static int dn_fib_rtm_delroute(struct sk_buff *skb, struct nlmsghdr *nlh, void *
509 struct rtattr **rta = arg; 510 struct rtattr **rta = arg;
510 struct rtmsg *r = NLMSG_DATA(nlh); 511 struct rtmsg *r = NLMSG_DATA(nlh);
511 512
512 if (net != &init_net) 513 if (!net_eq(net, &init_net))
513 return -EINVAL; 514 return -EINVAL;
514 515
515 if (dn_fib_check_attr(r, rta)) 516 if (dn_fib_check_attr(r, rta))
@@ -529,7 +530,7 @@ static int dn_fib_rtm_newroute(struct sk_buff *skb, struct nlmsghdr *nlh, void *
529 struct rtattr **rta = arg; 530 struct rtattr **rta = arg;
530 struct rtmsg *r = NLMSG_DATA(nlh); 531 struct rtmsg *r = NLMSG_DATA(nlh);
531 532
532 if (net != &init_net) 533 if (!net_eq(net, &init_net))
533 return -EINVAL; 534 return -EINVAL;
534 535
535 if (dn_fib_check_attr(r, rta)) 536 if (dn_fib_check_attr(r, rta))
@@ -607,8 +608,8 @@ static void dn_fib_del_ifaddr(struct dn_ifaddr *ifa)
607 ASSERT_RTNL(); 608 ASSERT_RTNL();
608 609
609 /* Scan device list */ 610 /* Scan device list */
610 read_lock(&dev_base_lock); 611 rcu_read_lock();
611 for_each_netdev(&init_net, dev) { 612 for_each_netdev_rcu(&init_net, dev) {
612 dn_db = dev->dn_ptr; 613 dn_db = dev->dn_ptr;
613 if (dn_db == NULL) 614 if (dn_db == NULL)
614 continue; 615 continue;
@@ -619,7 +620,7 @@ static void dn_fib_del_ifaddr(struct dn_ifaddr *ifa)
619 } 620 }
620 } 621 }
621 } 622 }
622 read_unlock(&dev_base_lock); 623 rcu_read_unlock();
623 624
624 if (found_it == 0) { 625 if (found_it == 0) {
625 fib_magic(RTM_DELROUTE, RTN_LOCAL, ifa->ifa_local, 16, ifa); 626 fib_magic(RTM_DELROUTE, RTN_LOCAL, ifa->ifa_local, 16, ifa);
diff --git a/net/decnet/dn_neigh.c b/net/decnet/dn_neigh.c
index 794b5bf95af1..deb723dba44b 100644
--- a/net/decnet/dn_neigh.c
+++ b/net/decnet/dn_neigh.c
@@ -28,6 +28,7 @@
28#include <linux/module.h> 28#include <linux/module.h>
29#include <linux/socket.h> 29#include <linux/socket.h>
30#include <linux/if_arp.h> 30#include <linux/if_arp.h>
31#include <linux/slab.h>
31#include <linux/if_ether.h> 32#include <linux/if_ether.h>
32#include <linux/init.h> 33#include <linux/init.h>
33#include <linux/proc_fs.h> 34#include <linux/proc_fs.h>
diff --git a/net/decnet/dn_nsp_in.c b/net/decnet/dn_nsp_in.c
index 932408dca86d..25a37299bc65 100644
--- a/net/decnet/dn_nsp_in.c
+++ b/net/decnet/dn_nsp_in.c
@@ -57,6 +57,7 @@
57#include <linux/netdevice.h> 57#include <linux/netdevice.h>
58#include <linux/inet.h> 58#include <linux/inet.h>
59#include <linux/route.h> 59#include <linux/route.h>
60#include <linux/slab.h>
60#include <net/sock.h> 61#include <net/sock.h>
61#include <net/tcp_states.h> 62#include <net/tcp_states.h>
62#include <asm/system.h> 63#include <asm/system.h>
diff --git a/net/decnet/dn_nsp_out.c b/net/decnet/dn_nsp_out.c
index a65e929ce76c..baeb1eaf011b 100644
--- a/net/decnet/dn_nsp_out.c
+++ b/net/decnet/dn_nsp_out.c
@@ -50,6 +50,7 @@
50#include <linux/netdevice.h> 50#include <linux/netdevice.h>
51#include <linux/inet.h> 51#include <linux/inet.h>
52#include <linux/route.h> 52#include <linux/route.h>
53#include <linux/slab.h>
53#include <net/sock.h> 54#include <net/sock.h>
54#include <asm/system.h> 55#include <asm/system.h>
55#include <linux/fcntl.h> 56#include <linux/fcntl.h>
diff --git a/net/decnet/dn_route.c b/net/decnet/dn_route.c
index 57662cabaf9b..70ebe74027d5 100644
--- a/net/decnet/dn_route.c
+++ b/net/decnet/dn_route.c
@@ -66,6 +66,7 @@
66#include <linux/inet.h> 66#include <linux/inet.h>
67#include <linux/route.h> 67#include <linux/route.h>
68#include <linux/in_route.h> 68#include <linux/in_route.h>
69#include <linux/slab.h>
69#include <net/sock.h> 70#include <net/sock.h>
70#include <linux/mm.h> 71#include <linux/mm.h>
71#include <linux/proc_fs.h> 72#include <linux/proc_fs.h>
@@ -908,8 +909,8 @@ static int dn_route_output_slow(struct dst_entry **pprt, const struct flowi *old
908 dev_put(dev_out); 909 dev_put(dev_out);
909 goto out; 910 goto out;
910 } 911 }
911 read_lock(&dev_base_lock); 912 rcu_read_lock();
912 for_each_netdev(&init_net, dev) { 913 for_each_netdev_rcu(&init_net, dev) {
913 if (!dev->dn_ptr) 914 if (!dev->dn_ptr)
914 continue; 915 continue;
915 if (!dn_dev_islocal(dev, oldflp->fld_src)) 916 if (!dn_dev_islocal(dev, oldflp->fld_src))
@@ -922,7 +923,7 @@ static int dn_route_output_slow(struct dst_entry **pprt, const struct flowi *old
922 dev_out = dev; 923 dev_out = dev;
923 break; 924 break;
924 } 925 }
925 read_unlock(&dev_base_lock); 926 rcu_read_unlock();
926 if (dev_out == NULL) 927 if (dev_out == NULL)
927 goto out; 928 goto out;
928 dev_hold(dev_out); 929 dev_hold(dev_out);
@@ -1155,8 +1156,8 @@ static int __dn_route_output_key(struct dst_entry **pprt, const struct flowi *fl
1155 1156
1156 if (!(flags & MSG_TRYHARD)) { 1157 if (!(flags & MSG_TRYHARD)) {
1157 rcu_read_lock_bh(); 1158 rcu_read_lock_bh();
1158 for(rt = rcu_dereference(dn_rt_hash_table[hash].chain); rt; 1159 for (rt = rcu_dereference_bh(dn_rt_hash_table[hash].chain); rt;
1159 rt = rcu_dereference(rt->u.dst.dn_next)) { 1160 rt = rcu_dereference_bh(rt->u.dst.dn_next)) {
1160 if ((flp->fld_dst == rt->fl.fld_dst) && 1161 if ((flp->fld_dst == rt->fl.fld_dst) &&
1161 (flp->fld_src == rt->fl.fld_src) && 1162 (flp->fld_src == rt->fl.fld_src) &&
1162 (flp->mark == rt->fl.mark) && 1163 (flp->mark == rt->fl.mark) &&
@@ -1517,7 +1518,7 @@ static int dn_cache_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, void
1517 struct sk_buff *skb; 1518 struct sk_buff *skb;
1518 struct flowi fl; 1519 struct flowi fl;
1519 1520
1520 if (net != &init_net) 1521 if (!net_eq(net, &init_net))
1521 return -EINVAL; 1522 return -EINVAL;
1522 1523
1523 memset(&fl, 0, sizeof(fl)); 1524 memset(&fl, 0, sizeof(fl));
@@ -1602,7 +1603,7 @@ int dn_cache_dump(struct sk_buff *skb, struct netlink_callback *cb)
1602 int h, s_h; 1603 int h, s_h;
1603 int idx, s_idx; 1604 int idx, s_idx;
1604 1605
1605 if (net != &init_net) 1606 if (!net_eq(net, &init_net))
1606 return 0; 1607 return 0;
1607 1608
1608 if (NLMSG_PAYLOAD(cb->nlh, 0) < sizeof(struct rtmsg)) 1609 if (NLMSG_PAYLOAD(cb->nlh, 0) < sizeof(struct rtmsg))
@@ -1618,9 +1619,9 @@ int dn_cache_dump(struct sk_buff *skb, struct netlink_callback *cb)
1618 if (h > s_h) 1619 if (h > s_h)
1619 s_idx = 0; 1620 s_idx = 0;
1620 rcu_read_lock_bh(); 1621 rcu_read_lock_bh();
1621 for(rt = rcu_dereference(dn_rt_hash_table[h].chain), idx = 0; 1622 for(rt = rcu_dereference_bh(dn_rt_hash_table[h].chain), idx = 0;
1622 rt; 1623 rt;
1623 rt = rcu_dereference(rt->u.dst.dn_next), idx++) { 1624 rt = rcu_dereference_bh(rt->u.dst.dn_next), idx++) {
1624 if (idx < s_idx) 1625 if (idx < s_idx)
1625 continue; 1626 continue;
1626 skb_dst_set(skb, dst_clone(&rt->u.dst)); 1627 skb_dst_set(skb, dst_clone(&rt->u.dst));
@@ -1654,12 +1655,12 @@ static struct dn_route *dn_rt_cache_get_first(struct seq_file *seq)
1654 1655
1655 for(s->bucket = dn_rt_hash_mask; s->bucket >= 0; --s->bucket) { 1656 for(s->bucket = dn_rt_hash_mask; s->bucket >= 0; --s->bucket) {
1656 rcu_read_lock_bh(); 1657 rcu_read_lock_bh();
1657 rt = dn_rt_hash_table[s->bucket].chain; 1658 rt = rcu_dereference_bh(dn_rt_hash_table[s->bucket].chain);
1658 if (rt) 1659 if (rt)
1659 break; 1660 break;
1660 rcu_read_unlock_bh(); 1661 rcu_read_unlock_bh();
1661 } 1662 }
1662 return rcu_dereference(rt); 1663 return rt;
1663} 1664}
1664 1665
1665static struct dn_route *dn_rt_cache_get_next(struct seq_file *seq, struct dn_route *rt) 1666static struct dn_route *dn_rt_cache_get_next(struct seq_file *seq, struct dn_route *rt)
@@ -1674,7 +1675,7 @@ static struct dn_route *dn_rt_cache_get_next(struct seq_file *seq, struct dn_rou
1674 rcu_read_lock_bh(); 1675 rcu_read_lock_bh();
1675 rt = dn_rt_hash_table[s->bucket].chain; 1676 rt = dn_rt_hash_table[s->bucket].chain;
1676 } 1677 }
1677 return rcu_dereference(rt); 1678 return rcu_dereference_bh(rt);
1678} 1679}
1679 1680
1680static void *dn_rt_cache_seq_start(struct seq_file *seq, loff_t *pos) 1681static void *dn_rt_cache_seq_start(struct seq_file *seq, loff_t *pos)
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
36static struct fib_rules_ops dn_fib_rules_ops; 36static struct fib_rules_ops *dn_fib_rules_ops;
37 37
38struct dn_fib_rule 38struct 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
237static struct fib_rules_ops dn_fib_rules_ops = { 237static 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
255void __init dn_fib_rules_init(void) 254void __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
262void __exit dn_fib_rules_cleanup(void) 263void __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..f2abd3755690 100644
--- a/net/decnet/dn_table.c
+++ b/net/decnet/dn_table.c
@@ -15,6 +15,7 @@
15#include <linux/string.h> 15#include <linux/string.h>
16#include <linux/net.h> 16#include <linux/net.h>
17#include <linux/socket.h> 17#include <linux/socket.h>
18#include <linux/slab.h>
18#include <linux/sockios.h> 19#include <linux/sockios.h>
19#include <linux/init.h> 20#include <linux/init.h>
20#include <linux/skbuff.h> 21#include <linux/skbuff.h>
@@ -471,7 +472,7 @@ int dn_fib_dump(struct sk_buff *skb, struct netlink_callback *cb)
471 struct hlist_node *node; 472 struct hlist_node *node;
472 int dumped = 0; 473 int dumped = 0;
473 474
474 if (net != &init_net) 475 if (!net_eq(net, &init_net))
475 return 0; 476 return 0;
476 477
477 if (NLMSG_PAYLOAD(cb->nlh, 0) >= sizeof(struct rtmsg) && 478 if (NLMSG_PAYLOAD(cb->nlh, 0) >= sizeof(struct rtmsg) &&
@@ -581,8 +582,9 @@ static int dn_fib_table_insert(struct dn_fib_table *tb, struct rtmsg *r, struct
581 DN_FIB_SCAN_KEY(f, fp, key) { 582 DN_FIB_SCAN_KEY(f, fp, key) {
582 if (fi->fib_priority != DN_FIB_INFO(f)->fib_priority) 583 if (fi->fib_priority != DN_FIB_INFO(f)->fib_priority)
583 break; 584 break;
584 if (f->fn_type == type && f->fn_scope == r->rtm_scope 585 if (f->fn_type == type &&
585 && DN_FIB_INFO(f) == fi) 586 f->fn_scope == r->rtm_scope &&
587 DN_FIB_INFO(f) == fi)
586 goto out; 588 goto out;
587 } 589 }
588 590
diff --git a/net/decnet/netfilter/dn_rtmsg.c b/net/decnet/netfilter/dn_rtmsg.c
index 6d2bd3202048..64a7f39e069f 100644
--- a/net/decnet/netfilter/dn_rtmsg.c
+++ b/net/decnet/netfilter/dn_rtmsg.c
@@ -14,6 +14,7 @@
14 */ 14 */
15#include <linux/module.h> 15#include <linux/module.h>
16#include <linux/skbuff.h> 16#include <linux/skbuff.h>
17#include <linux/slab.h>
17#include <linux/init.h> 18#include <linux/init.h>
18#include <linux/netdevice.h> 19#include <linux/netdevice.h>
19#include <linux/netfilter.h> 20#include <linux/netfilter.h>
diff --git a/net/decnet/sysctl_net_decnet.c b/net/decnet/sysctl_net_decnet.c
index 2036568beea9..be3eb8e23288 100644
--- a/net/decnet/sysctl_net_decnet.c
+++ b/net/decnet/sysctl_net_decnet.c
@@ -131,39 +131,6 @@ static int parse_addr(__le16 *addr, char *str)
131 return 0; 131 return 0;
132} 132}
133 133
134
135static int dn_node_address_strategy(ctl_table *table,
136 void __user *oldval, size_t __user *oldlenp,
137 void __user *newval, size_t newlen)
138{
139 size_t len;
140 __le16 addr;
141
142 if (oldval && oldlenp) {
143 if (get_user(len, oldlenp))
144 return -EFAULT;
145 if (len) {
146 if (len != sizeof(unsigned short))
147 return -EINVAL;
148 if (put_user(decnet_address, (__le16 __user *)oldval))
149 return -EFAULT;
150 }
151 }
152 if (newval && newlen) {
153 if (newlen != sizeof(unsigned short))
154 return -EINVAL;
155 if (get_user(addr, (__le16 __user *)newval))
156 return -EFAULT;
157
158 dn_dev_devices_off();
159
160 decnet_address = addr;
161
162 dn_dev_devices_on();
163 }
164 return 0;
165}
166
167static int dn_node_address_handler(ctl_table *table, int write, 134static int dn_node_address_handler(ctl_table *table, int write,
168 void __user *buffer, 135 void __user *buffer,
169 size_t *lenp, loff_t *ppos) 136 size_t *lenp, loff_t *ppos)
@@ -215,64 +182,6 @@ static int dn_node_address_handler(ctl_table *table, int write,
215 return 0; 182 return 0;
216} 183}
217 184
218
219static int dn_def_dev_strategy(ctl_table *table,
220 void __user *oldval, size_t __user *oldlenp,
221 void __user *newval, size_t newlen)
222{
223 size_t len;
224 struct net_device *dev;
225 char devname[17];
226 size_t namel;
227 int rv = 0;
228
229 devname[0] = 0;
230
231 if (oldval && oldlenp) {
232 if (get_user(len, oldlenp))
233 return -EFAULT;
234 if (len) {
235 dev = dn_dev_get_default();
236 if (dev) {
237 strcpy(devname, dev->name);
238 dev_put(dev);
239 }
240
241 namel = strlen(devname) + 1;
242 if (len > namel) len = namel;
243
244 if (copy_to_user(oldval, devname, len))
245 return -EFAULT;
246
247 if (put_user(len, oldlenp))
248 return -EFAULT;
249 }
250 }
251
252 if (newval && newlen) {
253 if (newlen > 16)
254 return -E2BIG;
255
256 if (copy_from_user(devname, newval, newlen))
257 return -EFAULT;
258
259 devname[newlen] = 0;
260
261 dev = dev_get_by_name(&init_net, devname);
262 if (dev == NULL)
263 return -ENODEV;
264
265 rv = -ENODEV;
266 if (dev->dn_ptr != NULL)
267 rv = dn_dev_set_default(dev, 1);
268 if (rv)
269 dev_put(dev);
270 }
271
272 return rv;
273}
274
275
276static int dn_def_dev_handler(ctl_table *table, int write, 185static int dn_def_dev_handler(ctl_table *table, int write,
277 void __user *buffer, 186 void __user *buffer,
278 size_t *lenp, loff_t *ppos) 187 size_t *lenp, loff_t *ppos)
@@ -338,138 +247,112 @@ static int dn_def_dev_handler(ctl_table *table, int write,
338 247
339static ctl_table dn_table[] = { 248static ctl_table dn_table[] = {
340 { 249 {
341 .ctl_name = NET_DECNET_NODE_ADDRESS,
342 .procname = "node_address", 250 .procname = "node_address",
343 .maxlen = 7, 251 .maxlen = 7,
344 .mode = 0644, 252 .mode = 0644,
345 .proc_handler = dn_node_address_handler, 253 .proc_handler = dn_node_address_handler,
346 .strategy = dn_node_address_strategy,
347 }, 254 },
348 { 255 {
349 .ctl_name = NET_DECNET_NODE_NAME,
350 .procname = "node_name", 256 .procname = "node_name",
351 .data = node_name, 257 .data = node_name,
352 .maxlen = 7, 258 .maxlen = 7,
353 .mode = 0644, 259 .mode = 0644,
354 .proc_handler = proc_dostring, 260 .proc_handler = proc_dostring,
355 .strategy = sysctl_string,
356 }, 261 },
357 { 262 {
358 .ctl_name = NET_DECNET_DEFAULT_DEVICE,
359 .procname = "default_device", 263 .procname = "default_device",
360 .maxlen = 16, 264 .maxlen = 16,
361 .mode = 0644, 265 .mode = 0644,
362 .proc_handler = dn_def_dev_handler, 266 .proc_handler = dn_def_dev_handler,
363 .strategy = dn_def_dev_strategy,
364 }, 267 },
365 { 268 {
366 .ctl_name = NET_DECNET_TIME_WAIT,
367 .procname = "time_wait", 269 .procname = "time_wait",
368 .data = &decnet_time_wait, 270 .data = &decnet_time_wait,
369 .maxlen = sizeof(int), 271 .maxlen = sizeof(int),
370 .mode = 0644, 272 .mode = 0644,
371 .proc_handler = proc_dointvec_minmax, 273 .proc_handler = proc_dointvec_minmax,
372 .strategy = sysctl_intvec,
373 .extra1 = &min_decnet_time_wait, 274 .extra1 = &min_decnet_time_wait,
374 .extra2 = &max_decnet_time_wait 275 .extra2 = &max_decnet_time_wait
375 }, 276 },
376 { 277 {
377 .ctl_name = NET_DECNET_DN_COUNT,
378 .procname = "dn_count", 278 .procname = "dn_count",
379 .data = &decnet_dn_count, 279 .data = &decnet_dn_count,
380 .maxlen = sizeof(int), 280 .maxlen = sizeof(int),
381 .mode = 0644, 281 .mode = 0644,
382 .proc_handler = proc_dointvec_minmax, 282 .proc_handler = proc_dointvec_minmax,
383 .strategy = sysctl_intvec,
384 .extra1 = &min_state_count, 283 .extra1 = &min_state_count,
385 .extra2 = &max_state_count 284 .extra2 = &max_state_count
386 }, 285 },
387 { 286 {
388 .ctl_name = NET_DECNET_DI_COUNT,
389 .procname = "di_count", 287 .procname = "di_count",
390 .data = &decnet_di_count, 288 .data = &decnet_di_count,
391 .maxlen = sizeof(int), 289 .maxlen = sizeof(int),
392 .mode = 0644, 290 .mode = 0644,
393 .proc_handler = proc_dointvec_minmax, 291 .proc_handler = proc_dointvec_minmax,
394 .strategy = sysctl_intvec,
395 .extra1 = &min_state_count, 292 .extra1 = &min_state_count,
396 .extra2 = &max_state_count 293 .extra2 = &max_state_count
397 }, 294 },
398 { 295 {
399 .ctl_name = NET_DECNET_DR_COUNT,
400 .procname = "dr_count", 296 .procname = "dr_count",
401 .data = &decnet_dr_count, 297 .data = &decnet_dr_count,
402 .maxlen = sizeof(int), 298 .maxlen = sizeof(int),
403 .mode = 0644, 299 .mode = 0644,
404 .proc_handler = proc_dointvec_minmax, 300 .proc_handler = proc_dointvec_minmax,
405 .strategy = sysctl_intvec,
406 .extra1 = &min_state_count, 301 .extra1 = &min_state_count,
407 .extra2 = &max_state_count 302 .extra2 = &max_state_count
408 }, 303 },
409 { 304 {
410 .ctl_name = NET_DECNET_DST_GC_INTERVAL,
411 .procname = "dst_gc_interval", 305 .procname = "dst_gc_interval",
412 .data = &decnet_dst_gc_interval, 306 .data = &decnet_dst_gc_interval,
413 .maxlen = sizeof(int), 307 .maxlen = sizeof(int),
414 .mode = 0644, 308 .mode = 0644,
415 .proc_handler = proc_dointvec_minmax, 309 .proc_handler = proc_dointvec_minmax,
416 .strategy = sysctl_intvec,
417 .extra1 = &min_decnet_dst_gc_interval, 310 .extra1 = &min_decnet_dst_gc_interval,
418 .extra2 = &max_decnet_dst_gc_interval 311 .extra2 = &max_decnet_dst_gc_interval
419 }, 312 },
420 { 313 {
421 .ctl_name = NET_DECNET_NO_FC_MAX_CWND,
422 .procname = "no_fc_max_cwnd", 314 .procname = "no_fc_max_cwnd",
423 .data = &decnet_no_fc_max_cwnd, 315 .data = &decnet_no_fc_max_cwnd,
424 .maxlen = sizeof(int), 316 .maxlen = sizeof(int),
425 .mode = 0644, 317 .mode = 0644,
426 .proc_handler = proc_dointvec_minmax, 318 .proc_handler = proc_dointvec_minmax,
427 .strategy = sysctl_intvec,
428 .extra1 = &min_decnet_no_fc_max_cwnd, 319 .extra1 = &min_decnet_no_fc_max_cwnd,
429 .extra2 = &max_decnet_no_fc_max_cwnd 320 .extra2 = &max_decnet_no_fc_max_cwnd
430 }, 321 },
431 { 322 {
432 .ctl_name = NET_DECNET_MEM,
433 .procname = "decnet_mem", 323 .procname = "decnet_mem",
434 .data = &sysctl_decnet_mem, 324 .data = &sysctl_decnet_mem,
435 .maxlen = sizeof(sysctl_decnet_mem), 325 .maxlen = sizeof(sysctl_decnet_mem),
436 .mode = 0644, 326 .mode = 0644,
437 .proc_handler = proc_dointvec, 327 .proc_handler = proc_dointvec,
438 .strategy = sysctl_intvec,
439 }, 328 },
440 { 329 {
441 .ctl_name = NET_DECNET_RMEM,
442 .procname = "decnet_rmem", 330 .procname = "decnet_rmem",
443 .data = &sysctl_decnet_rmem, 331 .data = &sysctl_decnet_rmem,
444 .maxlen = sizeof(sysctl_decnet_rmem), 332 .maxlen = sizeof(sysctl_decnet_rmem),
445 .mode = 0644, 333 .mode = 0644,
446 .proc_handler = proc_dointvec, 334 .proc_handler = proc_dointvec,
447 .strategy = sysctl_intvec,
448 }, 335 },
449 { 336 {
450 .ctl_name = NET_DECNET_WMEM,
451 .procname = "decnet_wmem", 337 .procname = "decnet_wmem",
452 .data = &sysctl_decnet_wmem, 338 .data = &sysctl_decnet_wmem,
453 .maxlen = sizeof(sysctl_decnet_wmem), 339 .maxlen = sizeof(sysctl_decnet_wmem),
454 .mode = 0644, 340 .mode = 0644,
455 .proc_handler = proc_dointvec, 341 .proc_handler = proc_dointvec,
456 .strategy = sysctl_intvec,
457 }, 342 },
458 { 343 {
459 .ctl_name = NET_DECNET_DEBUG_LEVEL,
460 .procname = "debug", 344 .procname = "debug",
461 .data = &decnet_debug_level, 345 .data = &decnet_debug_level,
462 .maxlen = sizeof(int), 346 .maxlen = sizeof(int),
463 .mode = 0644, 347 .mode = 0644,
464 .proc_handler = proc_dointvec, 348 .proc_handler = proc_dointvec,
465 .strategy = sysctl_intvec,
466 }, 349 },
467 {0} 350 { }
468}; 351};
469 352
470static struct ctl_path dn_path[] = { 353static struct ctl_path dn_path[] = {
471 { .procname = "net", .ctl_name = CTL_NET, }, 354 { .procname = "net", },
472 { .procname = "decnet", .ctl_name = NET_DECNET, }, 355 { .procname = "decnet", },
473 { } 356 { }
474}; 357};
475 358