diff options
author | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-30 19:16:45 -0400 |
---|---|---|
committer | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-30 19:16:45 -0400 |
commit | ada47b5fe13d89735805b566185f4885f5a3f750 (patch) | |
tree | 644b88f8a71896307d71438e9b3af49126ffb22b /net/decnet | |
parent | 43e98717ad40a4ae64545b5ba047c7b86aa44f4f (diff) | |
parent | 3280f21d43ee541f97f8cda5792150d2dbec20d5 (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.c | 15 | ||||
-rw-r--r-- | net/decnet/dn_dev.c | 118 | ||||
-rw-r--r-- | net/decnet/dn_fib.c | 11 | ||||
-rw-r--r-- | net/decnet/dn_neigh.c | 1 | ||||
-rw-r--r-- | net/decnet/dn_nsp_in.c | 1 | ||||
-rw-r--r-- | net/decnet/dn_nsp_out.c | 1 | ||||
-rw-r--r-- | net/decnet/dn_route.c | 25 | ||||
-rw-r--r-- | net/decnet/dn_rules.c | 22 | ||||
-rw-r--r-- | net/decnet/dn_table.c | 8 | ||||
-rw-r--r-- | net/decnet/netfilter/dn_rtmsg.c | 1 | ||||
-rw-r--r-- | net/decnet/sysctl_net_decnet.c | 123 |
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 | ||
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 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 | ||
71 | static DEFINE_RWLOCK(dndev_lock); | 72 | static DEFINE_SPINLOCK(dndev_lock); |
72 | static struct net_device *decnet_default_device; | 73 | static struct net_device *decnet_default_device; |
73 | static BLOCKING_NOTIFIER_HEAD(dnaddr_chain); | 74 | static 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 | ||
167 | static int dn_forwarding_proc(ctl_table *, int, | 162 | static int dn_forwarding_proc(ctl_table *, int, |
168 | void __user *, size_t *, loff_t *); | 163 | void __user *, size_t *, loff_t *); |
169 | static int dn_forwarding_sysctl(ctl_table *table, | ||
170 | void __user *oldval, size_t __user *oldlenp, | ||
171 | void __user *newval, size_t newlen); | ||
172 | |||
173 | static struct dn_dev_sysctl_table { | 164 | static 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 | ||
320 | static 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 */ |
359 | static void dn_dev_sysctl_unregister(struct dn_dev_parms *parms) | 302 | static void dn_dev_sysctl_unregister(struct dn_dev_parms *parms) |
360 | { | 303 | { |
@@ -557,7 +500,8 @@ rarok: | |||
557 | struct net_device *dn_dev_get_default(void) | 500 | struct 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 | ||
590 | static void dn_dev_check_default(struct net_device *dev) | 537 | static 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 | */ | ||
603 | static struct dn_dev *dn_dev_by_index(int ifindex) | 554 | static 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(); | ||
836 | out: | 790 | out: |
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(); |
855 | last_chance: | 809 | last_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 | ||
1323 | static void *dn_dev_seq_start(struct seq_file *seq, loff_t *pos) | 1275 | static 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 | ||
1366 | static void dn_dev_seq_stop(struct seq_file *seq, void *v) | 1318 | static 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 | ||
1372 | static char *dn_type2asc(char type) | 1324 | static 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 | ||
1665 | static struct dn_route *dn_rt_cache_get_next(struct seq_file *seq, struct dn_route *rt) | 1666 | static 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 | ||
1680 | static void *dn_rt_cache_seq_start(struct seq_file *seq, loff_t *pos) | 1681 | static 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 | ||
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..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 | |||
135 | static 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 | |||
167 | static int dn_node_address_handler(ctl_table *table, int write, | 134 | static 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 | |||
219 | static 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 | |||
276 | static int dn_def_dev_handler(ctl_table *table, int write, | 185 | static 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 | ||
339 | static ctl_table dn_table[] = { | 248 | static 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 | ||
470 | static struct ctl_path dn_path[] = { | 353 | static 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 | ||