summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2018-04-10 14:04:20 -0400
committerChristoph Hellwig <hch@lst.de>2018-05-16 01:23:35 -0400
commitf455022166b57c8693897334508dfa75d3b62b38 (patch)
tree36fee3d300e0d74a0d9984d4781f50feaf64d091
parent37d849bb4294e22d5250264e82beaf4dd8a5403c (diff)
ipv{4,6}/ping: simplify proc file creation
Remove the pointless ping_seq_afinfo indirection and make the code look like most other protocols. Signed-off-by: Christoph Hellwig <hch@lst.de>
-rw-r--r--include/net/ping.h11
-rw-r--r--net/ipv4/ping.c50
-rw-r--r--net/ipv6/ping.c35
3 files changed, 37 insertions, 59 deletions
diff --git a/include/net/ping.h b/include/net/ping.h
index 4cd90d6b5c25..fd080e043a6e 100644
--- a/include/net/ping.h
+++ b/include/net/ping.h
@@ -83,20 +83,9 @@ int ping_queue_rcv_skb(struct sock *sk, struct sk_buff *skb);
83bool ping_rcv(struct sk_buff *skb); 83bool ping_rcv(struct sk_buff *skb);
84 84
85#ifdef CONFIG_PROC_FS 85#ifdef CONFIG_PROC_FS
86struct ping_seq_afinfo {
87 char *name;
88 sa_family_t family;
89 const struct file_operations *seq_fops;
90 const struct seq_operations seq_ops;
91};
92
93extern const struct file_operations ping_seq_fops;
94
95void *ping_seq_start(struct seq_file *seq, loff_t *pos, sa_family_t family); 86void *ping_seq_start(struct seq_file *seq, loff_t *pos, sa_family_t family);
96void *ping_seq_next(struct seq_file *seq, void *v, loff_t *pos); 87void *ping_seq_next(struct seq_file *seq, void *v, loff_t *pos);
97void ping_seq_stop(struct seq_file *seq, void *v); 88void ping_seq_stop(struct seq_file *seq, void *v);
98int ping_proc_register(struct net *net, struct ping_seq_afinfo *afinfo);
99void ping_proc_unregister(struct net *net, struct ping_seq_afinfo *afinfo);
100 89
101int __init ping_proc_init(void); 90int __init ping_proc_init(void);
102void ping_proc_exit(void); 91void ping_proc_exit(void);
diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c
index 56a010622f70..4d21c24dba78 100644
--- a/net/ipv4/ping.c
+++ b/net/ipv4/ping.c
@@ -1150,58 +1150,36 @@ static int ping_v4_seq_show(struct seq_file *seq, void *v)
1150 return 0; 1150 return 0;
1151} 1151}
1152 1152
1153static int ping_seq_open(struct inode *inode, struct file *file) 1153static const struct seq_operations ping_v4_seq_ops = {
1154 .start = ping_v4_seq_start,
1155 .show = ping_v4_seq_show,
1156 .next = ping_seq_next,
1157 .stop = ping_seq_stop,
1158};
1159
1160static int ping_v4_seq_open(struct inode *inode, struct file *file)
1154{ 1161{
1155 struct ping_seq_afinfo *afinfo = PDE_DATA(inode); 1162 return seq_open_net(inode, file, &ping_v4_seq_ops,
1156 return seq_open_net(inode, file, &afinfo->seq_ops,
1157 sizeof(struct ping_iter_state)); 1163 sizeof(struct ping_iter_state));
1158} 1164}
1159 1165
1160const struct file_operations ping_seq_fops = { 1166const struct file_operations ping_v4_seq_fops = {
1161 .open = ping_seq_open, 1167 .open = ping_v4_seq_open,
1162 .read = seq_read, 1168 .read = seq_read,
1163 .llseek = seq_lseek, 1169 .llseek = seq_lseek,
1164 .release = seq_release_net, 1170 .release = seq_release_net,
1165}; 1171};
1166EXPORT_SYMBOL_GPL(ping_seq_fops);
1167
1168static struct ping_seq_afinfo ping_v4_seq_afinfo = {
1169 .name = "icmp",
1170 .family = AF_INET,
1171 .seq_fops = &ping_seq_fops,
1172 .seq_ops = {
1173 .start = ping_v4_seq_start,
1174 .show = ping_v4_seq_show,
1175 .next = ping_seq_next,
1176 .stop = ping_seq_stop,
1177 },
1178};
1179 1172
1180int ping_proc_register(struct net *net, struct ping_seq_afinfo *afinfo) 1173static int __net_init ping_v4_proc_init_net(struct net *net)
1181{ 1174{
1182 struct proc_dir_entry *p; 1175 if (!proc_create("icmp", 0444, net->proc_net, &ping_v4_seq_fops))
1183 p = proc_create_data(afinfo->name, 0444, net->proc_net,
1184 afinfo->seq_fops, afinfo);
1185 if (!p)
1186 return -ENOMEM; 1176 return -ENOMEM;
1187 return 0; 1177 return 0;
1188} 1178}
1189EXPORT_SYMBOL_GPL(ping_proc_register);
1190
1191void ping_proc_unregister(struct net *net, struct ping_seq_afinfo *afinfo)
1192{
1193 remove_proc_entry(afinfo->name, net->proc_net);
1194}
1195EXPORT_SYMBOL_GPL(ping_proc_unregister);
1196
1197static int __net_init ping_v4_proc_init_net(struct net *net)
1198{
1199 return ping_proc_register(net, &ping_v4_seq_afinfo);
1200}
1201 1179
1202static void __net_exit ping_v4_proc_exit_net(struct net *net) 1180static void __net_exit ping_v4_proc_exit_net(struct net *net)
1203{ 1181{
1204 ping_proc_unregister(net, &ping_v4_seq_afinfo); 1182 remove_proc_entry("icmp", net->proc_net);
1205} 1183}
1206 1184
1207static struct pernet_operations ping_v4_net_ops = { 1185static struct pernet_operations ping_v4_net_ops = {
diff --git a/net/ipv6/ping.c b/net/ipv6/ping.c
index 746eeae7f581..45d5c8e0f2bf 100644
--- a/net/ipv6/ping.c
+++ b/net/ipv6/ping.c
@@ -24,6 +24,7 @@
24#include <net/protocol.h> 24#include <net/protocol.h>
25#include <net/udp.h> 25#include <net/udp.h>
26#include <net/transp_v6.h> 26#include <net/transp_v6.h>
27#include <linux/proc_fs.h>
27#include <net/ping.h> 28#include <net/ping.h>
28 29
29/* Compatibility glue so we can support IPv6 when it's compiled as a module */ 30/* Compatibility glue so we can support IPv6 when it's compiled as a module */
@@ -215,26 +216,36 @@ static int ping_v6_seq_show(struct seq_file *seq, void *v)
215 return 0; 216 return 0;
216} 217}
217 218
218static struct ping_seq_afinfo ping_v6_seq_afinfo = { 219static const struct seq_operations ping_v6_seq_ops = {
219 .name = "icmp6", 220 .start = ping_v6_seq_start,
220 .family = AF_INET6, 221 .show = ping_v6_seq_show,
221 .seq_fops = &ping_seq_fops, 222 .next = ping_seq_next,
222 .seq_ops = { 223 .stop = ping_seq_stop,
223 .start = ping_v6_seq_start, 224};
224 .show = ping_v6_seq_show, 225
225 .next = ping_seq_next, 226static int ping_v6_seq_open(struct inode *inode, struct file *file)
226 .stop = ping_seq_stop, 227{
227 }, 228 return seq_open_net(inode, file, &ping_v6_seq_ops,
229 sizeof(struct ping_iter_state));
230}
231
232const struct file_operations ping_v6_seq_fops = {
233 .open = ping_v6_seq_open,
234 .read = seq_read,
235 .llseek = seq_lseek,
236 .release = seq_release_net,
228}; 237};
229 238
230static int __net_init ping_v6_proc_init_net(struct net *net) 239static int __net_init ping_v6_proc_init_net(struct net *net)
231{ 240{
232 return ping_proc_register(net, &ping_v6_seq_afinfo); 241 if (!proc_create("icmp6", 0444, net->proc_net, &ping_v6_seq_fops))
242 return -ENOMEM;
243 return 0;
233} 244}
234 245
235static void __net_init ping_v6_proc_exit_net(struct net *net) 246static void __net_init ping_v6_proc_exit_net(struct net *net)
236{ 247{
237 return ping_proc_unregister(net, &ping_v6_seq_afinfo); 248 remove_proc_entry("icmp6", net->proc_net);
238} 249}
239 250
240static struct pernet_operations ping_v6_net_ops = { 251static struct pernet_operations ping_v6_net_ops = {