aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
Diffstat (limited to 'net')
-rw-r--r--net/ipv4/ip_fragment.c40
-rw-r--r--net/ipv4/netfilter/ip_conntrack_ftp.c4
-rw-r--r--net/ipv4/netfilter/ip_conntrack_irc.c4
-rw-r--r--net/ipv4/netfilter/ip_conntrack_tftp.c4
-rw-r--r--net/ipv4/tcp_highspeed.c2
-rw-r--r--net/ipv4/tcp_input.c4
-rw-r--r--net/ipv6/addrconf.c5
-rw-r--r--net/ipv6/ipv6_sockglue.c2
-rw-r--r--net/ipv6/reassembly.c41
-rw-r--r--net/ipv6/route.c2
-rw-r--r--net/llc/af_llc.c5
-rw-r--r--net/llc/llc_c_ac.c20
-rw-r--r--net/netfilter/nf_conntrack_core.c9
-rw-r--r--net/netfilter/nf_conntrack_standalone.c2
-rw-r--r--net/sched/Kconfig37
-rw-r--r--net/sunrpc/svcsock.c1
16 files changed, 77 insertions, 105 deletions
diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c
index e7d26d9943c2..8ce0ce2ee48e 100644
--- a/net/ipv4/ip_fragment.c
+++ b/net/ipv4/ip_fragment.c
@@ -71,7 +71,7 @@ struct ipfrag_skb_cb
71 71
72/* Describe an entry in the "incomplete datagrams" queue. */ 72/* Describe an entry in the "incomplete datagrams" queue. */
73struct ipq { 73struct ipq {
74 struct ipq *next; /* linked list pointers */ 74 struct hlist_node list;
75 struct list_head lru_list; /* lru list member */ 75 struct list_head lru_list; /* lru list member */
76 u32 user; 76 u32 user;
77 u32 saddr; 77 u32 saddr;
@@ -89,7 +89,6 @@ struct ipq {
89 spinlock_t lock; 89 spinlock_t lock;
90 atomic_t refcnt; 90 atomic_t refcnt;
91 struct timer_list timer; /* when will this queue expire? */ 91 struct timer_list timer; /* when will this queue expire? */
92 struct ipq **pprev;
93 int iif; 92 int iif;
94 struct timeval stamp; 93 struct timeval stamp;
95}; 94};
@@ -99,7 +98,7 @@ struct ipq {
99#define IPQ_HASHSZ 64 98#define IPQ_HASHSZ 64
100 99
101/* Per-bucket lock is easy to add now. */ 100/* Per-bucket lock is easy to add now. */
102static struct ipq *ipq_hash[IPQ_HASHSZ]; 101static struct hlist_head ipq_hash[IPQ_HASHSZ];
103static DEFINE_RWLOCK(ipfrag_lock); 102static DEFINE_RWLOCK(ipfrag_lock);
104static u32 ipfrag_hash_rnd; 103static u32 ipfrag_hash_rnd;
105static LIST_HEAD(ipq_lru_list); 104static LIST_HEAD(ipq_lru_list);
@@ -107,9 +106,7 @@ int ip_frag_nqueues = 0;
107 106
108static __inline__ void __ipq_unlink(struct ipq *qp) 107static __inline__ void __ipq_unlink(struct ipq *qp)
109{ 108{
110 if(qp->next) 109 hlist_del(&qp->list);
111 qp->next->pprev = qp->pprev;
112 *qp->pprev = qp->next;
113 list_del(&qp->lru_list); 110 list_del(&qp->lru_list);
114 ip_frag_nqueues--; 111 ip_frag_nqueues--;
115} 112}
@@ -139,27 +136,18 @@ static void ipfrag_secret_rebuild(unsigned long dummy)
139 get_random_bytes(&ipfrag_hash_rnd, sizeof(u32)); 136 get_random_bytes(&ipfrag_hash_rnd, sizeof(u32));
140 for (i = 0; i < IPQ_HASHSZ; i++) { 137 for (i = 0; i < IPQ_HASHSZ; i++) {
141 struct ipq *q; 138 struct ipq *q;
139 struct hlist_node *p, *n;
142 140
143 q = ipq_hash[i]; 141 hlist_for_each_entry_safe(q, p, n, &ipq_hash[i], list) {
144 while (q) {
145 struct ipq *next = q->next;
146 unsigned int hval = ipqhashfn(q->id, q->saddr, 142 unsigned int hval = ipqhashfn(q->id, q->saddr,
147 q->daddr, q->protocol); 143 q->daddr, q->protocol);
148 144
149 if (hval != i) { 145 if (hval != i) {
150 /* Unlink. */ 146 hlist_del(&q->list);
151 if (q->next)
152 q->next->pprev = q->pprev;
153 *q->pprev = q->next;
154 147
155 /* Relink to new hash chain. */ 148 /* Relink to new hash chain. */
156 if ((q->next = ipq_hash[hval]) != NULL) 149 hlist_add_head(&q->list, &ipq_hash[hval]);
157 q->next->pprev = &q->next;
158 ipq_hash[hval] = q;
159 q->pprev = &ipq_hash[hval];
160 } 150 }
161
162 q = next;
163 } 151 }
164 } 152 }
165 write_unlock(&ipfrag_lock); 153 write_unlock(&ipfrag_lock);
@@ -310,14 +298,16 @@ out:
310static struct ipq *ip_frag_intern(unsigned int hash, struct ipq *qp_in) 298static struct ipq *ip_frag_intern(unsigned int hash, struct ipq *qp_in)
311{ 299{
312 struct ipq *qp; 300 struct ipq *qp;
313 301#ifdef CONFIG_SMP
302 struct hlist_node *n;
303#endif
314 write_lock(&ipfrag_lock); 304 write_lock(&ipfrag_lock);
315#ifdef CONFIG_SMP 305#ifdef CONFIG_SMP
316 /* With SMP race we have to recheck hash table, because 306 /* With SMP race we have to recheck hash table, because
317 * such entry could be created on other cpu, while we 307 * such entry could be created on other cpu, while we
318 * promoted read lock to write lock. 308 * promoted read lock to write lock.
319 */ 309 */
320 for(qp = ipq_hash[hash]; qp; qp = qp->next) { 310 hlist_for_each_entry(qp, n, &ipq_hash[hash], list) {
321 if(qp->id == qp_in->id && 311 if(qp->id == qp_in->id &&
322 qp->saddr == qp_in->saddr && 312 qp->saddr == qp_in->saddr &&
323 qp->daddr == qp_in->daddr && 313 qp->daddr == qp_in->daddr &&
@@ -337,10 +327,7 @@ static struct ipq *ip_frag_intern(unsigned int hash, struct ipq *qp_in)
337 atomic_inc(&qp->refcnt); 327 atomic_inc(&qp->refcnt);
338 328
339 atomic_inc(&qp->refcnt); 329 atomic_inc(&qp->refcnt);
340 if((qp->next = ipq_hash[hash]) != NULL) 330 hlist_add_head(&qp->list, &ipq_hash[hash]);
341 qp->next->pprev = &qp->next;
342 ipq_hash[hash] = qp;
343 qp->pprev = &ipq_hash[hash];
344 INIT_LIST_HEAD(&qp->lru_list); 331 INIT_LIST_HEAD(&qp->lru_list);
345 list_add_tail(&qp->lru_list, &ipq_lru_list); 332 list_add_tail(&qp->lru_list, &ipq_lru_list);
346 ip_frag_nqueues++; 333 ip_frag_nqueues++;
@@ -392,9 +379,10 @@ static inline struct ipq *ip_find(struct iphdr *iph, u32 user)
392 __u8 protocol = iph->protocol; 379 __u8 protocol = iph->protocol;
393 unsigned int hash = ipqhashfn(id, saddr, daddr, protocol); 380 unsigned int hash = ipqhashfn(id, saddr, daddr, protocol);
394 struct ipq *qp; 381 struct ipq *qp;
382 struct hlist_node *n;
395 383
396 read_lock(&ipfrag_lock); 384 read_lock(&ipfrag_lock);
397 for(qp = ipq_hash[hash]; qp; qp = qp->next) { 385 hlist_for_each_entry(qp, n, &ipq_hash[hash], list) {
398 if(qp->id == id && 386 if(qp->id == id &&
399 qp->saddr == saddr && 387 qp->saddr == saddr &&
400 qp->daddr == daddr && 388 qp->daddr == daddr &&
diff --git a/net/ipv4/netfilter/ip_conntrack_ftp.c b/net/ipv4/netfilter/ip_conntrack_ftp.c
index d77d6b3f5f80..59e12b02b22c 100644
--- a/net/ipv4/netfilter/ip_conntrack_ftp.c
+++ b/net/ipv4/netfilter/ip_conntrack_ftp.c
@@ -29,9 +29,9 @@ static char *ftp_buffer;
29static DEFINE_SPINLOCK(ip_ftp_lock); 29static DEFINE_SPINLOCK(ip_ftp_lock);
30 30
31#define MAX_PORTS 8 31#define MAX_PORTS 8
32static short ports[MAX_PORTS]; 32static unsigned short ports[MAX_PORTS];
33static int ports_c; 33static int ports_c;
34module_param_array(ports, short, &ports_c, 0400); 34module_param_array(ports, ushort, &ports_c, 0400);
35 35
36static int loose; 36static int loose;
37module_param(loose, int, 0600); 37module_param(loose, int, 0600);
diff --git a/net/ipv4/netfilter/ip_conntrack_irc.c b/net/ipv4/netfilter/ip_conntrack_irc.c
index 15457415a4f3..2dea1db14406 100644
--- a/net/ipv4/netfilter/ip_conntrack_irc.c
+++ b/net/ipv4/netfilter/ip_conntrack_irc.c
@@ -34,7 +34,7 @@
34#include <linux/moduleparam.h> 34#include <linux/moduleparam.h>
35 35
36#define MAX_PORTS 8 36#define MAX_PORTS 8
37static short ports[MAX_PORTS]; 37static unsigned short ports[MAX_PORTS];
38static int ports_c; 38static int ports_c;
39static int max_dcc_channels = 8; 39static int max_dcc_channels = 8;
40static unsigned int dcc_timeout = 300; 40static unsigned int dcc_timeout = 300;
@@ -52,7 +52,7 @@ EXPORT_SYMBOL_GPL(ip_nat_irc_hook);
52MODULE_AUTHOR("Harald Welte <laforge@netfilter.org>"); 52MODULE_AUTHOR("Harald Welte <laforge@netfilter.org>");
53MODULE_DESCRIPTION("IRC (DCC) connection tracking helper"); 53MODULE_DESCRIPTION("IRC (DCC) connection tracking helper");
54MODULE_LICENSE("GPL"); 54MODULE_LICENSE("GPL");
55module_param_array(ports, short, &ports_c, 0400); 55module_param_array(ports, ushort, &ports_c, 0400);
56MODULE_PARM_DESC(ports, "port numbers of IRC servers"); 56MODULE_PARM_DESC(ports, "port numbers of IRC servers");
57module_param(max_dcc_channels, int, 0400); 57module_param(max_dcc_channels, int, 0400);
58MODULE_PARM_DESC(max_dcc_channels, "max number of expected DCC channels per IRC session"); 58MODULE_PARM_DESC(max_dcc_channels, "max number of expected DCC channels per IRC session");
diff --git a/net/ipv4/netfilter/ip_conntrack_tftp.c b/net/ipv4/netfilter/ip_conntrack_tftp.c
index a78736b8525d..d3c5a371f993 100644
--- a/net/ipv4/netfilter/ip_conntrack_tftp.c
+++ b/net/ipv4/netfilter/ip_conntrack_tftp.c
@@ -26,9 +26,9 @@ MODULE_DESCRIPTION("tftp connection tracking helper");
26MODULE_LICENSE("GPL"); 26MODULE_LICENSE("GPL");
27 27
28#define MAX_PORTS 8 28#define MAX_PORTS 8
29static short ports[MAX_PORTS]; 29static unsigned short ports[MAX_PORTS];
30static int ports_c; 30static int ports_c;
31module_param_array(ports, short, &ports_c, 0400); 31module_param_array(ports, ushort, &ports_c, 0400);
32MODULE_PARM_DESC(ports, "port numbers of tftp servers"); 32MODULE_PARM_DESC(ports, "port numbers of tftp servers");
33 33
34#if 0 34#if 0
diff --git a/net/ipv4/tcp_highspeed.c b/net/ipv4/tcp_highspeed.c
index 82b3c189bd7d..63cf7e540847 100644
--- a/net/ipv4/tcp_highspeed.c
+++ b/net/ipv4/tcp_highspeed.c
@@ -111,7 +111,7 @@ static void hstcp_init(struct sock *sk)
111} 111}
112 112
113static void hstcp_cong_avoid(struct sock *sk, u32 adk, u32 rtt, 113static void hstcp_cong_avoid(struct sock *sk, u32 adk, u32 rtt,
114 u32 in_flight, u32 pkts_acked) 114 u32 in_flight, int data_acked)
115{ 115{
116 struct tcp_sock *tp = tcp_sk(sk); 116 struct tcp_sock *tp = tcp_sk(sk);
117 struct hstcp *ca = inet_csk_ca(sk); 117 struct hstcp *ca = inet_csk_ca(sk);
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index 40a26b7157b4..bf2e23086bce 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -367,7 +367,7 @@ static void tcp_rcv_rtt_update(struct tcp_sock *tp, u32 sample, int win_dep)
367 * are stalled on filesystem I/O. 367 * are stalled on filesystem I/O.
368 * 368 *
369 * Also, since we are only going for a minimum in the 369 * Also, since we are only going for a minimum in the
370 * non-timestamp case, we do not smoother things out 370 * non-timestamp case, we do not smooth things out
371 * else with timestamps disabled convergence takes too 371 * else with timestamps disabled convergence takes too
372 * long. 372 * long.
373 */ 373 */
@@ -546,7 +546,7 @@ static void tcp_rtt_estimator(struct sock *sk, const __u32 mrtt)
546 * 546 *
547 * Funny. This algorithm seems to be very broken. 547 * Funny. This algorithm seems to be very broken.
548 * These formulae increase RTO, when it should be decreased, increase 548 * These formulae increase RTO, when it should be decreased, increase
549 * too slowly, when it should be increased fastly, decrease too fastly 549 * too slowly, when it should be increased quickly, decrease too quickly
550 * etc. I guess in BSD RTO takes ONE value, so that it is absolutely 550 * etc. I guess in BSD RTO takes ONE value, so that it is absolutely
551 * does not matter how to _calculate_ it. Seems, it was trap 551 * does not matter how to _calculate_ it. Seems, it was trap
552 * that VJ failed to avoid. 8) 552 * that VJ failed to avoid. 8)
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index ddcf7754eec2..56a09a4ac410 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -1045,9 +1045,10 @@ int ipv6_dev_get_saddr(struct net_device *daddr_dev,
1045 } 1045 }
1046#endif 1046#endif
1047 /* Rule 8: Use longest matching prefix */ 1047 /* Rule 8: Use longest matching prefix */
1048 if (hiscore.rule < 8) 1048 if (hiscore.rule < 8) {
1049 hiscore.matchlen = ipv6_addr_diff(&ifa_result->addr, daddr); 1049 hiscore.matchlen = ipv6_addr_diff(&ifa_result->addr, daddr);
1050 score.rule++; 1050 hiscore.rule++;
1051 }
1051 score.matchlen = ipv6_addr_diff(&ifa->addr, daddr); 1052 score.matchlen = ipv6_addr_diff(&ifa->addr, daddr);
1052 if (score.matchlen > hiscore.matchlen) { 1053 if (score.matchlen > hiscore.matchlen) {
1053 score.rule = 8; 1054 score.rule = 8;
diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c
index 003fd99ff597..25757ade989f 100644
--- a/net/ipv6/ipv6_sockglue.c
+++ b/net/ipv6/ipv6_sockglue.c
@@ -287,7 +287,7 @@ int ipv6_setsockopt(struct sock *sk, int level, int optname,
287 { 287 {
288 struct ipv6_txoptions *opt; 288 struct ipv6_txoptions *opt;
289 if (optlen == 0) 289 if (optlen == 0)
290 optval = 0; 290 optval = NULL;
291 291
292 /* hop-by-hop / destination options are privileged option */ 292 /* hop-by-hop / destination options are privileged option */
293 retv = -EPERM; 293 retv = -EPERM;
diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c
index e4fe9ee484dd..5d316cb72ec9 100644
--- a/net/ipv6/reassembly.c
+++ b/net/ipv6/reassembly.c
@@ -74,7 +74,7 @@ struct ip6frag_skb_cb
74 74
75struct frag_queue 75struct frag_queue
76{ 76{
77 struct frag_queue *next; 77 struct hlist_node list;
78 struct list_head lru_list; /* lru list member */ 78 struct list_head lru_list; /* lru list member */
79 79
80 __u32 id; /* fragment id */ 80 __u32 id; /* fragment id */
@@ -95,14 +95,13 @@ struct frag_queue
95#define FIRST_IN 2 95#define FIRST_IN 2
96#define LAST_IN 1 96#define LAST_IN 1
97 __u16 nhoffset; 97 __u16 nhoffset;
98 struct frag_queue **pprev;
99}; 98};
100 99
101/* Hash table. */ 100/* Hash table. */
102 101
103#define IP6Q_HASHSZ 64 102#define IP6Q_HASHSZ 64
104 103
105static struct frag_queue *ip6_frag_hash[IP6Q_HASHSZ]; 104static struct hlist_head ip6_frag_hash[IP6Q_HASHSZ];
106static DEFINE_RWLOCK(ip6_frag_lock); 105static DEFINE_RWLOCK(ip6_frag_lock);
107static u32 ip6_frag_hash_rnd; 106static u32 ip6_frag_hash_rnd;
108static LIST_HEAD(ip6_frag_lru_list); 107static LIST_HEAD(ip6_frag_lru_list);
@@ -110,9 +109,7 @@ int ip6_frag_nqueues = 0;
110 109
111static __inline__ void __fq_unlink(struct frag_queue *fq) 110static __inline__ void __fq_unlink(struct frag_queue *fq)
112{ 111{
113 if(fq->next) 112 hlist_del(&fq->list);
114 fq->next->pprev = fq->pprev;
115 *fq->pprev = fq->next;
116 list_del(&fq->lru_list); 113 list_del(&fq->lru_list);
117 ip6_frag_nqueues--; 114 ip6_frag_nqueues--;
118} 115}
@@ -163,28 +160,21 @@ static void ip6_frag_secret_rebuild(unsigned long dummy)
163 get_random_bytes(&ip6_frag_hash_rnd, sizeof(u32)); 160 get_random_bytes(&ip6_frag_hash_rnd, sizeof(u32));
164 for (i = 0; i < IP6Q_HASHSZ; i++) { 161 for (i = 0; i < IP6Q_HASHSZ; i++) {
165 struct frag_queue *q; 162 struct frag_queue *q;
163 struct hlist_node *p, *n;
166 164
167 q = ip6_frag_hash[i]; 165 hlist_for_each_entry_safe(q, p, n, &ip6_frag_hash[i], list) {
168 while (q) {
169 struct frag_queue *next = q->next;
170 unsigned int hval = ip6qhashfn(q->id, 166 unsigned int hval = ip6qhashfn(q->id,
171 &q->saddr, 167 &q->saddr,
172 &q->daddr); 168 &q->daddr);
173 169
174 if (hval != i) { 170 if (hval != i) {
175 /* Unlink. */ 171 hlist_del(&q->list);
176 if (q->next)
177 q->next->pprev = q->pprev;
178 *q->pprev = q->next;
179 172
180 /* Relink to new hash chain. */ 173 /* Relink to new hash chain. */
181 if ((q->next = ip6_frag_hash[hval]) != NULL) 174 hlist_add_head(&q->list,
182 q->next->pprev = &q->next; 175 &ip6_frag_hash[hval]);
183 ip6_frag_hash[hval] = q;
184 q->pprev = &ip6_frag_hash[hval];
185 }
186 176
187 q = next; 177 }
188 } 178 }
189 } 179 }
190 write_unlock(&ip6_frag_lock); 180 write_unlock(&ip6_frag_lock);
@@ -337,10 +327,13 @@ static struct frag_queue *ip6_frag_intern(unsigned int hash,
337 struct frag_queue *fq_in) 327 struct frag_queue *fq_in)
338{ 328{
339 struct frag_queue *fq; 329 struct frag_queue *fq;
330#ifdef CONFIG_SMP
331 struct hlist_node *n;
332#endif
340 333
341 write_lock(&ip6_frag_lock); 334 write_lock(&ip6_frag_lock);
342#ifdef CONFIG_SMP 335#ifdef CONFIG_SMP
343 for (fq = ip6_frag_hash[hash]; fq; fq = fq->next) { 336 hlist_for_each_entry(fq, n, &ip6_frag_hash[hash], list) {
344 if (fq->id == fq_in->id && 337 if (fq->id == fq_in->id &&
345 ipv6_addr_equal(&fq_in->saddr, &fq->saddr) && 338 ipv6_addr_equal(&fq_in->saddr, &fq->saddr) &&
346 ipv6_addr_equal(&fq_in->daddr, &fq->daddr)) { 339 ipv6_addr_equal(&fq_in->daddr, &fq->daddr)) {
@@ -358,10 +351,7 @@ static struct frag_queue *ip6_frag_intern(unsigned int hash,
358 atomic_inc(&fq->refcnt); 351 atomic_inc(&fq->refcnt);
359 352
360 atomic_inc(&fq->refcnt); 353 atomic_inc(&fq->refcnt);
361 if((fq->next = ip6_frag_hash[hash]) != NULL) 354 hlist_add_head(&fq->list, &ip6_frag_hash[hash]);
362 fq->next->pprev = &fq->next;
363 ip6_frag_hash[hash] = fq;
364 fq->pprev = &ip6_frag_hash[hash];
365 INIT_LIST_HEAD(&fq->lru_list); 355 INIT_LIST_HEAD(&fq->lru_list);
366 list_add_tail(&fq->lru_list, &ip6_frag_lru_list); 356 list_add_tail(&fq->lru_list, &ip6_frag_lru_list);
367 ip6_frag_nqueues++; 357 ip6_frag_nqueues++;
@@ -401,10 +391,11 @@ static __inline__ struct frag_queue *
401fq_find(u32 id, struct in6_addr *src, struct in6_addr *dst) 391fq_find(u32 id, struct in6_addr *src, struct in6_addr *dst)
402{ 392{
403 struct frag_queue *fq; 393 struct frag_queue *fq;
394 struct hlist_node *n;
404 unsigned int hash = ip6qhashfn(id, src, dst); 395 unsigned int hash = ip6qhashfn(id, src, dst);
405 396
406 read_lock(&ip6_frag_lock); 397 read_lock(&ip6_frag_lock);
407 for(fq = ip6_frag_hash[hash]; fq; fq = fq->next) { 398 hlist_for_each_entry(fq, n, &ip6_frag_hash[hash], list) {
408 if (fq->id == id && 399 if (fq->id == id &&
409 ipv6_addr_equal(src, &fq->saddr) && 400 ipv6_addr_equal(src, &fq->saddr) &&
410 ipv6_addr_equal(dst, &fq->daddr)) { 401 ipv6_addr_equal(dst, &fq->daddr)) {
diff --git a/net/ipv6/route.c b/net/ipv6/route.c
index 9a71a8d1078a..a7a537b50595 100644
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c
@@ -1732,7 +1732,7 @@ int inet6_dump_fib(struct sk_buff *skb, struct netlink_callback *cb)
1732 /* 1732 /*
1733 * 2. allocate and initialize walker. 1733 * 2. allocate and initialize walker.
1734 */ 1734 */
1735 w = kmalloc(sizeof(*w), GFP_KERNEL); 1735 w = kmalloc(sizeof(*w), GFP_ATOMIC);
1736 if (w == NULL) 1736 if (w == NULL)
1737 return -ENOMEM; 1737 return -ENOMEM;
1738 RT6_TRACE("dump<%p", w); 1738 RT6_TRACE("dump<%p", w);
diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c
index 59d02cbbeb9e..c3f0b0783453 100644
--- a/net/llc/af_llc.c
+++ b/net/llc/af_llc.c
@@ -116,7 +116,9 @@ static int llc_ui_send_data(struct sock* sk, struct sk_buff *skb, int noblock)
116 struct llc_sock* llc = llc_sk(sk); 116 struct llc_sock* llc = llc_sk(sk);
117 int rc = 0; 117 int rc = 0;
118 118
119 if (unlikely(llc_data_accept_state(llc->state) || llc->p_flag)) { 119 if (unlikely(llc_data_accept_state(llc->state) ||
120 llc->remote_busy_flag ||
121 llc->p_flag)) {
120 long timeout = sock_sndtimeo(sk, noblock); 122 long timeout = sock_sndtimeo(sk, noblock);
121 123
122 rc = llc_ui_wait_for_busy_core(sk, timeout); 124 rc = llc_ui_wait_for_busy_core(sk, timeout);
@@ -542,6 +544,7 @@ static int llc_ui_wait_for_busy_core(struct sock *sk, long timeout)
542 if (sk_wait_event(sk, &timeout, 544 if (sk_wait_event(sk, &timeout,
543 (sk->sk_shutdown & RCV_SHUTDOWN) || 545 (sk->sk_shutdown & RCV_SHUTDOWN) ||
544 (!llc_data_accept_state(llc->state) && 546 (!llc_data_accept_state(llc->state) &&
547 !llc->remote_busy_flag &&
545 !llc->p_flag))) 548 !llc->p_flag)))
546 break; 549 break;
547 rc = -ERESTARTSYS; 550 rc = -ERESTARTSYS;
diff --git a/net/llc/llc_c_ac.c b/net/llc/llc_c_ac.c
index b0bcfb1f12dd..8169f24ed33e 100644
--- a/net/llc/llc_c_ac.c
+++ b/net/llc/llc_c_ac.c
@@ -866,7 +866,8 @@ int llc_conn_ac_send_ack_if_needed(struct sock *sk, struct sk_buff *skb)
866 llc->ack_must_be_send = 1; 866 llc->ack_must_be_send = 1;
867 llc->ack_pf = pf_bit & 1; 867 llc->ack_pf = pf_bit & 1;
868 } 868 }
869 if (((llc->vR - llc->first_pdu_Ns + 129) % 128) >= llc->npta) { 869 if (((llc->vR - llc->first_pdu_Ns + 1 + LLC_2_SEQ_NBR_MODULO)
870 % LLC_2_SEQ_NBR_MODULO) >= llc->npta) {
870 llc_conn_ac_send_rr_rsp_f_set_ackpf(sk, skb); 871 llc_conn_ac_send_rr_rsp_f_set_ackpf(sk, skb);
871 llc->ack_must_be_send = 0; 872 llc->ack_must_be_send = 0;
872 llc->ack_pf = 0; 873 llc->ack_pf = 0;
@@ -994,8 +995,8 @@ static int llc_conn_ac_inc_npta_value(struct sock *sk, struct sk_buff *skb)
994 llc->dec_step = 0; 995 llc->dec_step = 0;
995 llc->dec_cntr = llc->inc_cntr = 2; 996 llc->dec_cntr = llc->inc_cntr = 2;
996 ++llc->npta; 997 ++llc->npta;
997 if (llc->npta > 127) 998 if (llc->npta > (u8) ~LLC_2_SEQ_NBR_MODULO)
998 llc->npta = 127 ; 999 llc->npta = (u8) ~LLC_2_SEQ_NBR_MODULO;
999 } else 1000 } else
1000 --llc->inc_cntr; 1001 --llc->inc_cntr;
1001 return 0; 1002 return 0;
@@ -1065,9 +1066,10 @@ int llc_conn_ac_dec_tx_win_size(struct sock *sk, struct sk_buff *skb)
1065 struct llc_sock *llc = llc_sk(sk); 1066 struct llc_sock *llc = llc_sk(sk);
1066 u8 unacked_pdu = skb_queue_len(&llc->pdu_unack_q); 1067 u8 unacked_pdu = skb_queue_len(&llc->pdu_unack_q);
1067 1068
1068 llc->k -= unacked_pdu; 1069 if (llc->k - unacked_pdu < 1)
1069 if (llc->k < 2) 1070 llc->k = 1;
1070 llc->k = 2; 1071 else
1072 llc->k -= unacked_pdu;
1071 return 0; 1073 return 0;
1072} 1074}
1073 1075
@@ -1084,8 +1086,8 @@ int llc_conn_ac_inc_tx_win_size(struct sock *sk, struct sk_buff *skb)
1084 struct llc_sock *llc = llc_sk(sk); 1086 struct llc_sock *llc = llc_sk(sk);
1085 1087
1086 llc->k += 1; 1088 llc->k += 1;
1087 if (llc->k > 128) 1089 if (llc->k > (u8) ~LLC_2_SEQ_NBR_MODULO)
1088 llc->k = 128 ; 1090 llc->k = (u8) ~LLC_2_SEQ_NBR_MODULO;
1089 return 0; 1091 return 0;
1090} 1092}
1091 1093
@@ -1309,7 +1311,7 @@ int llc_conn_ac_set_vs_nr(struct sock *sk, struct sk_buff *skb)
1309 1311
1310static int llc_conn_ac_inc_vs_by_1(struct sock *sk, struct sk_buff *skb) 1312static int llc_conn_ac_inc_vs_by_1(struct sock *sk, struct sk_buff *skb)
1311{ 1313{
1312 llc_sk(sk)->vS = (llc_sk(sk)->vS + 1) % 128; 1314 llc_sk(sk)->vS = (llc_sk(sk)->vS + 1) % LLC_2_SEQ_NBR_MODULO;
1313 return 0; 1315 return 0;
1314} 1316}
1315 1317
diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c
index 9a67c796b385..1da678303d78 100644
--- a/net/netfilter/nf_conntrack_core.c
+++ b/net/netfilter/nf_conntrack_core.c
@@ -387,7 +387,7 @@ nf_ct_invert_tuple(struct nf_conntrack_tuple *inverse,
387static void nf_ct_unlink_expect(struct nf_conntrack_expect *exp) 387static void nf_ct_unlink_expect(struct nf_conntrack_expect *exp)
388{ 388{
389 ASSERT_WRITE_LOCK(&nf_conntrack_lock); 389 ASSERT_WRITE_LOCK(&nf_conntrack_lock);
390 NF_CT_ASSERT(!timer_pending(&exp_timeout)); 390 NF_CT_ASSERT(!timer_pending(&exp->timeout));
391 list_del(&exp->list); 391 list_del(&exp->list);
392 NF_CT_STAT_INC(expect_delete); 392 NF_CT_STAT_INC(expect_delete);
393 exp->master->expecting--; 393 exp->master->expecting--;
@@ -1395,6 +1395,13 @@ void nf_conntrack_cleanup(void)
1395 kmem_cache_destroy(nf_conntrack_expect_cachep); 1395 kmem_cache_destroy(nf_conntrack_expect_cachep);
1396 free_conntrack_hash(nf_conntrack_hash, nf_conntrack_vmalloc, 1396 free_conntrack_hash(nf_conntrack_hash, nf_conntrack_vmalloc,
1397 nf_conntrack_htable_size); 1397 nf_conntrack_htable_size);
1398
1399 /* free l3proto protocol tables */
1400 for (i = 0; i < PF_MAX; i++)
1401 if (nf_ct_protos[i]) {
1402 kfree(nf_ct_protos[i]);
1403 nf_ct_protos[i] = NULL;
1404 }
1398} 1405}
1399 1406
1400static struct list_head *alloc_hashtable(int size, int *vmalloced) 1407static struct list_head *alloc_hashtable(int size, int *vmalloced)
diff --git a/net/netfilter/nf_conntrack_standalone.c b/net/netfilter/nf_conntrack_standalone.c
index 45224db4fe2f..5af381f9fe3d 100644
--- a/net/netfilter/nf_conntrack_standalone.c
+++ b/net/netfilter/nf_conntrack_standalone.c
@@ -694,7 +694,7 @@ static int init_or_cleanup(int init)
694 cleanup_proc_stat: 694 cleanup_proc_stat:
695#endif 695#endif
696#ifdef CONFIG_PROC_FS 696#ifdef CONFIG_PROC_FS
697 proc_net_remove("nf_conntrack_stat"); 697 remove_proc_entry("nf_conntrack", proc_net_stat);
698 cleanup_proc_exp: 698 cleanup_proc_exp:
699 proc_net_remove("nf_conntrack_expect"); 699 proc_net_remove("nf_conntrack_expect");
700 cleanup_proc: 700 cleanup_proc:
diff --git a/net/sched/Kconfig b/net/sched/Kconfig
index 7f34e7fd767c..55cd5327fbd7 100644
--- a/net/sched/Kconfig
+++ b/net/sched/Kconfig
@@ -40,9 +40,10 @@ config NET_SCHED
40 The available schedulers are listed in the following questions; you 40 The available schedulers are listed in the following questions; you
41 can say Y to as many as you like. If unsure, say N now. 41 can say Y to as many as you like. If unsure, say N now.
42 42
43if NET_SCHED
44
43choice 45choice
44 prompt "Packet scheduler clock source" 46 prompt "Packet scheduler clock source"
45 depends on NET_SCHED
46 default NET_SCH_CLK_JIFFIES 47 default NET_SCH_CLK_JIFFIES
47 ---help--- 48 ---help---
48 Packet schedulers need a monotonic clock that increments at a static 49 Packet schedulers need a monotonic clock that increments at a static
@@ -98,11 +99,9 @@ config NET_SCH_CLK_CPU
98endchoice 99endchoice
99 100
100comment "Queueing/Scheduling" 101comment "Queueing/Scheduling"
101 depends on NET_SCHED
102 102
103config NET_SCH_CBQ 103config NET_SCH_CBQ
104 tristate "Class Based Queueing (CBQ)" 104 tristate "Class Based Queueing (CBQ)"
105 depends on NET_SCHED
106 ---help--- 105 ---help---
107 Say Y here if you want to use the Class-Based Queueing (CBQ) packet 106 Say Y here if you want to use the Class-Based Queueing (CBQ) packet
108 scheduling algorithm. This algorithm classifies the waiting packets 107 scheduling algorithm. This algorithm classifies the waiting packets
@@ -120,7 +119,6 @@ config NET_SCH_CBQ
120 119
121config NET_SCH_HTB 120config NET_SCH_HTB
122 tristate "Hierarchical Token Bucket (HTB)" 121 tristate "Hierarchical Token Bucket (HTB)"
123 depends on NET_SCHED
124 ---help--- 122 ---help---
125 Say Y here if you want to use the Hierarchical Token Buckets (HTB) 123 Say Y here if you want to use the Hierarchical Token Buckets (HTB)
126 packet scheduling algorithm. See 124 packet scheduling algorithm. See
@@ -135,7 +133,6 @@ config NET_SCH_HTB
135 133
136config NET_SCH_HFSC 134config NET_SCH_HFSC
137 tristate "Hierarchical Fair Service Curve (HFSC)" 135 tristate "Hierarchical Fair Service Curve (HFSC)"
138 depends on NET_SCHED
139 ---help--- 136 ---help---
140 Say Y here if you want to use the Hierarchical Fair Service Curve 137 Say Y here if you want to use the Hierarchical Fair Service Curve
141 (HFSC) packet scheduling algorithm. 138 (HFSC) packet scheduling algorithm.
@@ -145,7 +142,7 @@ config NET_SCH_HFSC
145 142
146config NET_SCH_ATM 143config NET_SCH_ATM
147 tristate "ATM Virtual Circuits (ATM)" 144 tristate "ATM Virtual Circuits (ATM)"
148 depends on NET_SCHED && ATM 145 depends on ATM
149 ---help--- 146 ---help---
150 Say Y here if you want to use the ATM pseudo-scheduler. This 147 Say Y here if you want to use the ATM pseudo-scheduler. This
151 provides a framework for invoking classifiers, which in turn 148 provides a framework for invoking classifiers, which in turn
@@ -159,7 +156,6 @@ config NET_SCH_ATM
159 156
160config NET_SCH_PRIO 157config NET_SCH_PRIO
161 tristate "Multi Band Priority Queueing (PRIO)" 158 tristate "Multi Band Priority Queueing (PRIO)"
162 depends on NET_SCHED
163 ---help--- 159 ---help---
164 Say Y here if you want to use an n-band priority queue packet 160 Say Y here if you want to use an n-band priority queue packet
165 scheduler. 161 scheduler.
@@ -169,7 +165,6 @@ config NET_SCH_PRIO
169 165
170config NET_SCH_RED 166config NET_SCH_RED
171 tristate "Random Early Detection (RED)" 167 tristate "Random Early Detection (RED)"
172 depends on NET_SCHED
173 ---help--- 168 ---help---
174 Say Y here if you want to use the Random Early Detection (RED) 169 Say Y here if you want to use the Random Early Detection (RED)
175 packet scheduling algorithm. 170 packet scheduling algorithm.
@@ -181,7 +176,6 @@ config NET_SCH_RED
181 176
182config NET_SCH_SFQ 177config NET_SCH_SFQ
183 tristate "Stochastic Fairness Queueing (SFQ)" 178 tristate "Stochastic Fairness Queueing (SFQ)"
184 depends on NET_SCHED
185 ---help--- 179 ---help---
186 Say Y here if you want to use the Stochastic Fairness Queueing (SFQ) 180 Say Y here if you want to use the Stochastic Fairness Queueing (SFQ)
187 packet scheduling algorithm . 181 packet scheduling algorithm .
@@ -193,7 +187,6 @@ config NET_SCH_SFQ
193 187
194config NET_SCH_TEQL 188config NET_SCH_TEQL
195 tristate "True Link Equalizer (TEQL)" 189 tristate "True Link Equalizer (TEQL)"
196 depends on NET_SCHED
197 ---help--- 190 ---help---
198 Say Y here if you want to use the True Link Equalizer (TLE) packet 191 Say Y here if you want to use the True Link Equalizer (TLE) packet
199 scheduling algorithm. This queueing discipline allows the combination 192 scheduling algorithm. This queueing discipline allows the combination
@@ -206,7 +199,6 @@ config NET_SCH_TEQL
206 199
207config NET_SCH_TBF 200config NET_SCH_TBF
208 tristate "Token Bucket Filter (TBF)" 201 tristate "Token Bucket Filter (TBF)"
209 depends on NET_SCHED
210 ---help--- 202 ---help---
211 Say Y here if you want to use the Token Bucket Filter (TBF) packet 203 Say Y here if you want to use the Token Bucket Filter (TBF) packet
212 scheduling algorithm. 204 scheduling algorithm.
@@ -218,7 +210,6 @@ config NET_SCH_TBF
218 210
219config NET_SCH_GRED 211config NET_SCH_GRED
220 tristate "Generic Random Early Detection (GRED)" 212 tristate "Generic Random Early Detection (GRED)"
221 depends on NET_SCHED
222 ---help--- 213 ---help---
223 Say Y here if you want to use the Generic Random Early Detection 214 Say Y here if you want to use the Generic Random Early Detection
224 (GRED) packet scheduling algorithm for some of your network devices 215 (GRED) packet scheduling algorithm for some of your network devices
@@ -230,7 +221,6 @@ config NET_SCH_GRED
230 221
231config NET_SCH_DSMARK 222config NET_SCH_DSMARK
232 tristate "Differentiated Services marker (DSMARK)" 223 tristate "Differentiated Services marker (DSMARK)"
233 depends on NET_SCHED
234 ---help--- 224 ---help---
235 Say Y if you want to schedule packets according to the 225 Say Y if you want to schedule packets according to the
236 Differentiated Services architecture proposed in RFC 2475. 226 Differentiated Services architecture proposed in RFC 2475.
@@ -242,7 +232,6 @@ config NET_SCH_DSMARK
242 232
243config NET_SCH_NETEM 233config NET_SCH_NETEM
244 tristate "Network emulator (NETEM)" 234 tristate "Network emulator (NETEM)"
245 depends on NET_SCHED
246 ---help--- 235 ---help---
247 Say Y if you want to emulate network delay, loss, and packet 236 Say Y if you want to emulate network delay, loss, and packet
248 re-ordering. This is often useful to simulate networks when 237 re-ordering. This is often useful to simulate networks when
@@ -255,7 +244,6 @@ config NET_SCH_NETEM
255 244
256config NET_SCH_INGRESS 245config NET_SCH_INGRESS
257 tristate "Ingress Qdisc" 246 tristate "Ingress Qdisc"
258 depends on NET_SCHED
259 ---help--- 247 ---help---
260 Say Y here if you want to use classifiers for incoming packets. 248 Say Y here if you want to use classifiers for incoming packets.
261 If unsure, say Y. 249 If unsure, say Y.
@@ -264,14 +252,12 @@ config NET_SCH_INGRESS
264 module will be called sch_ingress. 252 module will be called sch_ingress.
265 253
266comment "Classification" 254comment "Classification"
267 depends on NET_SCHED
268 255
269config NET_CLS 256config NET_CLS
270 boolean 257 boolean
271 258
272config NET_CLS_BASIC 259config NET_CLS_BASIC
273 tristate "Elementary classification (BASIC)" 260 tristate "Elementary classification (BASIC)"
274 depends NET_SCHED
275 select NET_CLS 261 select NET_CLS
276 ---help--- 262 ---help---
277 Say Y here if you want to be able to classify packets using 263 Say Y here if you want to be able to classify packets using
@@ -282,7 +268,6 @@ config NET_CLS_BASIC
282 268
283config NET_CLS_TCINDEX 269config NET_CLS_TCINDEX
284 tristate "Traffic-Control Index (TCINDEX)" 270 tristate "Traffic-Control Index (TCINDEX)"
285 depends NET_SCHED
286 select NET_CLS 271 select NET_CLS
287 ---help--- 272 ---help---
288 Say Y here if you want to be able to classify packets based on 273 Say Y here if you want to be able to classify packets based on
@@ -294,7 +279,6 @@ config NET_CLS_TCINDEX
294 279
295config NET_CLS_ROUTE4 280config NET_CLS_ROUTE4
296 tristate "Routing decision (ROUTE)" 281 tristate "Routing decision (ROUTE)"
297 depends NET_SCHED
298 select NET_CLS_ROUTE 282 select NET_CLS_ROUTE
299 select NET_CLS 283 select NET_CLS
300 ---help--- 284 ---help---
@@ -306,11 +290,9 @@ config NET_CLS_ROUTE4
306 290
307config NET_CLS_ROUTE 291config NET_CLS_ROUTE
308 bool 292 bool
309 default n
310 293
311config NET_CLS_FW 294config NET_CLS_FW
312 tristate "Netfilter mark (FW)" 295 tristate "Netfilter mark (FW)"
313 depends NET_SCHED
314 select NET_CLS 296 select NET_CLS
315 ---help--- 297 ---help---
316 If you say Y here, you will be able to classify packets 298 If you say Y here, you will be able to classify packets
@@ -321,7 +303,6 @@ config NET_CLS_FW
321 303
322config NET_CLS_U32 304config NET_CLS_U32
323 tristate "Universal 32bit comparisons w/ hashing (U32)" 305 tristate "Universal 32bit comparisons w/ hashing (U32)"
324 depends NET_SCHED
325 select NET_CLS 306 select NET_CLS
326 ---help--- 307 ---help---
327 Say Y here to be able to classify packetes using a universal 308 Say Y here to be able to classify packetes using a universal
@@ -345,7 +326,6 @@ config CLS_U32_MARK
345 326
346config NET_CLS_RSVP 327config NET_CLS_RSVP
347 tristate "IPv4 Resource Reservation Protocol (RSVP)" 328 tristate "IPv4 Resource Reservation Protocol (RSVP)"
348 depends on NET_SCHED
349 select NET_CLS 329 select NET_CLS
350 select NET_ESTIMATOR 330 select NET_ESTIMATOR
351 ---help--- 331 ---help---
@@ -361,7 +341,6 @@ config NET_CLS_RSVP
361 341
362config NET_CLS_RSVP6 342config NET_CLS_RSVP6
363 tristate "IPv6 Resource Reservation Protocol (RSVP6)" 343 tristate "IPv6 Resource Reservation Protocol (RSVP6)"
364 depends on NET_SCHED
365 select NET_CLS 344 select NET_CLS
366 select NET_ESTIMATOR 345 select NET_ESTIMATOR
367 ---help--- 346 ---help---
@@ -377,7 +356,6 @@ config NET_CLS_RSVP6
377 356
378config NET_EMATCH 357config NET_EMATCH
379 bool "Extended Matches" 358 bool "Extended Matches"
380 depends NET_SCHED
381 select NET_CLS 359 select NET_CLS
382 ---help--- 360 ---help---
383 Say Y here if you want to use extended matches on top of classifiers 361 Say Y here if you want to use extended matches on top of classifiers
@@ -456,7 +434,7 @@ config NET_EMATCH_TEXT
456 434
457config NET_CLS_ACT 435config NET_CLS_ACT
458 bool "Actions" 436 bool "Actions"
459 depends on EXPERIMENTAL && NET_SCHED 437 depends on EXPERIMENTAL
460 select NET_ESTIMATOR 438 select NET_ESTIMATOR
461 ---help--- 439 ---help---
462 Say Y here if you want to use traffic control actions. Actions 440 Say Y here if you want to use traffic control actions. Actions
@@ -539,7 +517,7 @@ config NET_ACT_SIMP
539 517
540config NET_CLS_POLICE 518config NET_CLS_POLICE
541 bool "Traffic Policing (obsolete)" 519 bool "Traffic Policing (obsolete)"
542 depends on NET_SCHED && NET_CLS_ACT!=y 520 depends on NET_CLS_ACT!=y
543 select NET_ESTIMATOR 521 select NET_ESTIMATOR
544 ---help--- 522 ---help---
545 Say Y here if you want to do traffic policing, i.e. strict 523 Say Y here if you want to do traffic policing, i.e. strict
@@ -549,7 +527,7 @@ config NET_CLS_POLICE
549 527
550config NET_CLS_IND 528config NET_CLS_IND
551 bool "Incoming device classification" 529 bool "Incoming device classification"
552 depends on NET_SCHED && (NET_CLS_U32 || NET_CLS_FW) 530 depends on NET_CLS_U32 || NET_CLS_FW
553 ---help--- 531 ---help---
554 Say Y here to extend the u32 and fw classifier to support 532 Say Y here to extend the u32 and fw classifier to support
555 classification based on the incoming device. This option is 533 classification based on the incoming device. This option is
@@ -557,11 +535,12 @@ config NET_CLS_IND
557 535
558config NET_ESTIMATOR 536config NET_ESTIMATOR
559 bool "Rate estimator" 537 bool "Rate estimator"
560 depends on NET_SCHED
561 ---help--- 538 ---help---
562 Say Y here to allow using rate estimators to estimate the current 539 Say Y here to allow using rate estimators to estimate the current
563 rate-of-flow for network devices, queues, etc. This module is 540 rate-of-flow for network devices, queues, etc. This module is
564 automaticaly selected if needed but can be selected manually for 541 automaticaly selected if needed but can be selected manually for
565 statstical purposes. 542 statstical purposes.
566 543
544endif # NET_SCHED
545
567endmenu 546endmenu
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c
index e50e7cf43737..c6a51911e71e 100644
--- a/net/sunrpc/svcsock.c
+++ b/net/sunrpc/svcsock.c
@@ -1178,6 +1178,7 @@ svc_recv(struct svc_serv *serv, struct svc_rqst *rqstp, long timeout)
1178 arg->tail[0].iov_len = 0; 1178 arg->tail[0].iov_len = 0;
1179 1179
1180 try_to_freeze(); 1180 try_to_freeze();
1181 cond_resched();
1181 if (signalled()) 1182 if (signalled())
1182 return -EINTR; 1183 return -EINTR;
1183 1184