aboutsummaryrefslogtreecommitdiffstats
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
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>
-rw-r--r--include/net/tcp.h11
-rw-r--r--net/ipv4/tcp_ipv4.c85
-rw-r--r--net/ipv6/tcp_ipv6.c27
3 files changed, 53 insertions, 70 deletions
diff --git a/include/net/tcp.h b/include/net/tcp.h
index 9c9b3768b350..51dc7a26a2fa 100644
--- a/include/net/tcp.h
+++ b/include/net/tcp.h
@@ -1747,27 +1747,22 @@ enum tcp_seq_states {
1747 TCP_SEQ_STATE_ESTABLISHED, 1747 TCP_SEQ_STATE_ESTABLISHED,
1748}; 1748};
1749 1749
1750int tcp_seq_open(struct inode *inode, struct file *file); 1750void *tcp_seq_start(struct seq_file *seq, loff_t *pos);
1751void *tcp_seq_next(struct seq_file *seq, void *v, loff_t *pos);
1752void tcp_seq_stop(struct seq_file *seq, void *v);
1751 1753
1752struct tcp_seq_afinfo { 1754struct tcp_seq_afinfo {
1753 char *name;
1754 sa_family_t family; 1755 sa_family_t family;
1755 const struct file_operations *seq_fops;
1756 struct seq_operations seq_ops;
1757}; 1756};
1758 1757
1759struct tcp_iter_state { 1758struct tcp_iter_state {
1760 struct seq_net_private p; 1759 struct seq_net_private p;
1761 sa_family_t family;
1762 enum tcp_seq_states state; 1760 enum tcp_seq_states state;
1763 struct sock *syn_wait_sk; 1761 struct sock *syn_wait_sk;
1764 int bucket, offset, sbucket, num; 1762 int bucket, offset, sbucket, num;
1765 loff_t last_pos; 1763 loff_t last_pos;
1766}; 1764};
1767 1765
1768int tcp_proc_register(struct net *net, struct tcp_seq_afinfo *afinfo);
1769void tcp_proc_unregister(struct net *net, struct tcp_seq_afinfo *afinfo);
1770
1771extern struct request_sock_ops tcp_request_sock_ops; 1766extern struct request_sock_ops tcp_request_sock_ops;
1772extern struct request_sock_ops tcp6_request_sock_ops; 1767extern struct request_sock_ops tcp6_request_sock_ops;
1773 1768
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 = {
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
index 6d664d83cd16..c0329bb1692f 100644
--- a/net/ipv6/tcp_ipv6.c
+++ b/net/ipv6/tcp_ipv6.c
@@ -1909,30 +1909,41 @@ out:
1909 return 0; 1909 return 0;
1910} 1910}
1911 1911
1912static const struct seq_operations tcp6_seq_ops = {
1913 .show = tcp6_seq_show,
1914 .start = tcp_seq_start,
1915 .next = tcp_seq_next,
1916 .stop = tcp_seq_stop,
1917};
1918
1919static int tcp6_seq_open(struct inode *inode, struct file *file)
1920{
1921 return seq_open_net(inode, file, &tcp6_seq_ops,
1922 sizeof(struct tcp_iter_state));
1923}
1924
1912static const struct file_operations tcp6_afinfo_seq_fops = { 1925static const struct file_operations tcp6_afinfo_seq_fops = {
1913 .open = tcp_seq_open, 1926 .open = tcp6_seq_open,
1914 .read = seq_read, 1927 .read = seq_read,
1915 .llseek = seq_lseek, 1928 .llseek = seq_lseek,
1916 .release = seq_release_net 1929 .release = seq_release_net
1917}; 1930};
1918 1931
1919static struct tcp_seq_afinfo tcp6_seq_afinfo = { 1932static struct tcp_seq_afinfo tcp6_seq_afinfo = {
1920 .name = "tcp6",
1921 .family = AF_INET6, 1933 .family = AF_INET6,
1922 .seq_fops = &tcp6_afinfo_seq_fops,
1923 .seq_ops = {
1924 .show = tcp6_seq_show,
1925 },
1926}; 1934};
1927 1935
1928int __net_init tcp6_proc_init(struct net *net) 1936int __net_init tcp6_proc_init(struct net *net)
1929{ 1937{
1930 return tcp_proc_register(net, &tcp6_seq_afinfo); 1938 if (!proc_create_data("tcp6", 0444, net->proc_net,
1939 &tcp6_afinfo_seq_fops, &tcp6_seq_afinfo))
1940 return -ENOMEM;
1941 return 0;
1931} 1942}
1932 1943
1933void tcp6_proc_exit(struct net *net) 1944void tcp6_proc_exit(struct net *net)
1934{ 1945{
1935 tcp_proc_unregister(net, &tcp6_seq_afinfo); 1946 remove_proc_entry("tcp6", net->proc_net);
1936} 1947}
1937#endif 1948#endif
1938 1949