diff options
Diffstat (limited to 'net/ipv4/tcp_ipv4.c')
| -rw-r--r-- | net/ipv4/tcp_ipv4.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index d438dfb0c8f3..e566f3c67677 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
| @@ -2049,8 +2049,9 @@ static void *established_get_first(struct seq_file *seq) | |||
| 2049 | struct sock *sk; | 2049 | struct sock *sk; |
| 2050 | struct hlist_node *node; | 2050 | struct hlist_node *node; |
| 2051 | struct inet_timewait_sock *tw; | 2051 | struct inet_timewait_sock *tw; |
| 2052 | rwlock_t *lock = inet_ehash_lockp(&tcp_hashinfo, st->bucket); | ||
| 2052 | 2053 | ||
| 2053 | read_lock_bh(&tcp_hashinfo.ehash[st->bucket].lock); | 2054 | read_lock_bh(lock); |
| 2054 | sk_for_each(sk, node, &tcp_hashinfo.ehash[st->bucket].chain) { | 2055 | sk_for_each(sk, node, &tcp_hashinfo.ehash[st->bucket].chain) { |
| 2055 | if (sk->sk_family != st->family) { | 2056 | if (sk->sk_family != st->family) { |
| 2056 | continue; | 2057 | continue; |
| @@ -2067,7 +2068,7 @@ static void *established_get_first(struct seq_file *seq) | |||
| 2067 | rc = tw; | 2068 | rc = tw; |
| 2068 | goto out; | 2069 | goto out; |
| 2069 | } | 2070 | } |
| 2070 | read_unlock_bh(&tcp_hashinfo.ehash[st->bucket].lock); | 2071 | read_unlock_bh(lock); |
| 2071 | st->state = TCP_SEQ_STATE_ESTABLISHED; | 2072 | st->state = TCP_SEQ_STATE_ESTABLISHED; |
| 2072 | } | 2073 | } |
| 2073 | out: | 2074 | out: |
| @@ -2094,11 +2095,11 @@ get_tw: | |||
| 2094 | cur = tw; | 2095 | cur = tw; |
| 2095 | goto out; | 2096 | goto out; |
| 2096 | } | 2097 | } |
| 2097 | read_unlock_bh(&tcp_hashinfo.ehash[st->bucket].lock); | 2098 | read_unlock_bh(inet_ehash_lockp(&tcp_hashinfo, st->bucket)); |
| 2098 | st->state = TCP_SEQ_STATE_ESTABLISHED; | 2099 | st->state = TCP_SEQ_STATE_ESTABLISHED; |
| 2099 | 2100 | ||
| 2100 | if (++st->bucket < tcp_hashinfo.ehash_size) { | 2101 | if (++st->bucket < tcp_hashinfo.ehash_size) { |
| 2101 | read_lock_bh(&tcp_hashinfo.ehash[st->bucket].lock); | 2102 | read_lock_bh(inet_ehash_lockp(&tcp_hashinfo, st->bucket)); |
| 2102 | sk = sk_head(&tcp_hashinfo.ehash[st->bucket].chain); | 2103 | sk = sk_head(&tcp_hashinfo.ehash[st->bucket].chain); |
| 2103 | } else { | 2104 | } else { |
| 2104 | cur = NULL; | 2105 | cur = NULL; |
| @@ -2206,7 +2207,7 @@ static void tcp_seq_stop(struct seq_file *seq, void *v) | |||
| 2206 | case TCP_SEQ_STATE_TIME_WAIT: | 2207 | case TCP_SEQ_STATE_TIME_WAIT: |
| 2207 | case TCP_SEQ_STATE_ESTABLISHED: | 2208 | case TCP_SEQ_STATE_ESTABLISHED: |
| 2208 | if (v) | 2209 | if (v) |
| 2209 | read_unlock_bh(&tcp_hashinfo.ehash[st->bucket].lock); | 2210 | read_unlock_bh(inet_ehash_lockp(&tcp_hashinfo, st->bucket)); |
| 2210 | break; | 2211 | break; |
| 2211 | } | 2212 | } |
| 2212 | } | 2213 | } |
| @@ -2417,6 +2418,8 @@ void tcp4_proc_exit(void) | |||
| 2417 | } | 2418 | } |
| 2418 | #endif /* CONFIG_PROC_FS */ | 2419 | #endif /* CONFIG_PROC_FS */ |
| 2419 | 2420 | ||
| 2421 | DEFINE_PROTO_INUSE(tcp) | ||
| 2422 | |||
| 2420 | struct proto tcp_prot = { | 2423 | struct proto tcp_prot = { |
| 2421 | .name = "TCP", | 2424 | .name = "TCP", |
| 2422 | .owner = THIS_MODULE, | 2425 | .owner = THIS_MODULE, |
| @@ -2451,6 +2454,7 @@ struct proto tcp_prot = { | |||
| 2451 | .compat_setsockopt = compat_tcp_setsockopt, | 2454 | .compat_setsockopt = compat_tcp_setsockopt, |
| 2452 | .compat_getsockopt = compat_tcp_getsockopt, | 2455 | .compat_getsockopt = compat_tcp_getsockopt, |
| 2453 | #endif | 2456 | #endif |
| 2457 | REF_PROTO_INUSE(tcp) | ||
| 2454 | }; | 2458 | }; |
| 2455 | 2459 | ||
| 2456 | void __init tcp_v4_init(struct net_proto_family *ops) | 2460 | void __init tcp_v4_init(struct net_proto_family *ops) |
