diff options
author | Christoph Hellwig <hch@lst.de> | 2018-04-10 14:04:20 -0400 |
---|---|---|
committer | Christoph Hellwig <hch@lst.de> | 2018-05-16 01:23:35 -0400 |
commit | f455022166b57c8693897334508dfa75d3b62b38 (patch) | |
tree | 36fee3d300e0d74a0d9984d4781f50feaf64d091 | |
parent | 37d849bb4294e22d5250264e82beaf4dd8a5403c (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.h | 11 | ||||
-rw-r--r-- | net/ipv4/ping.c | 50 | ||||
-rw-r--r-- | net/ipv6/ping.c | 35 |
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); | |||
83 | bool ping_rcv(struct sk_buff *skb); | 83 | bool ping_rcv(struct sk_buff *skb); |
84 | 84 | ||
85 | #ifdef CONFIG_PROC_FS | 85 | #ifdef CONFIG_PROC_FS |
86 | struct 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 | |||
93 | extern const struct file_operations ping_seq_fops; | ||
94 | |||
95 | void *ping_seq_start(struct seq_file *seq, loff_t *pos, sa_family_t family); | 86 | void *ping_seq_start(struct seq_file *seq, loff_t *pos, sa_family_t family); |
96 | void *ping_seq_next(struct seq_file *seq, void *v, loff_t *pos); | 87 | void *ping_seq_next(struct seq_file *seq, void *v, loff_t *pos); |
97 | void ping_seq_stop(struct seq_file *seq, void *v); | 88 | void ping_seq_stop(struct seq_file *seq, void *v); |
98 | int ping_proc_register(struct net *net, struct ping_seq_afinfo *afinfo); | ||
99 | void ping_proc_unregister(struct net *net, struct ping_seq_afinfo *afinfo); | ||
100 | 89 | ||
101 | int __init ping_proc_init(void); | 90 | int __init ping_proc_init(void); |
102 | void ping_proc_exit(void); | 91 | void 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 | ||
1153 | static int ping_seq_open(struct inode *inode, struct file *file) | 1153 | static 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 | |||
1160 | static 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 | ||
1160 | const struct file_operations ping_seq_fops = { | 1166 | const 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 | }; |
1166 | EXPORT_SYMBOL_GPL(ping_seq_fops); | ||
1167 | |||
1168 | static 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 | ||
1180 | int ping_proc_register(struct net *net, struct ping_seq_afinfo *afinfo) | 1173 | static 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 | } |
1189 | EXPORT_SYMBOL_GPL(ping_proc_register); | ||
1190 | |||
1191 | void ping_proc_unregister(struct net *net, struct ping_seq_afinfo *afinfo) | ||
1192 | { | ||
1193 | remove_proc_entry(afinfo->name, net->proc_net); | ||
1194 | } | ||
1195 | EXPORT_SYMBOL_GPL(ping_proc_unregister); | ||
1196 | |||
1197 | static 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 | ||
1202 | static void __net_exit ping_v4_proc_exit_net(struct net *net) | 1180 | static 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 | ||
1207 | static struct pernet_operations ping_v4_net_ops = { | 1185 | static 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 | ||
218 | static struct ping_seq_afinfo ping_v6_seq_afinfo = { | 219 | static 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, | 226 | static 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 | |||
232 | const 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 | ||
230 | static int __net_init ping_v6_proc_init_net(struct net *net) | 239 | static 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 | ||
235 | static void __net_init ping_v6_proc_exit_net(struct net *net) | 246 | static 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 | ||
240 | static struct pernet_operations ping_v6_net_ops = { | 251 | static struct pernet_operations ping_v6_net_ops = { |