diff options
Diffstat (limited to 'net/ipv4/tcp_ipv4.c')
| -rw-r--r-- | net/ipv4/tcp_ipv4.c | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 0ea10eefa60f..a9db4b1a2215 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
| @@ -1510,6 +1510,8 @@ exit: | |||
| 1510 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_LISTENDROPS); | 1510 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_LISTENDROPS); |
| 1511 | return NULL; | 1511 | return NULL; |
| 1512 | put_and_exit: | 1512 | put_and_exit: |
| 1513 | tcp_clear_xmit_timers(newsk); | ||
| 1514 | bh_unlock_sock(newsk); | ||
| 1513 | sock_put(newsk); | 1515 | sock_put(newsk); |
| 1514 | goto exit; | 1516 | goto exit; |
| 1515 | } | 1517 | } |
| @@ -2339,7 +2341,7 @@ static void tcp_seq_stop(struct seq_file *seq, void *v) | |||
| 2339 | } | 2341 | } |
| 2340 | } | 2342 | } |
| 2341 | 2343 | ||
| 2342 | static int tcp_seq_open(struct inode *inode, struct file *file) | 2344 | int tcp_seq_open(struct inode *inode, struct file *file) |
| 2343 | { | 2345 | { |
| 2344 | struct tcp_seq_afinfo *afinfo = PDE(inode)->data; | 2346 | struct tcp_seq_afinfo *afinfo = PDE(inode)->data; |
| 2345 | struct tcp_iter_state *s; | 2347 | struct tcp_iter_state *s; |
| @@ -2355,23 +2357,19 @@ static int tcp_seq_open(struct inode *inode, struct file *file) | |||
| 2355 | s->last_pos = 0; | 2357 | s->last_pos = 0; |
| 2356 | return 0; | 2358 | return 0; |
| 2357 | } | 2359 | } |
| 2360 | EXPORT_SYMBOL(tcp_seq_open); | ||
| 2358 | 2361 | ||
| 2359 | int tcp_proc_register(struct net *net, struct tcp_seq_afinfo *afinfo) | 2362 | int tcp_proc_register(struct net *net, struct tcp_seq_afinfo *afinfo) |
| 2360 | { | 2363 | { |
| 2361 | int rc = 0; | 2364 | int rc = 0; |
| 2362 | struct proc_dir_entry *p; | 2365 | struct proc_dir_entry *p; |
| 2363 | 2366 | ||
| 2364 | afinfo->seq_fops.open = tcp_seq_open; | ||
| 2365 | afinfo->seq_fops.read = seq_read; | ||
| 2366 | afinfo->seq_fops.llseek = seq_lseek; | ||
| 2367 | afinfo->seq_fops.release = seq_release_net; | ||
| 2368 | |||
| 2369 | afinfo->seq_ops.start = tcp_seq_start; | 2367 | afinfo->seq_ops.start = tcp_seq_start; |
| 2370 | afinfo->seq_ops.next = tcp_seq_next; | 2368 | afinfo->seq_ops.next = tcp_seq_next; |
| 2371 | afinfo->seq_ops.stop = tcp_seq_stop; | 2369 | afinfo->seq_ops.stop = tcp_seq_stop; |
| 2372 | 2370 | ||
| 2373 | p = proc_create_data(afinfo->name, S_IRUGO, net->proc_net, | 2371 | p = proc_create_data(afinfo->name, S_IRUGO, net->proc_net, |
| 2374 | &afinfo->seq_fops, afinfo); | 2372 | afinfo->seq_fops, afinfo); |
| 2375 | if (!p) | 2373 | if (!p) |
| 2376 | rc = -ENOMEM; | 2374 | rc = -ENOMEM; |
| 2377 | return rc; | 2375 | return rc; |
| @@ -2520,12 +2518,18 @@ out: | |||
| 2520 | return 0; | 2518 | return 0; |
| 2521 | } | 2519 | } |
| 2522 | 2520 | ||
| 2521 | static const struct file_operations tcp_afinfo_seq_fops = { | ||
| 2522 | .owner = THIS_MODULE, | ||
| 2523 | .open = tcp_seq_open, | ||
| 2524 | .read = seq_read, | ||
| 2525 | .llseek = seq_lseek, | ||
| 2526 | .release = seq_release_net | ||
| 2527 | }; | ||
| 2528 | |||
| 2523 | static struct tcp_seq_afinfo tcp4_seq_afinfo = { | 2529 | static struct tcp_seq_afinfo tcp4_seq_afinfo = { |
| 2524 | .name = "tcp", | 2530 | .name = "tcp", |
| 2525 | .family = AF_INET, | 2531 | .family = AF_INET, |
| 2526 | .seq_fops = { | 2532 | .seq_fops = &tcp_afinfo_seq_fops, |
| 2527 | .owner = THIS_MODULE, | ||
| 2528 | }, | ||
| 2529 | .seq_ops = { | 2533 | .seq_ops = { |
| 2530 | .show = tcp4_seq_show, | 2534 | .show = tcp4_seq_show, |
| 2531 | }, | 2535 | }, |
