aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/tcp_ipv4.c
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2018-04-11 03:31:28 -0400
committerChristoph Hellwig <hch@lst.de>2018-05-16 01:23:35 -0400
commit37d849bb4294e22d5250264e82beaf4dd8a5403c (patch)
tree8f2f81ca47b41241f5372eda7b91ee7e70a193e0 /net/ipv4/tcp_ipv4.c
parenta3d2599b24462c762719a70bc4d2ec8e8cb52fcf (diff)
ipv{4,6}/tcp: simplify procfs registration
Avoid most of the afinfo indirections and just call the proc helpers directly. Signed-off-by: Christoph Hellwig <hch@lst.de>
Diffstat (limited to 'net/ipv4/tcp_ipv4.c')
-rw-r--r--net/ipv4/tcp_ipv4.c85
1 files changed, 31 insertions, 54 deletions
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
index f70586b50838..645f259d0972 100644
--- a/net/ipv4/tcp_ipv4.c
+++ b/net/ipv4/tcp_ipv4.c
@@ -1961,6 +1961,7 @@ EXPORT_SYMBOL(tcp_v4_destroy_sock);
1961 */ 1961 */
1962static void *listening_get_next(struct seq_file *seq, void *cur) 1962static void *listening_get_next(struct seq_file *seq, void *cur)
1963{ 1963{
1964 struct tcp_seq_afinfo *afinfo = PDE_DATA(file_inode(seq->file));
1964 struct tcp_iter_state *st = seq->private; 1965 struct tcp_iter_state *st = seq->private;
1965 struct net *net = seq_file_net(seq); 1966 struct net *net = seq_file_net(seq);
1966 struct inet_listen_hashbucket *ilb; 1967 struct inet_listen_hashbucket *ilb;
@@ -1983,7 +1984,7 @@ get_sk:
1983 sk_for_each_from(sk) { 1984 sk_for_each_from(sk) {
1984 if (!net_eq(sock_net(sk), net)) 1985 if (!net_eq(sock_net(sk), net))
1985 continue; 1986 continue;
1986 if (sk->sk_family == st->family) 1987 if (sk->sk_family == afinfo->family)
1987 return sk; 1988 return sk;
1988 } 1989 }
1989 spin_unlock(&ilb->lock); 1990 spin_unlock(&ilb->lock);
@@ -2020,6 +2021,7 @@ static inline bool empty_bucket(const struct tcp_iter_state *st)
2020 */ 2021 */
2021static void *established_get_first(struct seq_file *seq) 2022static void *established_get_first(struct seq_file *seq)
2022{ 2023{
2024 struct tcp_seq_afinfo *afinfo = PDE_DATA(file_inode(seq->file));
2023 struct tcp_iter_state *st = seq->private; 2025 struct tcp_iter_state *st = seq->private;
2024 struct net *net = seq_file_net(seq); 2026 struct net *net = seq_file_net(seq);
2025 void *rc = NULL; 2027 void *rc = NULL;
@@ -2036,7 +2038,7 @@ static void *established_get_first(struct seq_file *seq)
2036 2038
2037 spin_lock_bh(lock); 2039 spin_lock_bh(lock);
2038 sk_nulls_for_each(sk, node, &tcp_hashinfo.ehash[st->bucket].chain) { 2040 sk_nulls_for_each(sk, node, &tcp_hashinfo.ehash[st->bucket].chain) {
2039 if (sk->sk_family != st->family || 2041 if (sk->sk_family != afinfo->family ||
2040 !net_eq(sock_net(sk), net)) { 2042 !net_eq(sock_net(sk), net)) {
2041 continue; 2043 continue;
2042 } 2044 }
@@ -2051,6 +2053,7 @@ out:
2051 2053
2052static void *established_get_next(struct seq_file *seq, void *cur) 2054static void *established_get_next(struct seq_file *seq, void *cur)
2053{ 2055{
2056 struct tcp_seq_afinfo *afinfo = PDE_DATA(file_inode(seq->file));
2054 struct sock *sk = cur; 2057 struct sock *sk = cur;
2055 struct hlist_nulls_node *node; 2058 struct hlist_nulls_node *node;
2056 struct tcp_iter_state *st = seq->private; 2059 struct tcp_iter_state *st = seq->private;
@@ -2062,7 +2065,8 @@ static void *established_get_next(struct seq_file *seq, void *cur)
2062 sk = sk_nulls_next(sk); 2065 sk = sk_nulls_next(sk);
2063 2066
2064 sk_nulls_for_each_from(sk, node) { 2067 sk_nulls_for_each_from(sk, node) {
2065 if (sk->sk_family == st->family && net_eq(sock_net(sk), net)) 2068 if (sk->sk_family == afinfo->family &&
2069 net_eq(sock_net(sk), net))
2066 return sk; 2070 return sk;
2067 } 2071 }
2068 2072
@@ -2135,7 +2139,7 @@ static void *tcp_seek_last_pos(struct seq_file *seq)
2135 return rc; 2139 return rc;
2136} 2140}
2137 2141
2138static void *tcp_seq_start(struct seq_file *seq, loff_t *pos) 2142void *tcp_seq_start(struct seq_file *seq, loff_t *pos)
2139{ 2143{
2140 struct tcp_iter_state *st = seq->private; 2144 struct tcp_iter_state *st = seq->private;
2141 void *rc; 2145 void *rc;
@@ -2156,8 +2160,9 @@ out:
2156 st->last_pos = *pos; 2160 st->last_pos = *pos;
2157 return rc; 2161 return rc;
2158} 2162}
2163EXPORT_SYMBOL(tcp_seq_start);
2159 2164
2160static void *tcp_seq_next(struct seq_file *seq, void *v, loff_t *pos) 2165void *tcp_seq_next(struct seq_file *seq, void *v, loff_t *pos)
2161{ 2166{
2162 struct tcp_iter_state *st = seq->private; 2167 struct tcp_iter_state *st = seq->private;
2163 void *rc = NULL; 2168 void *rc = NULL;
@@ -2186,8 +2191,9 @@ out:
2186 st->last_pos = *pos; 2191 st->last_pos = *pos;
2187 return rc; 2192 return rc;
2188} 2193}
2194EXPORT_SYMBOL(tcp_seq_next);
2189 2195
2190static void tcp_seq_stop(struct seq_file *seq, void *v) 2196void tcp_seq_stop(struct seq_file *seq, void *v)
2191{ 2197{
2192 struct tcp_iter_state *st = seq->private; 2198 struct tcp_iter_state *st = seq->private;
2193 2199
@@ -2202,47 +2208,7 @@ static void tcp_seq_stop(struct seq_file *seq, void *v)
2202 break; 2208 break;
2203 } 2209 }
2204} 2210}
2205 2211EXPORT_SYMBOL(tcp_seq_stop);
2206int tcp_seq_open(struct inode *inode, struct file *file)
2207{
2208 struct tcp_seq_afinfo *afinfo = PDE_DATA(inode);
2209 struct tcp_iter_state *s;
2210 int err;
2211
2212 err = seq_open_net(inode, file, &afinfo->seq_ops,
2213 sizeof(struct tcp_iter_state));
2214 if (err < 0)
2215 return err;
2216
2217 s = ((struct seq_file *)file->private_data)->private;
2218 s->family = afinfo->family;
2219 s->last_pos = 0;
2220 return 0;
2221}
2222EXPORT_SYMBOL(tcp_seq_open);
2223
2224int tcp_proc_register(struct net *net, struct tcp_seq_afinfo *afinfo)
2225{
2226 int rc = 0;
2227 struct proc_dir_entry *p;
2228
2229 afinfo->seq_ops.start = tcp_seq_start;
2230 afinfo->seq_ops.next = tcp_seq_next;
2231 afinfo->seq_ops.stop = tcp_seq_stop;
2232
2233 p = proc_create_data(afinfo->name, 0444, net->proc_net,
2234 afinfo->seq_fops, afinfo);
2235 if (!p)
2236 rc = -ENOMEM;
2237 return rc;
2238}
2239EXPORT_SYMBOL(tcp_proc_register);
2240
2241void tcp_proc_unregister(struct net *net, struct tcp_seq_afinfo *afinfo)
2242{
2243 remove_proc_entry(afinfo->name, net->proc_net);
2244}
2245EXPORT_SYMBOL(tcp_proc_unregister);
2246 2212
2247static void get_openreq4(const struct request_sock *req, 2213static void get_openreq4(const struct request_sock *req,
2248 struct seq_file *f, int i) 2214 struct seq_file *f, int i)
@@ -2377,6 +2343,19 @@ out:
2377 return 0; 2343 return 0;
2378} 2344}
2379 2345
2346static const struct seq_operations tcp4_seq_ops = {
2347 .show = tcp4_seq_show,
2348 .start = tcp_seq_start,
2349 .next = tcp_seq_next,
2350 .stop = tcp_seq_stop,
2351};
2352
2353static int tcp_seq_open(struct inode *inode, struct file *file)
2354{
2355 return seq_open_net(inode, file, &tcp4_seq_ops,
2356 sizeof(struct tcp_iter_state));
2357}
2358
2380static const struct file_operations tcp_afinfo_seq_fops = { 2359static const struct file_operations tcp_afinfo_seq_fops = {
2381 .open = tcp_seq_open, 2360 .open = tcp_seq_open,
2382 .read = seq_read, 2361 .read = seq_read,
@@ -2385,22 +2364,20 @@ static const struct file_operations tcp_afinfo_seq_fops = {
2385}; 2364};
2386 2365
2387static struct tcp_seq_afinfo tcp4_seq_afinfo = { 2366static struct tcp_seq_afinfo tcp4_seq_afinfo = {
2388 .name = "tcp",
2389 .family = AF_INET, 2367 .family = AF_INET,
2390 .seq_fops = &tcp_afinfo_seq_fops,
2391 .seq_ops = {
2392 .show = tcp4_seq_show,
2393 },
2394}; 2368};
2395 2369
2396static int __net_init tcp4_proc_init_net(struct net *net) 2370static int __net_init tcp4_proc_init_net(struct net *net)
2397{ 2371{
2398 return tcp_proc_register(net, &tcp4_seq_afinfo); 2372 if (!proc_create_data("tcp", 0444, net->proc_net,
2373 &tcp_afinfo_seq_fops, &tcp4_seq_afinfo))
2374 return -ENOMEM;
2375 return 0;
2399} 2376}
2400 2377
2401static void __net_exit tcp4_proc_exit_net(struct net *net) 2378static void __net_exit tcp4_proc_exit_net(struct net *net)
2402{ 2379{
2403 tcp_proc_unregister(net, &tcp4_seq_afinfo); 2380 remove_proc_entry("tcp", net->proc_net);
2404} 2381}
2405 2382
2406static struct pernet_operations tcp4_net_ops = { 2383static struct pernet_operations tcp4_net_ops = {