diff options
author | Christoph Hellwig <hch@lst.de> | 2018-04-11 03:31:28 -0400 |
---|---|---|
committer | Christoph Hellwig <hch@lst.de> | 2018-05-16 01:23:35 -0400 |
commit | 37d849bb4294e22d5250264e82beaf4dd8a5403c (patch) | |
tree | 8f2f81ca47b41241f5372eda7b91ee7e70a193e0 /net/ipv4/tcp_ipv4.c | |
parent | a3d2599b24462c762719a70bc4d2ec8e8cb52fcf (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.c | 85 |
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 | */ |
1962 | static void *listening_get_next(struct seq_file *seq, void *cur) | 1962 | static 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 | */ |
2021 | static void *established_get_first(struct seq_file *seq) | 2022 | static 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 | ||
2052 | static void *established_get_next(struct seq_file *seq, void *cur) | 2054 | static 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 | ||
2138 | static void *tcp_seq_start(struct seq_file *seq, loff_t *pos) | 2142 | void *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 | } |
2163 | EXPORT_SYMBOL(tcp_seq_start); | ||
2159 | 2164 | ||
2160 | static void *tcp_seq_next(struct seq_file *seq, void *v, loff_t *pos) | 2165 | void *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 | } |
2194 | EXPORT_SYMBOL(tcp_seq_next); | ||
2189 | 2195 | ||
2190 | static void tcp_seq_stop(struct seq_file *seq, void *v) | 2196 | void 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 | 2211 | EXPORT_SYMBOL(tcp_seq_stop); | |
2206 | int 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 | } | ||
2222 | EXPORT_SYMBOL(tcp_seq_open); | ||
2223 | |||
2224 | int 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 | } | ||
2239 | EXPORT_SYMBOL(tcp_proc_register); | ||
2240 | |||
2241 | void tcp_proc_unregister(struct net *net, struct tcp_seq_afinfo *afinfo) | ||
2242 | { | ||
2243 | remove_proc_entry(afinfo->name, net->proc_net); | ||
2244 | } | ||
2245 | EXPORT_SYMBOL(tcp_proc_unregister); | ||
2246 | 2212 | ||
2247 | static void get_openreq4(const struct request_sock *req, | 2213 | static 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 | ||
2346 | static 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 | |||
2353 | static 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 | |||
2380 | static const struct file_operations tcp_afinfo_seq_fops = { | 2359 | static 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 | ||
2387 | static struct tcp_seq_afinfo tcp4_seq_afinfo = { | 2366 | static 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 | ||
2396 | static int __net_init tcp4_proc_init_net(struct net *net) | 2370 | static 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 | ||
2401 | static void __net_exit tcp4_proc_exit_net(struct net *net) | 2378 | static 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 | ||
2406 | static struct pernet_operations tcp4_net_ops = { | 2383 | static struct pernet_operations tcp4_net_ops = { |