Commit e46dc1dab969550d4136e9be0e7919ca09e49573

Authored by Linus Torvalds

Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6

* 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6:
  [IPv6]: Fix ICMPv6 redirect handling with target multicast address
  [PKT_SCHED] cls_u32: error code isn't been propogated properly
  [ROSE]: Fix rose.ko oops on unload
  [TCP]: Fix fastpath_cnt_hint when GSO skb is partially ACKed

Showing 6 changed files Side-by-side Diff

... ... @@ -188,7 +188,7 @@
188 188 extern void rose_enquiry_response(struct sock *);
189 189  
190 190 /* rose_route.c */
191   -extern struct rose_neigh rose_loopback_neigh;
  191 +extern struct rose_neigh *rose_loopback_neigh;
192 192 extern const struct file_operations rose_neigh_fops;
193 193 extern const struct file_operations rose_nodes_fops;
194 194 extern const struct file_operations rose_routes_fops;
net/ipv4/tcp_input.c
... ... @@ -2420,6 +2420,9 @@
2420 2420 __u32 dval = min(tp->fackets_out, packets_acked);
2421 2421 tp->fackets_out -= dval;
2422 2422 }
  2423 + /* hint's skb might be NULL but we don't need to care */
  2424 + tp->fastpath_cnt_hint -= min_t(u32, packets_acked,
  2425 + tp->fastpath_cnt_hint);
2423 2426 tp->packets_out -= packets_acked;
2424 2427  
2425 2428 BUG_ON(tcp_skb_pcount(skb) == 0);
... ... @@ -1268,9 +1268,10 @@
1268 1268  
1269 1269 if (ipv6_addr_equal(dest, target)) {
1270 1270 on_link = 1;
1271   - } else if (!(ipv6_addr_type(target) & IPV6_ADDR_LINKLOCAL)) {
  1271 + } else if (ipv6_addr_type(target) !=
  1272 + (IPV6_ADDR_UNICAST|IPV6_ADDR_LINKLOCAL)) {
1272 1273 ND_PRINTK2(KERN_WARNING
1273   - "ICMPv6 Redirect: target address is not link-local.\n");
  1274 + "ICMPv6 Redirect: target address is not link-local unicast.\n");
1274 1275 return;
1275 1276 }
1276 1277  
1277 1278  
... ... @@ -1344,9 +1345,9 @@
1344 1345 }
1345 1346  
1346 1347 if (!ipv6_addr_equal(&ipv6_hdr(skb)->daddr, target) &&
1347   - !(ipv6_addr_type(target) & IPV6_ADDR_LINKLOCAL)) {
  1348 + ipv6_addr_type(target) != (IPV6_ADDR_UNICAST|IPV6_ADDR_LINKLOCAL)) {
1348 1349 ND_PRINTK2(KERN_WARNING
1349   - "ICMPv6 Redirect: target address is not link-local.\n");
  1350 + "ICMPv6 Redirect: target address is not link-local unicast.\n");
1350 1351 return;
1351 1352 }
1352 1353  
net/rose/rose_loopback.c
... ... @@ -79,7 +79,7 @@
79 79  
80 80 skb_reset_transport_header(skb);
81 81  
82   - sk = rose_find_socket(lci_o, &rose_loopback_neigh);
  82 + sk = rose_find_socket(lci_o, rose_loopback_neigh);
83 83 if (sk) {
84 84 if (rose_process_rx_frame(sk, skb) == 0)
85 85 kfree_skb(skb);
... ... @@ -88,7 +88,7 @@
88 88  
89 89 if (frametype == ROSE_CALL_REQUEST) {
90 90 if ((dev = rose_dev_get(dest)) != NULL) {
91   - if (rose_rx_call_request(skb, dev, &rose_loopback_neigh, lci_o) == 0)
  91 + if (rose_rx_call_request(skb, dev, rose_loopback_neigh, lci_o) == 0)
92 92 kfree_skb(skb);
93 93 } else {
94 94 kfree_skb(skb);
net/rose/rose_route.c
... ... @@ -45,7 +45,7 @@
45 45 static struct rose_route *rose_route_list;
46 46 static DEFINE_SPINLOCK(rose_route_list_lock);
47 47  
48   -struct rose_neigh rose_loopback_neigh;
  48 +struct rose_neigh *rose_loopback_neigh;
49 49  
50 50 /*
51 51 * Add a new route to a node, and in the process add the node and the
52 52  
... ... @@ -362,8 +362,13 @@
362 362 */
363 363 void rose_add_loopback_neigh(void)
364 364 {
365   - struct rose_neigh *sn = &rose_loopback_neigh;
  365 + struct rose_neigh *sn;
366 366  
  367 + rose_loopback_neigh = kmalloc(sizeof(struct rose_neigh), GFP_KERNEL);
  368 + if (!rose_loopback_neigh)
  369 + return;
  370 + sn = rose_loopback_neigh;
  371 +
367 372 sn->callsign = null_ax25_address;
368 373 sn->digipeat = NULL;
369 374 sn->ax25 = NULL;
370 375  
... ... @@ -417,13 +422,13 @@
417 422 rose_node->mask = 10;
418 423 rose_node->count = 1;
419 424 rose_node->loopback = 1;
420   - rose_node->neighbour[0] = &rose_loopback_neigh;
  425 + rose_node->neighbour[0] = rose_loopback_neigh;
421 426  
422 427 /* Insert at the head of list. Address is always mask=10 */
423 428 rose_node->next = rose_node_list;
424 429 rose_node_list = rose_node;
425 430  
426   - rose_loopback_neigh.count++;
  431 + rose_loopback_neigh->count++;
427 432  
428 433 out:
429 434 spin_unlock_bh(&rose_node_list_lock);
... ... @@ -454,7 +459,7 @@
454 459  
455 460 rose_remove_node(rose_node);
456 461  
457   - rose_loopback_neigh.count--;
  462 + rose_loopback_neigh->count--;
458 463  
459 464 out:
460 465 spin_unlock_bh(&rose_node_list_lock);
... ... @@ -502,7 +502,7 @@
502 502  
503 503 #ifdef CONFIG_NET_CLS_IND
504 504 if (tb[TCA_U32_INDEV-1]) {
505   - int err = tcf_change_indev(tp, n->indev, tb[TCA_U32_INDEV-1]);
  505 + err = tcf_change_indev(tp, n->indev, tb[TCA_U32_INDEV-1]);
506 506 if (err < 0)
507 507 goto errout;
508 508 }