aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2018-06-04 13:00:01 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2018-06-04 13:00:01 -0400
commitcf626b0da78df6669c6b5f51ddd9a70a0702e579 (patch)
tree45d29a4cb7574aed7f140814ed22088ded21c291 /net
parent9c50eafc32ddbd166c8a2bbaecd4ad201c452b14 (diff)
parent5ef03dbd91855544cd4c7c1910c3ef5226ee87e8 (diff)
Merge branch 'hch.procfs' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull procfs updates from Al Viro: "Christoph's proc_create_... cleanups series" * 'hch.procfs' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (44 commits) xfs, proc: hide unused xfs procfs helpers isdn/gigaset: add back gigaset_procinfo assignment proc: update SIZEOF_PDE_INLINE_NAME for the new pde fields tty: replace ->proc_fops with ->proc_show ide: replace ->proc_fops with ->proc_show ide: remove ide_driver_proc_write isdn: replace ->proc_fops with ->proc_show atm: switch to proc_create_seq_private atm: simplify procfs code bluetooth: switch to proc_create_seq_data netfilter/x_tables: switch to proc_create_seq_private netfilter/xt_hashlimit: switch to proc_create_{seq,single}_data neigh: switch to proc_create_seq_data hostap: switch to proc_create_{seq,single}_data bonding: switch to proc_create_seq_data rtc/proc: switch to proc_create_single_data drbd: switch to proc_create_single resource: switch to proc_create_seq_data staging/rtl8192u: simplify procfs code jfs: simplify procfs code ...
Diffstat (limited to 'net')
-rw-r--r--net/8021q/vlanproc.c39
-rw-r--r--net/appletalk/aarp.c20
-rw-r--r--net/appletalk/atalk_proc.c51
-rw-r--r--net/atm/br2684.c14
-rw-r--r--net/atm/clip.c17
-rw-r--r--net/atm/lec.c15
-rw-r--r--net/atm/proc.c131
-rw-r--r--net/ax25/af_ax25.c21
-rw-r--r--net/ax25/ax25_route.c15
-rw-r--r--net/ax25/ax25_uid.c15
-rw-r--r--net/bluetooth/af_bluetooth.c40
-rw-r--r--net/bluetooth/cmtp/capi.c14
-rw-r--r--net/can/bcm.c16
-rw-r--r--net/can/proc.c127
-rw-r--r--net/core/neighbour.c31
-rw-r--r--net/core/net-procfs.c65
-rw-r--r--net/core/sock.c16
-rw-r--r--net/decnet/af_decnet.c17
-rw-r--r--net/decnet/dn_dev.c15
-rw-r--r--net/decnet/dn_neigh.c18
-rw-r--r--net/decnet/dn_route.c19
-rw-r--r--net/ipv4/arp.c17
-rw-r--r--net/ipv4/fib_trie.c48
-rw-r--r--net/ipv4/igmp.c33
-rw-r--r--net/ipv4/ipconfig.c14
-rw-r--r--net/ipv4/ipmr.c32
-rw-r--r--net/ipv4/ping.c52
-rw-r--r--net/ipv4/proc.c48
-rw-r--r--net/ipv4/raw.c45
-rw-r--r--net/ipv4/route.c15
-rw-r--r--net/ipv4/tcp_ipv4.c82
-rw-r--r--net/ipv4/udp.c94
-rw-r--r--net/ipv4/udplite.c21
-rw-r--r--net/ipv6/addrconf.c16
-rw-r--r--net/ipv6/anycast.c16
-rw-r--r--net/ipv6/ip6_fib.c18
-rw-r--r--net/ipv6/ip6_flowlabel.c42
-rw-r--r--net/ipv6/ip6mr.c32
-rw-r--r--net/ipv6/mcast.c34
-rw-r--r--net/ipv6/ping.c23
-rw-r--r--net/ipv6/proc.c48
-rw-r--r--net/ipv6/raw.c15
-rw-r--r--net/ipv6/route.c26
-rw-r--r--net/ipv6/tcp_ipv6.c22
-rw-r--r--net/ipv6/udp.c23
-rw-r--r--net/ipv6/udplite.c22
-rw-r--r--net/kcm/kcmproc.c83
-rw-r--r--net/key/af_key.c16
-rw-r--r--net/l2tp/l2tp_ppp.c22
-rw-r--r--net/llc/llc_proc.c28
-rw-r--r--net/netfilter/ipvs/ip_vs_app.c16
-rw-r--r--net/netfilter/ipvs/ip_vs_conn.c35
-rw-r--r--net/netfilter/ipvs/ip_vs_ctl.c47
-rw-r--r--net/netfilter/nf_conntrack_expect.c17
-rw-r--r--net/netfilter/nf_conntrack_standalone.c33
-rw-r--r--net/netfilter/nf_log.c19
-rw-r--r--net/netfilter/nf_synproxy_core.c17
-rw-r--r--net/netfilter/nfnetlink_log.c18
-rw-r--r--net/netfilter/nfnetlink_queue.c18
-rw-r--r--net/netfilter/x_tables.c95
-rw-r--r--net/netfilter/xt_hashlimit.c92
-rw-r--r--net/netlink/af_netlink.c18
-rw-r--r--net/netrom/af_netrom.c18
-rw-r--r--net/netrom/nr_route.c29
-rw-r--r--net/packet/af_packet.c17
-rw-r--r--net/phonet/pn_dev.c6
-rw-r--r--net/phonet/socket.c30
-rw-r--r--net/rose/af_rose.c26
-rw-r--r--net/rose/rose_route.c44
-rw-r--r--net/rxrpc/ar-internal.h4
-rw-r--r--net/rxrpc/net_ns.c7
-rw-r--r--net/rxrpc/proc.c31
-rw-r--r--net/sched/sch_api.c14
-rw-r--r--net/sctp/objcnt.c16
-rw-r--r--net/sctp/proc.c71
-rw-r--r--net/unix/af_unix.c17
-rw-r--r--net/wireless/wext-proc.c17
-rw-r--r--net/x25/x25_proc.c48
-rw-r--r--net/xfrm/xfrm_proc.c16
79 files changed, 408 insertions, 2131 deletions
diff --git a/net/8021q/vlanproc.c b/net/8021q/vlanproc.c
index a627a5db2125..d36e8c4b7f56 100644
--- a/net/8021q/vlanproc.c
+++ b/net/8021q/vlanproc.c
@@ -73,35 +73,6 @@ static const struct seq_operations vlan_seq_ops = {
73 .show = vlan_seq_show, 73 .show = vlan_seq_show,
74}; 74};
75 75
76static int vlan_seq_open(struct inode *inode, struct file *file)
77{
78 return seq_open_net(inode, file, &vlan_seq_ops,
79 sizeof(struct seq_net_private));
80}
81
82static const struct file_operations vlan_fops = {
83 .open = vlan_seq_open,
84 .read = seq_read,
85 .llseek = seq_lseek,
86 .release = seq_release_net,
87};
88
89/*
90 * /proc/net/vlan/<device> file and inode operations
91 */
92
93static int vlandev_seq_open(struct inode *inode, struct file *file)
94{
95 return single_open(file, vlandev_seq_show, PDE_DATA(inode));
96}
97
98static const struct file_operations vlandev_fops = {
99 .open = vlandev_seq_open,
100 .read = seq_read,
101 .llseek = seq_lseek,
102 .release = single_release,
103};
104
105/* 76/*
106 * Proc filesystem directory entries. 77 * Proc filesystem directory entries.
107 */ 78 */
@@ -148,8 +119,9 @@ int __net_init vlan_proc_init(struct net *net)
148 if (!vn->proc_vlan_dir) 119 if (!vn->proc_vlan_dir)
149 goto err; 120 goto err;
150 121
151 vn->proc_vlan_conf = proc_create(name_conf, S_IFREG | 0600, 122 vn->proc_vlan_conf = proc_create_net(name_conf, S_IFREG | 0600,
152 vn->proc_vlan_dir, &vlan_fops); 123 vn->proc_vlan_dir, &vlan_seq_ops,
124 sizeof(struct seq_net_private));
153 if (!vn->proc_vlan_conf) 125 if (!vn->proc_vlan_conf)
154 goto err; 126 goto err;
155 return 0; 127 return 0;
@@ -171,9 +143,8 @@ int vlan_proc_add_dev(struct net_device *vlandev)
171 143
172 if (!strcmp(vlandev->name, name_conf)) 144 if (!strcmp(vlandev->name, name_conf))
173 return -EINVAL; 145 return -EINVAL;
174 vlan->dent = 146 vlan->dent = proc_create_single_data(vlandev->name, S_IFREG | 0600,
175 proc_create_data(vlandev->name, S_IFREG | 0600, 147 vn->proc_vlan_dir, vlandev_seq_show, vlandev);
176 vn->proc_vlan_dir, &vlandev_fops, vlandev);
177 if (!vlan->dent) 148 if (!vlan->dent)
178 return -ENOBUFS; 149 return -ENOBUFS;
179 return 0; 150 return 0;
diff --git a/net/appletalk/aarp.c b/net/appletalk/aarp.c
index d4c1021e74e1..49a16cee2aae 100644
--- a/net/appletalk/aarp.c
+++ b/net/appletalk/aarp.c
@@ -907,11 +907,6 @@ void aarp_device_down(struct net_device *dev)
907} 907}
908 908
909#ifdef CONFIG_PROC_FS 909#ifdef CONFIG_PROC_FS
910struct aarp_iter_state {
911 int bucket;
912 struct aarp_entry **table;
913};
914
915/* 910/*
916 * Get the aarp entry that is in the chain described 911 * Get the aarp entry that is in the chain described
917 * by the iterator. 912 * by the iterator.
@@ -1033,25 +1028,12 @@ static int aarp_seq_show(struct seq_file *seq, void *v)
1033 return 0; 1028 return 0;
1034} 1029}
1035 1030
1036static const struct seq_operations aarp_seq_ops = { 1031const struct seq_operations aarp_seq_ops = {
1037 .start = aarp_seq_start, 1032 .start = aarp_seq_start,
1038 .next = aarp_seq_next, 1033 .next = aarp_seq_next,
1039 .stop = aarp_seq_stop, 1034 .stop = aarp_seq_stop,
1040 .show = aarp_seq_show, 1035 .show = aarp_seq_show,
1041}; 1036};
1042
1043static int aarp_seq_open(struct inode *inode, struct file *file)
1044{
1045 return seq_open_private(file, &aarp_seq_ops,
1046 sizeof(struct aarp_iter_state));
1047}
1048
1049const struct file_operations atalk_seq_arp_fops = {
1050 .open = aarp_seq_open,
1051 .read = seq_read,
1052 .llseek = seq_lseek,
1053 .release = seq_release_private,
1054};
1055#endif 1037#endif
1056 1038
1057/* General module cleanup. Called from cleanup_module() in ddp.c. */ 1039/* General module cleanup. Called from cleanup_module() in ddp.c. */
diff --git a/net/appletalk/atalk_proc.c b/net/appletalk/atalk_proc.c
index 7214aea14cb3..8006295f8bd7 100644
--- a/net/appletalk/atalk_proc.c
+++ b/net/appletalk/atalk_proc.c
@@ -210,42 +210,6 @@ static const struct seq_operations atalk_seq_socket_ops = {
210 .show = atalk_seq_socket_show, 210 .show = atalk_seq_socket_show,
211}; 211};
212 212
213static int atalk_seq_interface_open(struct inode *inode, struct file *file)
214{
215 return seq_open(file, &atalk_seq_interface_ops);
216}
217
218static int atalk_seq_route_open(struct inode *inode, struct file *file)
219{
220 return seq_open(file, &atalk_seq_route_ops);
221}
222
223static int atalk_seq_socket_open(struct inode *inode, struct file *file)
224{
225 return seq_open(file, &atalk_seq_socket_ops);
226}
227
228static const struct file_operations atalk_seq_interface_fops = {
229 .open = atalk_seq_interface_open,
230 .read = seq_read,
231 .llseek = seq_lseek,
232 .release = seq_release,
233};
234
235static const struct file_operations atalk_seq_route_fops = {
236 .open = atalk_seq_route_open,
237 .read = seq_read,
238 .llseek = seq_lseek,
239 .release = seq_release,
240};
241
242static const struct file_operations atalk_seq_socket_fops = {
243 .open = atalk_seq_socket_open,
244 .read = seq_read,
245 .llseek = seq_lseek,
246 .release = seq_release,
247};
248
249static struct proc_dir_entry *atalk_proc_dir; 213static struct proc_dir_entry *atalk_proc_dir;
250 214
251int __init atalk_proc_init(void) 215int __init atalk_proc_init(void)
@@ -257,22 +221,23 @@ int __init atalk_proc_init(void)
257 if (!atalk_proc_dir) 221 if (!atalk_proc_dir)
258 goto out; 222 goto out;
259 223
260 p = proc_create("interface", 0444, atalk_proc_dir, 224 p = proc_create_seq("interface", 0444, atalk_proc_dir,
261 &atalk_seq_interface_fops); 225 &atalk_seq_interface_ops);
262 if (!p) 226 if (!p)
263 goto out_interface; 227 goto out_interface;
264 228
265 p = proc_create("route", 0444, atalk_proc_dir, 229 p = proc_create_seq("route", 0444, atalk_proc_dir,
266 &atalk_seq_route_fops); 230 &atalk_seq_route_ops);
267 if (!p) 231 if (!p)
268 goto out_route; 232 goto out_route;
269 233
270 p = proc_create("socket", 0444, atalk_proc_dir, 234 p = proc_create_seq("socket", 0444, atalk_proc_dir,
271 &atalk_seq_socket_fops); 235 &atalk_seq_socket_ops);
272 if (!p) 236 if (!p)
273 goto out_socket; 237 goto out_socket;
274 238
275 p = proc_create("arp", 0444, atalk_proc_dir, &atalk_seq_arp_fops); 239 p = proc_create_seq_private("arp", 0444, atalk_proc_dir, &aarp_seq_ops,
240 sizeof(struct aarp_iter_state), NULL);
276 if (!p) 241 if (!p)
277 goto out_arp; 242 goto out_arp;
278 243
diff --git a/net/atm/br2684.c b/net/atm/br2684.c
index fd94bea36ee8..36b3adacc0dd 100644
--- a/net/atm/br2684.c
+++ b/net/atm/br2684.c
@@ -818,18 +818,6 @@ static const struct seq_operations br2684_seq_ops = {
818 .show = br2684_seq_show, 818 .show = br2684_seq_show,
819}; 819};
820 820
821static int br2684_proc_open(struct inode *inode, struct file *file)
822{
823 return seq_open(file, &br2684_seq_ops);
824}
825
826static const struct file_operations br2684_proc_ops = {
827 .open = br2684_proc_open,
828 .read = seq_read,
829 .llseek = seq_lseek,
830 .release = seq_release,
831};
832
833extern struct proc_dir_entry *atm_proc_root; /* from proc.c */ 821extern struct proc_dir_entry *atm_proc_root; /* from proc.c */
834#endif /* CONFIG_PROC_FS */ 822#endif /* CONFIG_PROC_FS */
835 823
@@ -837,7 +825,7 @@ static int __init br2684_init(void)
837{ 825{
838#ifdef CONFIG_PROC_FS 826#ifdef CONFIG_PROC_FS
839 struct proc_dir_entry *p; 827 struct proc_dir_entry *p;
840 p = proc_create("br2684", 0, atm_proc_root, &br2684_proc_ops); 828 p = proc_create_seq("br2684", 0, atm_proc_root, &br2684_seq_ops);
841 if (p == NULL) 829 if (p == NULL)
842 return -ENOMEM; 830 return -ENOMEM;
843#endif 831#endif
diff --git a/net/atm/clip.c b/net/atm/clip.c
index f07dbc632222..66caa48a27c2 100644
--- a/net/atm/clip.c
+++ b/net/atm/clip.c
@@ -863,20 +863,6 @@ static const struct seq_operations arp_seq_ops = {
863 .stop = neigh_seq_stop, 863 .stop = neigh_seq_stop,
864 .show = clip_seq_show, 864 .show = clip_seq_show,
865}; 865};
866
867static int arp_seq_open(struct inode *inode, struct file *file)
868{
869 return seq_open_net(inode, file, &arp_seq_ops,
870 sizeof(struct clip_seq_state));
871}
872
873static const struct file_operations arp_seq_fops = {
874 .open = arp_seq_open,
875 .read = seq_read,
876 .llseek = seq_lseek,
877 .release = seq_release_net,
878 .owner = THIS_MODULE
879};
880#endif 866#endif
881 867
882static void atm_clip_exit_noproc(void); 868static void atm_clip_exit_noproc(void);
@@ -893,7 +879,8 @@ static int __init atm_clip_init(void)
893 { 879 {
894 struct proc_dir_entry *p; 880 struct proc_dir_entry *p;
895 881
896 p = proc_create("arp", 0444, atm_proc_root, &arp_seq_fops); 882 p = proc_create_net("arp", 0444, atm_proc_root, &arp_seq_ops,
883 sizeof(struct clip_seq_state));
897 if (!p) { 884 if (!p) {
898 pr_err("Unable to initialize /proc/net/atm/arp\n"); 885 pr_err("Unable to initialize /proc/net/atm/arp\n");
899 atm_clip_exit_noproc(); 886 atm_clip_exit_noproc();
diff --git a/net/atm/lec.c b/net/atm/lec.c
index 3138a869b5c0..5a95fcf6f9b6 100644
--- a/net/atm/lec.c
+++ b/net/atm/lec.c
@@ -990,18 +990,6 @@ static const struct seq_operations lec_seq_ops = {
990 .stop = lec_seq_stop, 990 .stop = lec_seq_stop,
991 .show = lec_seq_show, 991 .show = lec_seq_show,
992}; 992};
993
994static int lec_seq_open(struct inode *inode, struct file *file)
995{
996 return seq_open_private(file, &lec_seq_ops, sizeof(struct lec_state));
997}
998
999static const struct file_operations lec_seq_fops = {
1000 .open = lec_seq_open,
1001 .read = seq_read,
1002 .llseek = seq_lseek,
1003 .release = seq_release_private,
1004};
1005#endif 993#endif
1006 994
1007static int lane_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) 995static int lane_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
@@ -1047,7 +1035,8 @@ static int __init lane_module_init(void)
1047#ifdef CONFIG_PROC_FS 1035#ifdef CONFIG_PROC_FS
1048 struct proc_dir_entry *p; 1036 struct proc_dir_entry *p;
1049 1037
1050 p = proc_create("lec", 0444, atm_proc_root, &lec_seq_fops); 1038 p = proc_create_seq_private("lec", 0444, atm_proc_root, &lec_seq_ops,
1039 sizeof(struct lec_state), NULL);
1051 if (!p) { 1040 if (!p) {
1052 pr_err("Unable to initialize /proc/net/atm/lec\n"); 1041 pr_err("Unable to initialize /proc/net/atm/lec\n");
1053 return -ENOMEM; 1042 return -ENOMEM;
diff --git a/net/atm/proc.c b/net/atm/proc.c
index 55410c00c7e2..0b0495a41bbe 100644
--- a/net/atm/proc.c
+++ b/net/atm/proc.c
@@ -68,7 +68,6 @@ static void atm_dev_info(struct seq_file *seq, const struct atm_dev *dev)
68struct vcc_state { 68struct vcc_state {
69 int bucket; 69 int bucket;
70 struct sock *sk; 70 struct sock *sk;
71 int family;
72}; 71};
73 72
74static inline int compare_family(struct sock *sk, int family) 73static inline int compare_family(struct sock *sk, int family)
@@ -106,23 +105,13 @@ out:
106 return (l < 0); 105 return (l < 0);
107} 106}
108 107
109static inline void *vcc_walk(struct vcc_state *state, loff_t l) 108static inline void *vcc_walk(struct seq_file *seq, loff_t l)
110{ 109{
111 return __vcc_walk(&state->sk, state->family, &state->bucket, l) ? 110 struct vcc_state *state = seq->private;
112 state : NULL; 111 int family = (uintptr_t)(PDE_DATA(file_inode(seq->file)));
113}
114
115static int __vcc_seq_open(struct inode *inode, struct file *file,
116 int family, const struct seq_operations *ops)
117{
118 struct vcc_state *state;
119
120 state = __seq_open_private(file, ops, sizeof(*state));
121 if (state == NULL)
122 return -ENOMEM;
123 112
124 state->family = family; 113 return __vcc_walk(&state->sk, family, &state->bucket, l) ?
125 return 0; 114 state : NULL;
126} 115}
127 116
128static void *vcc_seq_start(struct seq_file *seq, loff_t *pos) 117static void *vcc_seq_start(struct seq_file *seq, loff_t *pos)
@@ -133,7 +122,7 @@ static void *vcc_seq_start(struct seq_file *seq, loff_t *pos)
133 122
134 read_lock(&vcc_sklist_lock); 123 read_lock(&vcc_sklist_lock);
135 state->sk = SEQ_START_TOKEN; 124 state->sk = SEQ_START_TOKEN;
136 return left ? vcc_walk(state, left) : SEQ_START_TOKEN; 125 return left ? vcc_walk(seq, left) : SEQ_START_TOKEN;
137} 126}
138 127
139static void vcc_seq_stop(struct seq_file *seq, void *v) 128static void vcc_seq_stop(struct seq_file *seq, void *v)
@@ -144,9 +133,7 @@ static void vcc_seq_stop(struct seq_file *seq, void *v)
144 133
145static void *vcc_seq_next(struct seq_file *seq, void *v, loff_t *pos) 134static void *vcc_seq_next(struct seq_file *seq, void *v, loff_t *pos)
146{ 135{
147 struct vcc_state *state = seq->private; 136 v = vcc_walk(seq, 1);
148
149 v = vcc_walk(state, 1);
150 *pos += !!PTR_ERR(v); 137 *pos += !!PTR_ERR(v);
151 return v; 138 return v;
152} 139}
@@ -257,18 +244,6 @@ static const struct seq_operations atm_dev_seq_ops = {
257 .show = atm_dev_seq_show, 244 .show = atm_dev_seq_show,
258}; 245};
259 246
260static int atm_dev_seq_open(struct inode *inode, struct file *file)
261{
262 return seq_open(file, &atm_dev_seq_ops);
263}
264
265static const struct file_operations devices_seq_fops = {
266 .open = atm_dev_seq_open,
267 .read = seq_read,
268 .llseek = seq_lseek,
269 .release = seq_release,
270};
271
272static int pvc_seq_show(struct seq_file *seq, void *v) 247static int pvc_seq_show(struct seq_file *seq, void *v)
273{ 248{
274 static char atm_pvc_banner[] = 249 static char atm_pvc_banner[] =
@@ -292,18 +267,6 @@ static const struct seq_operations pvc_seq_ops = {
292 .show = pvc_seq_show, 267 .show = pvc_seq_show,
293}; 268};
294 269
295static int pvc_seq_open(struct inode *inode, struct file *file)
296{
297 return __vcc_seq_open(inode, file, PF_ATMPVC, &pvc_seq_ops);
298}
299
300static const struct file_operations pvc_seq_fops = {
301 .open = pvc_seq_open,
302 .read = seq_read,
303 .llseek = seq_lseek,
304 .release = seq_release_private,
305};
306
307static int vcc_seq_show(struct seq_file *seq, void *v) 270static int vcc_seq_show(struct seq_file *seq, void *v)
308{ 271{
309 if (v == SEQ_START_TOKEN) { 272 if (v == SEQ_START_TOKEN) {
@@ -326,18 +289,6 @@ static const struct seq_operations vcc_seq_ops = {
326 .show = vcc_seq_show, 289 .show = vcc_seq_show,
327}; 290};
328 291
329static int vcc_seq_open(struct inode *inode, struct file *file)
330{
331 return __vcc_seq_open(inode, file, 0, &vcc_seq_ops);
332}
333
334static const struct file_operations vcc_seq_fops = {
335 .open = vcc_seq_open,
336 .read = seq_read,
337 .llseek = seq_lseek,
338 .release = seq_release_private,
339};
340
341static int svc_seq_show(struct seq_file *seq, void *v) 292static int svc_seq_show(struct seq_file *seq, void *v)
342{ 293{
343 static const char atm_svc_banner[] = 294 static const char atm_svc_banner[] =
@@ -361,18 +312,6 @@ static const struct seq_operations svc_seq_ops = {
361 .show = svc_seq_show, 312 .show = svc_seq_show,
362}; 313};
363 314
364static int svc_seq_open(struct inode *inode, struct file *file)
365{
366 return __vcc_seq_open(inode, file, PF_ATMSVC, &svc_seq_ops);
367}
368
369static const struct file_operations svc_seq_fops = {
370 .open = svc_seq_open,
371 .read = seq_read,
372 .llseek = seq_lseek,
373 .release = seq_release_private,
374};
375
376static ssize_t proc_dev_atm_read(struct file *file, char __user *buf, 315static ssize_t proc_dev_atm_read(struct file *file, char __user *buf,
377 size_t count, loff_t *pos) 316 size_t count, loff_t *pos)
378{ 317{
@@ -440,58 +379,22 @@ void atm_proc_dev_deregister(struct atm_dev *dev)
440 kfree(dev->proc_name); 379 kfree(dev->proc_name);
441} 380}
442 381
443static struct atm_proc_entry {
444 char *name;
445 const struct file_operations *proc_fops;
446 struct proc_dir_entry *dirent;
447} atm_proc_ents[] = {
448 { .name = "devices", .proc_fops = &devices_seq_fops },
449 { .name = "pvc", .proc_fops = &pvc_seq_fops },
450 { .name = "svc", .proc_fops = &svc_seq_fops },
451 { .name = "vc", .proc_fops = &vcc_seq_fops },
452 { .name = NULL, .proc_fops = NULL }
453};
454
455static void atm_proc_dirs_remove(void)
456{
457 static struct atm_proc_entry *e;
458
459 for (e = atm_proc_ents; e->name; e++) {
460 if (e->dirent)
461 remove_proc_entry(e->name, atm_proc_root);
462 }
463 remove_proc_entry("atm", init_net.proc_net);
464}
465
466int __init atm_proc_init(void) 382int __init atm_proc_init(void)
467{ 383{
468 static struct atm_proc_entry *e;
469 int ret;
470
471 atm_proc_root = proc_net_mkdir(&init_net, "atm", init_net.proc_net); 384 atm_proc_root = proc_net_mkdir(&init_net, "atm", init_net.proc_net);
472 if (!atm_proc_root) 385 if (!atm_proc_root)
473 goto err_out; 386 return -ENOMEM;
474 for (e = atm_proc_ents; e->name; e++) { 387 proc_create_seq("devices", 0444, atm_proc_root, &atm_dev_seq_ops);
475 struct proc_dir_entry *dirent; 388 proc_create_seq_private("pvc", 0444, atm_proc_root, &pvc_seq_ops,
476 389 sizeof(struct vcc_state), (void *)(uintptr_t)PF_ATMPVC);
477 dirent = proc_create(e->name, 0444, 390 proc_create_seq_private("svc", 0444, atm_proc_root, &svc_seq_ops,
478 atm_proc_root, e->proc_fops); 391 sizeof(struct vcc_state), (void *)(uintptr_t)PF_ATMSVC);
479 if (!dirent) 392 proc_create_seq_private("vc", 0444, atm_proc_root, &vcc_seq_ops,
480 goto err_out_remove; 393 sizeof(struct vcc_state), NULL);
481 e->dirent = dirent; 394 return 0;
482 }
483 ret = 0;
484out:
485 return ret;
486
487err_out_remove:
488 atm_proc_dirs_remove();
489err_out:
490 ret = -ENOMEM;
491 goto out;
492} 395}
493 396
494void atm_proc_exit(void) 397void atm_proc_exit(void)
495{ 398{
496 atm_proc_dirs_remove(); 399 remove_proc_subtree("atm", init_net.proc_net);
497} 400}
diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c
index 2b41366fcad2..c603d33d5410 100644
--- a/net/ax25/af_ax25.c
+++ b/net/ax25/af_ax25.c
@@ -1924,19 +1924,6 @@ static const struct seq_operations ax25_info_seqops = {
1924 .stop = ax25_info_stop, 1924 .stop = ax25_info_stop,
1925 .show = ax25_info_show, 1925 .show = ax25_info_show,
1926}; 1926};
1927
1928static int ax25_info_open(struct inode *inode, struct file *file)
1929{
1930 return seq_open(file, &ax25_info_seqops);
1931}
1932
1933static const struct file_operations ax25_info_fops = {
1934 .open = ax25_info_open,
1935 .read = seq_read,
1936 .llseek = seq_lseek,
1937 .release = seq_release,
1938};
1939
1940#endif 1927#endif
1941 1928
1942static const struct net_proto_family ax25_family_ops = { 1929static const struct net_proto_family ax25_family_ops = {
@@ -1989,10 +1976,10 @@ static int __init ax25_init(void)
1989 dev_add_pack(&ax25_packet_type); 1976 dev_add_pack(&ax25_packet_type);
1990 register_netdevice_notifier(&ax25_dev_notifier); 1977 register_netdevice_notifier(&ax25_dev_notifier);
1991 1978
1992 proc_create("ax25_route", 0444, init_net.proc_net, 1979 proc_create_seq("ax25_route", 0444, init_net.proc_net, &ax25_rt_seqops);
1993 &ax25_route_fops); 1980 proc_create_seq("ax25", 0444, init_net.proc_net, &ax25_info_seqops);
1994 proc_create("ax25", 0444, init_net.proc_net, &ax25_info_fops); 1981 proc_create_seq("ax25_calls", 0444, init_net.proc_net,
1995 proc_create("ax25_calls", 0444, init_net.proc_net, &ax25_uid_fops); 1982 &ax25_uid_seqops);
1996out: 1983out:
1997 return rc; 1984 return rc;
1998} 1985}
diff --git a/net/ax25/ax25_route.c b/net/ax25/ax25_route.c
index 525558972fd9..a0eff323af12 100644
--- a/net/ax25/ax25_route.c
+++ b/net/ax25/ax25_route.c
@@ -323,25 +323,12 @@ static int ax25_rt_seq_show(struct seq_file *seq, void *v)
323 return 0; 323 return 0;
324} 324}
325 325
326static const struct seq_operations ax25_rt_seqops = { 326const struct seq_operations ax25_rt_seqops = {
327 .start = ax25_rt_seq_start, 327 .start = ax25_rt_seq_start,
328 .next = ax25_rt_seq_next, 328 .next = ax25_rt_seq_next,
329 .stop = ax25_rt_seq_stop, 329 .stop = ax25_rt_seq_stop,
330 .show = ax25_rt_seq_show, 330 .show = ax25_rt_seq_show,
331}; 331};
332
333static int ax25_rt_info_open(struct inode *inode, struct file *file)
334{
335 return seq_open(file, &ax25_rt_seqops);
336}
337
338const struct file_operations ax25_route_fops = {
339 .open = ax25_rt_info_open,
340 .read = seq_read,
341 .llseek = seq_lseek,
342 .release = seq_release,
343};
344
345#endif 332#endif
346 333
347/* 334/*
diff --git a/net/ax25/ax25_uid.c b/net/ax25/ax25_uid.c
index 4ebe91ba317a..99d02e390e43 100644
--- a/net/ax25/ax25_uid.c
+++ b/net/ax25/ax25_uid.c
@@ -181,25 +181,12 @@ static int ax25_uid_seq_show(struct seq_file *seq, void *v)
181 return 0; 181 return 0;
182} 182}
183 183
184static const struct seq_operations ax25_uid_seqops = { 184const struct seq_operations ax25_uid_seqops = {
185 .start = ax25_uid_seq_start, 185 .start = ax25_uid_seq_start,
186 .next = ax25_uid_seq_next, 186 .next = ax25_uid_seq_next,
187 .stop = ax25_uid_seq_stop, 187 .stop = ax25_uid_seq_stop,
188 .show = ax25_uid_seq_show, 188 .show = ax25_uid_seq_show,
189}; 189};
190
191static int ax25_uid_info_open(struct inode *inode, struct file *file)
192{
193 return seq_open(file, &ax25_uid_seqops);
194}
195
196const struct file_operations ax25_uid_fops = {
197 .open = ax25_uid_info_open,
198 .read = seq_read,
199 .llseek = seq_lseek,
200 .release = seq_release,
201};
202
203#endif 190#endif
204 191
205/* 192/*
diff --git a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c
index 84d92a077834..3264e1873219 100644
--- a/net/bluetooth/af_bluetooth.c
+++ b/net/bluetooth/af_bluetooth.c
@@ -605,15 +605,10 @@ int bt_sock_wait_ready(struct sock *sk, unsigned long flags)
605EXPORT_SYMBOL(bt_sock_wait_ready); 605EXPORT_SYMBOL(bt_sock_wait_ready);
606 606
607#ifdef CONFIG_PROC_FS 607#ifdef CONFIG_PROC_FS
608struct bt_seq_state {
609 struct bt_sock_list *l;
610};
611
612static void *bt_seq_start(struct seq_file *seq, loff_t *pos) 608static void *bt_seq_start(struct seq_file *seq, loff_t *pos)
613 __acquires(seq->private->l->lock) 609 __acquires(seq->private->l->lock)
614{ 610{
615 struct bt_seq_state *s = seq->private; 611 struct bt_sock_list *l = PDE_DATA(file_inode(seq->file));
616 struct bt_sock_list *l = s->l;
617 612
618 read_lock(&l->lock); 613 read_lock(&l->lock);
619 return seq_hlist_start_head(&l->head, *pos); 614 return seq_hlist_start_head(&l->head, *pos);
@@ -621,8 +616,7 @@ static void *bt_seq_start(struct seq_file *seq, loff_t *pos)
621 616
622static void *bt_seq_next(struct seq_file *seq, void *v, loff_t *pos) 617static void *bt_seq_next(struct seq_file *seq, void *v, loff_t *pos)
623{ 618{
624 struct bt_seq_state *s = seq->private; 619 struct bt_sock_list *l = PDE_DATA(file_inode(seq->file));
625 struct bt_sock_list *l = s->l;
626 620
627 return seq_hlist_next(v, &l->head, pos); 621 return seq_hlist_next(v, &l->head, pos);
628} 622}
@@ -630,16 +624,14 @@ static void *bt_seq_next(struct seq_file *seq, void *v, loff_t *pos)
630static void bt_seq_stop(struct seq_file *seq, void *v) 624static void bt_seq_stop(struct seq_file *seq, void *v)
631 __releases(seq->private->l->lock) 625 __releases(seq->private->l->lock)
632{ 626{
633 struct bt_seq_state *s = seq->private; 627 struct bt_sock_list *l = PDE_DATA(file_inode(seq->file));
634 struct bt_sock_list *l = s->l;
635 628
636 read_unlock(&l->lock); 629 read_unlock(&l->lock);
637} 630}
638 631
639static int bt_seq_show(struct seq_file *seq, void *v) 632static int bt_seq_show(struct seq_file *seq, void *v)
640{ 633{
641 struct bt_seq_state *s = seq->private; 634 struct bt_sock_list *l = PDE_DATA(file_inode(seq->file));
642 struct bt_sock_list *l = s->l;
643 635
644 if (v == SEQ_START_TOKEN) { 636 if (v == SEQ_START_TOKEN) {
645 seq_puts(seq ,"sk RefCnt Rmem Wmem User Inode Parent"); 637 seq_puts(seq ,"sk RefCnt Rmem Wmem User Inode Parent");
@@ -681,35 +673,13 @@ static const struct seq_operations bt_seq_ops = {
681 .show = bt_seq_show, 673 .show = bt_seq_show,
682}; 674};
683 675
684static int bt_seq_open(struct inode *inode, struct file *file)
685{
686 struct bt_sock_list *sk_list;
687 struct bt_seq_state *s;
688
689 sk_list = PDE_DATA(inode);
690 s = __seq_open_private(file, &bt_seq_ops,
691 sizeof(struct bt_seq_state));
692 if (!s)
693 return -ENOMEM;
694
695 s->l = sk_list;
696 return 0;
697}
698
699static const struct file_operations bt_fops = {
700 .open = bt_seq_open,
701 .read = seq_read,
702 .llseek = seq_lseek,
703 .release = seq_release_private
704};
705
706int bt_procfs_init(struct net *net, const char *name, 676int bt_procfs_init(struct net *net, const char *name,
707 struct bt_sock_list *sk_list, 677 struct bt_sock_list *sk_list,
708 int (* seq_show)(struct seq_file *, void *)) 678 int (* seq_show)(struct seq_file *, void *))
709{ 679{
710 sk_list->custom_seq_show = seq_show; 680 sk_list->custom_seq_show = seq_show;
711 681
712 if (!proc_create_data(name, 0, net->proc_net, &bt_fops, sk_list)) 682 if (!proc_create_seq_data(name, 0, net->proc_net, &bt_seq_ops, sk_list))
713 return -ENOMEM; 683 return -ENOMEM;
714 return 0; 684 return 0;
715} 685}
diff --git a/net/bluetooth/cmtp/capi.c b/net/bluetooth/cmtp/capi.c
index 426a92f02db4..eb41556002e3 100644
--- a/net/bluetooth/cmtp/capi.c
+++ b/net/bluetooth/cmtp/capi.c
@@ -521,18 +521,6 @@ static int cmtp_proc_show(struct seq_file *m, void *v)
521 return 0; 521 return 0;
522} 522}
523 523
524static int cmtp_proc_open(struct inode *inode, struct file *file)
525{
526 return single_open(file, cmtp_proc_show, PDE_DATA(inode));
527}
528
529static const struct file_operations cmtp_proc_fops = {
530 .open = cmtp_proc_open,
531 .read = seq_read,
532 .llseek = seq_lseek,
533 .release = single_release,
534};
535
536int cmtp_attach_device(struct cmtp_session *session) 524int cmtp_attach_device(struct cmtp_session *session)
537{ 525{
538 unsigned char buf[4]; 526 unsigned char buf[4];
@@ -571,7 +559,7 @@ int cmtp_attach_device(struct cmtp_session *session)
571 session->ctrl.send_message = cmtp_send_message; 559 session->ctrl.send_message = cmtp_send_message;
572 560
573 session->ctrl.procinfo = cmtp_procinfo; 561 session->ctrl.procinfo = cmtp_procinfo;
574 session->ctrl.proc_fops = &cmtp_proc_fops; 562 session->ctrl.proc_show = cmtp_proc_show;
575 563
576 if (attach_capi_ctr(&session->ctrl) < 0) { 564 if (attach_capi_ctr(&session->ctrl) < 0) {
577 BT_ERR("Can't attach new controller"); 565 BT_ERR("Can't attach new controller");
diff --git a/net/can/bcm.c b/net/can/bcm.c
index ac5e5e34fee3..6ad89f49b341 100644
--- a/net/can/bcm.c
+++ b/net/can/bcm.c
@@ -239,18 +239,6 @@ static int bcm_proc_show(struct seq_file *m, void *v)
239 seq_putc(m, '\n'); 239 seq_putc(m, '\n');
240 return 0; 240 return 0;
241} 241}
242
243static int bcm_proc_open(struct inode *inode, struct file *file)
244{
245 return single_open_net(inode, file, bcm_proc_show);
246}
247
248static const struct file_operations bcm_proc_fops = {
249 .open = bcm_proc_open,
250 .read = seq_read,
251 .llseek = seq_lseek,
252 .release = single_release,
253};
254#endif /* CONFIG_PROC_FS */ 242#endif /* CONFIG_PROC_FS */
255 243
256/* 244/*
@@ -1606,9 +1594,9 @@ static int bcm_connect(struct socket *sock, struct sockaddr *uaddr, int len,
1606 if (net->can.bcmproc_dir) { 1594 if (net->can.bcmproc_dir) {
1607 /* unique socket address as filename */ 1595 /* unique socket address as filename */
1608 sprintf(bo->procname, "%lu", sock_i_ino(sk)); 1596 sprintf(bo->procname, "%lu", sock_i_ino(sk));
1609 bo->bcm_proc_read = proc_create_data(bo->procname, 0644, 1597 bo->bcm_proc_read = proc_create_net_single(bo->procname, 0644,
1610 net->can.bcmproc_dir, 1598 net->can.bcmproc_dir,
1611 &bcm_proc_fops, sk); 1599 bcm_proc_show, sk);
1612 if (!bo->bcm_proc_read) { 1600 if (!bo->bcm_proc_read) {
1613 ret = -ENOMEM; 1601 ret = -ENOMEM;
1614 goto fail; 1602 goto fail;
diff --git a/net/can/proc.c b/net/can/proc.c
index fdf704e9bb8c..70fea17bb04c 100644
--- a/net/can/proc.c
+++ b/net/can/proc.c
@@ -270,18 +270,6 @@ static int can_stats_proc_show(struct seq_file *m, void *v)
270 return 0; 270 return 0;
271} 271}
272 272
273static int can_stats_proc_open(struct inode *inode, struct file *file)
274{
275 return single_open_net(inode, file, can_stats_proc_show);
276}
277
278static const struct file_operations can_stats_proc_fops = {
279 .open = can_stats_proc_open,
280 .read = seq_read,
281 .llseek = seq_lseek,
282 .release = single_release,
283};
284
285static int can_reset_stats_proc_show(struct seq_file *m, void *v) 273static int can_reset_stats_proc_show(struct seq_file *m, void *v)
286{ 274{
287 struct net *net = m->private; 275 struct net *net = m->private;
@@ -303,36 +291,12 @@ static int can_reset_stats_proc_show(struct seq_file *m, void *v)
303 return 0; 291 return 0;
304} 292}
305 293
306static int can_reset_stats_proc_open(struct inode *inode, struct file *file)
307{
308 return single_open_net(inode, file, can_reset_stats_proc_show);
309}
310
311static const struct file_operations can_reset_stats_proc_fops = {
312 .open = can_reset_stats_proc_open,
313 .read = seq_read,
314 .llseek = seq_lseek,
315 .release = single_release,
316};
317
318static int can_version_proc_show(struct seq_file *m, void *v) 294static int can_version_proc_show(struct seq_file *m, void *v)
319{ 295{
320 seq_printf(m, "%s\n", CAN_VERSION_STRING); 296 seq_printf(m, "%s\n", CAN_VERSION_STRING);
321 return 0; 297 return 0;
322} 298}
323 299
324static int can_version_proc_open(struct inode *inode, struct file *file)
325{
326 return single_open_net(inode, file, can_version_proc_show);
327}
328
329static const struct file_operations can_version_proc_fops = {
330 .open = can_version_proc_open,
331 .read = seq_read,
332 .llseek = seq_lseek,
333 .release = single_release,
334};
335
336static inline void can_rcvlist_proc_show_one(struct seq_file *m, int idx, 300static inline void can_rcvlist_proc_show_one(struct seq_file *m, int idx,
337 struct net_device *dev, 301 struct net_device *dev,
338 struct can_dev_rcv_lists *d) 302 struct can_dev_rcv_lists *d)
@@ -373,18 +337,6 @@ static int can_rcvlist_proc_show(struct seq_file *m, void *v)
373 return 0; 337 return 0;
374} 338}
375 339
376static int can_rcvlist_proc_open(struct inode *inode, struct file *file)
377{
378 return single_open_net(inode, file, can_rcvlist_proc_show);
379}
380
381static const struct file_operations can_rcvlist_proc_fops = {
382 .open = can_rcvlist_proc_open,
383 .read = seq_read,
384 .llseek = seq_lseek,
385 .release = single_release,
386};
387
388static inline void can_rcvlist_proc_show_array(struct seq_file *m, 340static inline void can_rcvlist_proc_show_array(struct seq_file *m,
389 struct net_device *dev, 341 struct net_device *dev,
390 struct hlist_head *rcv_array, 342 struct hlist_head *rcv_array,
@@ -440,19 +392,6 @@ static int can_rcvlist_sff_proc_show(struct seq_file *m, void *v)
440 return 0; 392 return 0;
441} 393}
442 394
443static int can_rcvlist_sff_proc_open(struct inode *inode, struct file *file)
444{
445 return single_open_net(inode, file, can_rcvlist_sff_proc_show);
446}
447
448static const struct file_operations can_rcvlist_sff_proc_fops = {
449 .open = can_rcvlist_sff_proc_open,
450 .read = seq_read,
451 .llseek = seq_lseek,
452 .release = single_release,
453};
454
455
456static int can_rcvlist_eff_proc_show(struct seq_file *m, void *v) 395static int can_rcvlist_eff_proc_show(struct seq_file *m, void *v)
457{ 396{
458 struct net_device *dev; 397 struct net_device *dev;
@@ -483,18 +422,6 @@ static int can_rcvlist_eff_proc_show(struct seq_file *m, void *v)
483 return 0; 422 return 0;
484} 423}
485 424
486static int can_rcvlist_eff_proc_open(struct inode *inode, struct file *file)
487{
488 return single_open_net(inode, file, can_rcvlist_eff_proc_show);
489}
490
491static const struct file_operations can_rcvlist_eff_proc_fops = {
492 .open = can_rcvlist_eff_proc_open,
493 .read = seq_read,
494 .llseek = seq_lseek,
495 .release = single_release,
496};
497
498/* 425/*
499 * can_init_proc - create main CAN proc directory and procfs entries 426 * can_init_proc - create main CAN proc directory and procfs entries
500 */ 427 */
@@ -510,37 +437,29 @@ void can_init_proc(struct net *net)
510 } 437 }
511 438
512 /* own procfs entries from the AF_CAN core */ 439 /* own procfs entries from the AF_CAN core */
513 net->can.pde_version = proc_create(CAN_PROC_VERSION, 0644, 440 net->can.pde_version = proc_create_net_single(CAN_PROC_VERSION, 0644,
514 net->can.proc_dir, 441 net->can.proc_dir, can_version_proc_show, NULL);
515 &can_version_proc_fops); 442 net->can.pde_stats = proc_create_net_single(CAN_PROC_STATS, 0644,
516 net->can.pde_stats = proc_create(CAN_PROC_STATS, 0644, 443 net->can.proc_dir, can_stats_proc_show, NULL);
517 net->can.proc_dir, 444 net->can.pde_reset_stats = proc_create_net_single(CAN_PROC_RESET_STATS,
518 &can_stats_proc_fops); 445 0644, net->can.proc_dir, can_reset_stats_proc_show,
519 net->can.pde_reset_stats = proc_create(CAN_PROC_RESET_STATS, 0644, 446 NULL);
520 net->can.proc_dir, 447 net->can.pde_rcvlist_err = proc_create_net_single(CAN_PROC_RCVLIST_ERR,
521 &can_reset_stats_proc_fops); 448 0644, net->can.proc_dir, can_rcvlist_proc_show,
522 net->can.pde_rcvlist_err = proc_create_data(CAN_PROC_RCVLIST_ERR, 0644, 449 (void *)RX_ERR);
523 net->can.proc_dir, 450 net->can.pde_rcvlist_all = proc_create_net_single(CAN_PROC_RCVLIST_ALL,
524 &can_rcvlist_proc_fops, 451 0644, net->can.proc_dir, can_rcvlist_proc_show,
525 (void *)RX_ERR); 452 (void *)RX_ALL);
526 net->can.pde_rcvlist_all = proc_create_data(CAN_PROC_RCVLIST_ALL, 0644, 453 net->can.pde_rcvlist_fil = proc_create_net_single(CAN_PROC_RCVLIST_FIL,
527 net->can.proc_dir, 454 0644, net->can.proc_dir, can_rcvlist_proc_show,
528 &can_rcvlist_proc_fops, 455 (void *)RX_FIL);
529 (void *)RX_ALL); 456 net->can.pde_rcvlist_inv = proc_create_net_single(CAN_PROC_RCVLIST_INV,
530 net->can.pde_rcvlist_fil = proc_create_data(CAN_PROC_RCVLIST_FIL, 0644, 457 0644, net->can.proc_dir, can_rcvlist_proc_show,
531 net->can.proc_dir, 458 (void *)RX_INV);
532 &can_rcvlist_proc_fops, 459 net->can.pde_rcvlist_eff = proc_create_net_single(CAN_PROC_RCVLIST_EFF,
533 (void *)RX_FIL); 460 0644, net->can.proc_dir, can_rcvlist_eff_proc_show, NULL);
534 net->can.pde_rcvlist_inv = proc_create_data(CAN_PROC_RCVLIST_INV, 0644, 461 net->can.pde_rcvlist_sff = proc_create_net_single(CAN_PROC_RCVLIST_SFF,
535 net->can.proc_dir, 462 0644, net->can.proc_dir, can_rcvlist_sff_proc_show, NULL);
536 &can_rcvlist_proc_fops,
537 (void *)RX_INV);
538 net->can.pde_rcvlist_eff = proc_create(CAN_PROC_RCVLIST_EFF, 0644,
539 net->can.proc_dir,
540 &can_rcvlist_eff_proc_fops);
541 net->can.pde_rcvlist_sff = proc_create(CAN_PROC_RCVLIST_SFF, 0644,
542 net->can.proc_dir,
543 &can_rcvlist_sff_proc_fops);
544} 463}
545 464
546/* 465/*
diff --git a/net/core/neighbour.c b/net/core/neighbour.c
index ce519861be59..1fb43bff417d 100644
--- a/net/core/neighbour.c
+++ b/net/core/neighbour.c
@@ -59,7 +59,7 @@ static int pneigh_ifdown_and_unlock(struct neigh_table *tbl,
59 struct net_device *dev); 59 struct net_device *dev);
60 60
61#ifdef CONFIG_PROC_FS 61#ifdef CONFIG_PROC_FS
62static const struct file_operations neigh_stat_seq_fops; 62static const struct seq_operations neigh_stat_seq_ops;
63#endif 63#endif
64 64
65/* 65/*
@@ -1558,8 +1558,8 @@ void neigh_table_init(int index, struct neigh_table *tbl)
1558 panic("cannot create neighbour cache statistics"); 1558 panic("cannot create neighbour cache statistics");
1559 1559
1560#ifdef CONFIG_PROC_FS 1560#ifdef CONFIG_PROC_FS
1561 if (!proc_create_data(tbl->id, 0, init_net.proc_net_stat, 1561 if (!proc_create_seq_data(tbl->id, 0, init_net.proc_net_stat,
1562 &neigh_stat_seq_fops, tbl)) 1562 &neigh_stat_seq_ops, tbl))
1563 panic("cannot create neighbour proc dir entry"); 1563 panic("cannot create neighbour proc dir entry");
1564#endif 1564#endif
1565 1565
@@ -2786,7 +2786,7 @@ EXPORT_SYMBOL(neigh_seq_stop);
2786 2786
2787static void *neigh_stat_seq_start(struct seq_file *seq, loff_t *pos) 2787static void *neigh_stat_seq_start(struct seq_file *seq, loff_t *pos)
2788{ 2788{
2789 struct neigh_table *tbl = seq->private; 2789 struct neigh_table *tbl = PDE_DATA(file_inode(seq->file));
2790 int cpu; 2790 int cpu;
2791 2791
2792 if (*pos == 0) 2792 if (*pos == 0)
@@ -2803,7 +2803,7 @@ static void *neigh_stat_seq_start(struct seq_file *seq, loff_t *pos)
2803 2803
2804static void *neigh_stat_seq_next(struct seq_file *seq, void *v, loff_t *pos) 2804static void *neigh_stat_seq_next(struct seq_file *seq, void *v, loff_t *pos)
2805{ 2805{
2806 struct neigh_table *tbl = seq->private; 2806 struct neigh_table *tbl = PDE_DATA(file_inode(seq->file));
2807 int cpu; 2807 int cpu;
2808 2808
2809 for (cpu = *pos; cpu < nr_cpu_ids; ++cpu) { 2809 for (cpu = *pos; cpu < nr_cpu_ids; ++cpu) {
@@ -2822,7 +2822,7 @@ static void neigh_stat_seq_stop(struct seq_file *seq, void *v)
2822 2822
2823static int neigh_stat_seq_show(struct seq_file *seq, void *v) 2823static int neigh_stat_seq_show(struct seq_file *seq, void *v)
2824{ 2824{
2825 struct neigh_table *tbl = seq->private; 2825 struct neigh_table *tbl = PDE_DATA(file_inode(seq->file));
2826 struct neigh_statistics *st = v; 2826 struct neigh_statistics *st = v;
2827 2827
2828 if (v == SEQ_START_TOKEN) { 2828 if (v == SEQ_START_TOKEN) {
@@ -2861,25 +2861,6 @@ static const struct seq_operations neigh_stat_seq_ops = {
2861 .stop = neigh_stat_seq_stop, 2861 .stop = neigh_stat_seq_stop,
2862 .show = neigh_stat_seq_show, 2862 .show = neigh_stat_seq_show,
2863}; 2863};
2864
2865static int neigh_stat_seq_open(struct inode *inode, struct file *file)
2866{
2867 int ret = seq_open(file, &neigh_stat_seq_ops);
2868
2869 if (!ret) {
2870 struct seq_file *sf = file->private_data;
2871 sf->private = PDE_DATA(inode);
2872 }
2873 return ret;
2874};
2875
2876static const struct file_operations neigh_stat_seq_fops = {
2877 .open = neigh_stat_seq_open,
2878 .read = seq_read,
2879 .llseek = seq_lseek,
2880 .release = seq_release,
2881};
2882
2883#endif /* CONFIG_PROC_FS */ 2864#endif /* CONFIG_PROC_FS */
2884 2865
2885static inline size_t neigh_nlmsg_size(void) 2866static inline size_t neigh_nlmsg_size(void)
diff --git a/net/core/net-procfs.c b/net/core/net-procfs.c
index 9737302907b1..63881f72ef71 100644
--- a/net/core/net-procfs.c
+++ b/net/core/net-procfs.c
@@ -175,19 +175,6 @@ static const struct seq_operations dev_seq_ops = {
175 .show = dev_seq_show, 175 .show = dev_seq_show,
176}; 176};
177 177
178static int dev_seq_open(struct inode *inode, struct file *file)
179{
180 return seq_open_net(inode, file, &dev_seq_ops,
181 sizeof(struct seq_net_private));
182}
183
184static const struct file_operations dev_seq_fops = {
185 .open = dev_seq_open,
186 .read = seq_read,
187 .llseek = seq_lseek,
188 .release = seq_release_net,
189};
190
191static const struct seq_operations softnet_seq_ops = { 178static const struct seq_operations softnet_seq_ops = {
192 .start = softnet_seq_start, 179 .start = softnet_seq_start,
193 .next = softnet_seq_next, 180 .next = softnet_seq_next,
@@ -195,18 +182,6 @@ static const struct seq_operations softnet_seq_ops = {
195 .show = softnet_seq_show, 182 .show = softnet_seq_show,
196}; 183};
197 184
198static int softnet_seq_open(struct inode *inode, struct file *file)
199{
200 return seq_open(file, &softnet_seq_ops);
201}
202
203static const struct file_operations softnet_seq_fops = {
204 .open = softnet_seq_open,
205 .read = seq_read,
206 .llseek = seq_lseek,
207 .release = seq_release,
208};
209
210static void *ptype_get_idx(loff_t pos) 185static void *ptype_get_idx(loff_t pos)
211{ 186{
212 struct packet_type *pt = NULL; 187 struct packet_type *pt = NULL;
@@ -297,30 +272,18 @@ static const struct seq_operations ptype_seq_ops = {
297 .show = ptype_seq_show, 272 .show = ptype_seq_show,
298}; 273};
299 274
300static int ptype_seq_open(struct inode *inode, struct file *file)
301{
302 return seq_open_net(inode, file, &ptype_seq_ops,
303 sizeof(struct seq_net_private));
304}
305
306static const struct file_operations ptype_seq_fops = {
307 .open = ptype_seq_open,
308 .read = seq_read,
309 .llseek = seq_lseek,
310 .release = seq_release_net,
311};
312
313
314static int __net_init dev_proc_net_init(struct net *net) 275static int __net_init dev_proc_net_init(struct net *net)
315{ 276{
316 int rc = -ENOMEM; 277 int rc = -ENOMEM;
317 278
318 if (!proc_create("dev", 0444, net->proc_net, &dev_seq_fops)) 279 if (!proc_create_net("dev", 0444, net->proc_net, &dev_seq_ops,
280 sizeof(struct seq_net_private)))
319 goto out; 281 goto out;
320 if (!proc_create("softnet_stat", 0444, net->proc_net, 282 if (!proc_create_seq("softnet_stat", 0444, net->proc_net,
321 &softnet_seq_fops)) 283 &softnet_seq_ops))
322 goto out_dev; 284 goto out_dev;
323 if (!proc_create("ptype", 0444, net->proc_net, &ptype_seq_fops)) 285 if (!proc_create_net("ptype", 0444, net->proc_net, &ptype_seq_ops,
286 sizeof(struct seq_net_private)))
324 goto out_softnet; 287 goto out_softnet;
325 288
326 if (wext_proc_init(net)) 289 if (wext_proc_init(net))
@@ -377,22 +340,10 @@ static const struct seq_operations dev_mc_seq_ops = {
377 .show = dev_mc_seq_show, 340 .show = dev_mc_seq_show,
378}; 341};
379 342
380static int dev_mc_seq_open(struct inode *inode, struct file *file)
381{
382 return seq_open_net(inode, file, &dev_mc_seq_ops,
383 sizeof(struct seq_net_private));
384}
385
386static const struct file_operations dev_mc_seq_fops = {
387 .open = dev_mc_seq_open,
388 .read = seq_read,
389 .llseek = seq_lseek,
390 .release = seq_release_net,
391};
392
393static int __net_init dev_mc_net_init(struct net *net) 343static int __net_init dev_mc_net_init(struct net *net)
394{ 344{
395 if (!proc_create("dev_mcast", 0, net->proc_net, &dev_mc_seq_fops)) 345 if (!proc_create_net("dev_mcast", 0, net->proc_net, &dev_mc_seq_ops,
346 sizeof(struct seq_net_private)))
396 return -ENOMEM; 347 return -ENOMEM;
397 return 0; 348 return 0;
398} 349}
diff --git a/net/core/sock.c b/net/core/sock.c
index 3b6d02854e57..815770333d91 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -3439,22 +3439,10 @@ static const struct seq_operations proto_seq_ops = {
3439 .show = proto_seq_show, 3439 .show = proto_seq_show,
3440}; 3440};
3441 3441
3442static int proto_seq_open(struct inode *inode, struct file *file)
3443{
3444 return seq_open_net(inode, file, &proto_seq_ops,
3445 sizeof(struct seq_net_private));
3446}
3447
3448static const struct file_operations proto_seq_fops = {
3449 .open = proto_seq_open,
3450 .read = seq_read,
3451 .llseek = seq_lseek,
3452 .release = seq_release_net,
3453};
3454
3455static __net_init int proto_init_net(struct net *net) 3442static __net_init int proto_init_net(struct net *net)
3456{ 3443{
3457 if (!proc_create("protocols", 0444, net->proc_net, &proto_seq_fops)) 3444 if (!proc_create_net("protocols", 0444, net->proc_net, &proto_seq_ops,
3445 sizeof(struct seq_net_private)))
3458 return -ENOMEM; 3446 return -ENOMEM;
3459 3447
3460 return 0; 3448 return 0;
diff --git a/net/decnet/af_decnet.c b/net/decnet/af_decnet.c
index 32751602767f..7d6ff983ba2c 100644
--- a/net/decnet/af_decnet.c
+++ b/net/decnet/af_decnet.c
@@ -2314,19 +2314,6 @@ static const struct seq_operations dn_socket_seq_ops = {
2314 .stop = dn_socket_seq_stop, 2314 .stop = dn_socket_seq_stop,
2315 .show = dn_socket_seq_show, 2315 .show = dn_socket_seq_show,
2316}; 2316};
2317
2318static int dn_socket_seq_open(struct inode *inode, struct file *file)
2319{
2320 return seq_open_private(file, &dn_socket_seq_ops,
2321 sizeof(struct dn_iter_state));
2322}
2323
2324static const struct file_operations dn_socket_seq_fops = {
2325 .open = dn_socket_seq_open,
2326 .read = seq_read,
2327 .llseek = seq_lseek,
2328 .release = seq_release_private,
2329};
2330#endif 2317#endif
2331 2318
2332static const struct net_proto_family dn_family_ops = { 2319static const struct net_proto_family dn_family_ops = {
@@ -2383,7 +2370,9 @@ static int __init decnet_init(void)
2383 dev_add_pack(&dn_dix_packet_type); 2370 dev_add_pack(&dn_dix_packet_type);
2384 register_netdevice_notifier(&dn_dev_notifier); 2371 register_netdevice_notifier(&dn_dev_notifier);
2385 2372
2386 proc_create("decnet", 0444, init_net.proc_net, &dn_socket_seq_fops); 2373 proc_create_seq_private("decnet", 0444, init_net.proc_net,
2374 &dn_socket_seq_ops, sizeof(struct dn_iter_state),
2375 NULL);
2387 dn_register_sysctl(); 2376 dn_register_sysctl();
2388out: 2377out:
2389 return rc; 2378 return rc;
diff --git a/net/decnet/dn_dev.c b/net/decnet/dn_dev.c
index c03b046478c3..bfd43e8f2c06 100644
--- a/net/decnet/dn_dev.c
+++ b/net/decnet/dn_dev.c
@@ -1382,19 +1382,6 @@ static const struct seq_operations dn_dev_seq_ops = {
1382 .stop = dn_dev_seq_stop, 1382 .stop = dn_dev_seq_stop,
1383 .show = dn_dev_seq_show, 1383 .show = dn_dev_seq_show,
1384}; 1384};
1385
1386static int dn_dev_seq_open(struct inode *inode, struct file *file)
1387{
1388 return seq_open(file, &dn_dev_seq_ops);
1389}
1390
1391static const struct file_operations dn_dev_seq_fops = {
1392 .open = dn_dev_seq_open,
1393 .read = seq_read,
1394 .llseek = seq_lseek,
1395 .release = seq_release,
1396};
1397
1398#endif /* CONFIG_PROC_FS */ 1385#endif /* CONFIG_PROC_FS */
1399 1386
1400static int addr[2]; 1387static int addr[2];
@@ -1424,7 +1411,7 @@ void __init dn_dev_init(void)
1424 rtnl_register_module(THIS_MODULE, PF_DECnet, RTM_GETADDR, 1411 rtnl_register_module(THIS_MODULE, PF_DECnet, RTM_GETADDR,
1425 NULL, dn_nl_dump_ifaddr, 0); 1412 NULL, dn_nl_dump_ifaddr, 0);
1426 1413
1427 proc_create("decnet_dev", 0444, init_net.proc_net, &dn_dev_seq_fops); 1414 proc_create_seq("decnet_dev", 0444, init_net.proc_net, &dn_dev_seq_ops);
1428 1415
1429#ifdef CONFIG_SYSCTL 1416#ifdef CONFIG_SYSCTL
1430 { 1417 {
diff --git a/net/decnet/dn_neigh.c b/net/decnet/dn_neigh.c
index 13156165afa3..94b306f6d551 100644
--- a/net/decnet/dn_neigh.c
+++ b/net/decnet/dn_neigh.c
@@ -589,27 +589,13 @@ static const struct seq_operations dn_neigh_seq_ops = {
589 .stop = neigh_seq_stop, 589 .stop = neigh_seq_stop,
590 .show = dn_neigh_seq_show, 590 .show = dn_neigh_seq_show,
591}; 591};
592
593static int dn_neigh_seq_open(struct inode *inode, struct file *file)
594{
595 return seq_open_net(inode, file, &dn_neigh_seq_ops,
596 sizeof(struct neigh_seq_state));
597}
598
599static const struct file_operations dn_neigh_seq_fops = {
600 .open = dn_neigh_seq_open,
601 .read = seq_read,
602 .llseek = seq_lseek,
603 .release = seq_release_net,
604};
605
606#endif 592#endif
607 593
608void __init dn_neigh_init(void) 594void __init dn_neigh_init(void)
609{ 595{
610 neigh_table_init(NEIGH_DN_TABLE, &dn_neigh_table); 596 neigh_table_init(NEIGH_DN_TABLE, &dn_neigh_table);
611 proc_create("decnet_neigh", 0444, init_net.proc_net, 597 proc_create_net("decnet_neigh", 0444, init_net.proc_net,
612 &dn_neigh_seq_fops); 598 &dn_neigh_seq_ops, sizeof(struct neigh_seq_state));
613} 599}
614 600
615void __exit dn_neigh_cleanup(void) 601void __exit dn_neigh_cleanup(void)
diff --git a/net/decnet/dn_route.c b/net/decnet/dn_route.c
index eca0cc6b761f..e74765024d88 100644
--- a/net/decnet/dn_route.c
+++ b/net/decnet/dn_route.c
@@ -1852,20 +1852,6 @@ static const struct seq_operations dn_rt_cache_seq_ops = {
1852 .stop = dn_rt_cache_seq_stop, 1852 .stop = dn_rt_cache_seq_stop,
1853 .show = dn_rt_cache_seq_show, 1853 .show = dn_rt_cache_seq_show,
1854}; 1854};
1855
1856static int dn_rt_cache_seq_open(struct inode *inode, struct file *file)
1857{
1858 return seq_open_private(file, &dn_rt_cache_seq_ops,
1859 sizeof(struct dn_rt_cache_iter_state));
1860}
1861
1862static const struct file_operations dn_rt_cache_seq_fops = {
1863 .open = dn_rt_cache_seq_open,
1864 .read = seq_read,
1865 .llseek = seq_lseek,
1866 .release = seq_release_private,
1867};
1868
1869#endif /* CONFIG_PROC_FS */ 1855#endif /* CONFIG_PROC_FS */
1870 1856
1871void __init dn_route_init(void) 1857void __init dn_route_init(void)
@@ -1918,8 +1904,9 @@ void __init dn_route_init(void)
1918 1904
1919 dn_dst_ops.gc_thresh = (dn_rt_hash_mask + 1); 1905 dn_dst_ops.gc_thresh = (dn_rt_hash_mask + 1);
1920 1906
1921 proc_create("decnet_cache", 0444, init_net.proc_net, 1907 proc_create_seq_private("decnet_cache", 0444, init_net.proc_net,
1922 &dn_rt_cache_seq_fops); 1908 &dn_rt_cache_seq_ops,
1909 sizeof(struct dn_rt_cache_iter_state), NULL);
1923 1910
1924#ifdef CONFIG_DECNET_ROUTER 1911#ifdef CONFIG_DECNET_ROUTER
1925 rtnl_register_module(THIS_MODULE, PF_DECnet, RTM_GETROUTE, 1912 rtnl_register_module(THIS_MODULE, PF_DECnet, RTM_GETROUTE,
diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c
index bf6c2d4d4fdc..e90c89ef8c08 100644
--- a/net/ipv4/arp.c
+++ b/net/ipv4/arp.c
@@ -1418,23 +1418,12 @@ static const struct seq_operations arp_seq_ops = {
1418 .show = arp_seq_show, 1418 .show = arp_seq_show,
1419}; 1419};
1420 1420
1421static int arp_seq_open(struct inode *inode, struct file *file) 1421/* ------------------------------------------------------------------------ */
1422{
1423 return seq_open_net(inode, file, &arp_seq_ops,
1424 sizeof(struct neigh_seq_state));
1425}
1426
1427static const struct file_operations arp_seq_fops = {
1428 .open = arp_seq_open,
1429 .read = seq_read,
1430 .llseek = seq_lseek,
1431 .release = seq_release_net,
1432};
1433
1434 1422
1435static int __net_init arp_net_init(struct net *net) 1423static int __net_init arp_net_init(struct net *net)
1436{ 1424{
1437 if (!proc_create("arp", 0444, net->proc_net, &arp_seq_fops)) 1425 if (!proc_create_net("arp", 0444, net->proc_net, &arp_seq_ops,
1426 sizeof(struct neigh_seq_state)))
1438 return -ENOMEM; 1427 return -ENOMEM;
1439 return 0; 1428 return 0;
1440} 1429}
diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c
index 3dcffd3ce98c..99c23a0cb8ca 100644
--- a/net/ipv4/fib_trie.c
+++ b/net/ipv4/fib_trie.c
@@ -2348,18 +2348,6 @@ static int fib_triestat_seq_show(struct seq_file *seq, void *v)
2348 return 0; 2348 return 0;
2349} 2349}
2350 2350
2351static int fib_triestat_seq_open(struct inode *inode, struct file *file)
2352{
2353 return single_open_net(inode, file, fib_triestat_seq_show);
2354}
2355
2356static const struct file_operations fib_triestat_fops = {
2357 .open = fib_triestat_seq_open,
2358 .read = seq_read,
2359 .llseek = seq_lseek,
2360 .release = single_release_net,
2361};
2362
2363static struct key_vector *fib_trie_get_idx(struct seq_file *seq, loff_t pos) 2351static struct key_vector *fib_trie_get_idx(struct seq_file *seq, loff_t pos)
2364{ 2352{
2365 struct fib_trie_iter *iter = seq->private; 2353 struct fib_trie_iter *iter = seq->private;
@@ -2533,19 +2521,6 @@ static const struct seq_operations fib_trie_seq_ops = {
2533 .show = fib_trie_seq_show, 2521 .show = fib_trie_seq_show,
2534}; 2522};
2535 2523
2536static int fib_trie_seq_open(struct inode *inode, struct file *file)
2537{
2538 return seq_open_net(inode, file, &fib_trie_seq_ops,
2539 sizeof(struct fib_trie_iter));
2540}
2541
2542static const struct file_operations fib_trie_fops = {
2543 .open = fib_trie_seq_open,
2544 .read = seq_read,
2545 .llseek = seq_lseek,
2546 .release = seq_release_net,
2547};
2548
2549struct fib_route_iter { 2524struct fib_route_iter {
2550 struct seq_net_private p; 2525 struct seq_net_private p;
2551 struct fib_table *main_tb; 2526 struct fib_table *main_tb;
@@ -2726,29 +2701,18 @@ static const struct seq_operations fib_route_seq_ops = {
2726 .show = fib_route_seq_show, 2701 .show = fib_route_seq_show,
2727}; 2702};
2728 2703
2729static int fib_route_seq_open(struct inode *inode, struct file *file)
2730{
2731 return seq_open_net(inode, file, &fib_route_seq_ops,
2732 sizeof(struct fib_route_iter));
2733}
2734
2735static const struct file_operations fib_route_fops = {
2736 .open = fib_route_seq_open,
2737 .read = seq_read,
2738 .llseek = seq_lseek,
2739 .release = seq_release_net,
2740};
2741
2742int __net_init fib_proc_init(struct net *net) 2704int __net_init fib_proc_init(struct net *net)
2743{ 2705{
2744 if (!proc_create("fib_trie", 0444, net->proc_net, &fib_trie_fops)) 2706 if (!proc_create_net("fib_trie", 0444, net->proc_net, &fib_trie_seq_ops,
2707 sizeof(struct fib_trie_iter)))
2745 goto out1; 2708 goto out1;
2746 2709
2747 if (!proc_create("fib_triestat", 0444, net->proc_net, 2710 if (!proc_create_net_single("fib_triestat", 0444, net->proc_net,
2748 &fib_triestat_fops)) 2711 fib_triestat_seq_show, NULL))
2749 goto out2; 2712 goto out2;
2750 2713
2751 if (!proc_create("route", 0444, net->proc_net, &fib_route_fops)) 2714 if (!proc_create_net("route", 0444, net->proc_net, &fib_route_seq_ops,
2715 sizeof(struct fib_route_iter)))
2752 goto out3; 2716 goto out3;
2753 2717
2754 return 0; 2718 return 0;
diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c
index b26a81a7de42..85b617b655bc 100644
--- a/net/ipv4/igmp.c
+++ b/net/ipv4/igmp.c
@@ -2829,19 +2829,6 @@ static const struct seq_operations igmp_mc_seq_ops = {
2829 .show = igmp_mc_seq_show, 2829 .show = igmp_mc_seq_show,
2830}; 2830};
2831 2831
2832static int igmp_mc_seq_open(struct inode *inode, struct file *file)
2833{
2834 return seq_open_net(inode, file, &igmp_mc_seq_ops,
2835 sizeof(struct igmp_mc_iter_state));
2836}
2837
2838static const struct file_operations igmp_mc_seq_fops = {
2839 .open = igmp_mc_seq_open,
2840 .read = seq_read,
2841 .llseek = seq_lseek,
2842 .release = seq_release_net,
2843};
2844
2845struct igmp_mcf_iter_state { 2832struct igmp_mcf_iter_state {
2846 struct seq_net_private p; 2833 struct seq_net_private p;
2847 struct net_device *dev; 2834 struct net_device *dev;
@@ -2975,29 +2962,17 @@ static const struct seq_operations igmp_mcf_seq_ops = {
2975 .show = igmp_mcf_seq_show, 2962 .show = igmp_mcf_seq_show,
2976}; 2963};
2977 2964
2978static int igmp_mcf_seq_open(struct inode *inode, struct file *file)
2979{
2980 return seq_open_net(inode, file, &igmp_mcf_seq_ops,
2981 sizeof(struct igmp_mcf_iter_state));
2982}
2983
2984static const struct file_operations igmp_mcf_seq_fops = {
2985 .open = igmp_mcf_seq_open,
2986 .read = seq_read,
2987 .llseek = seq_lseek,
2988 .release = seq_release_net,
2989};
2990
2991static int __net_init igmp_net_init(struct net *net) 2965static int __net_init igmp_net_init(struct net *net)
2992{ 2966{
2993 struct proc_dir_entry *pde; 2967 struct proc_dir_entry *pde;
2994 int err; 2968 int err;
2995 2969
2996 pde = proc_create("igmp", 0444, net->proc_net, &igmp_mc_seq_fops); 2970 pde = proc_create_net("igmp", 0444, net->proc_net, &igmp_mc_seq_ops,
2971 sizeof(struct igmp_mc_iter_state));
2997 if (!pde) 2972 if (!pde)
2998 goto out_igmp; 2973 goto out_igmp;
2999 pde = proc_create("mcfilter", 0444, net->proc_net, 2974 pde = proc_create_net("mcfilter", 0444, net->proc_net,
3000 &igmp_mcf_seq_fops); 2975 &igmp_mcf_seq_ops, sizeof(struct igmp_mcf_iter_state));
3001 if (!pde) 2976 if (!pde)
3002 goto out_mcfilter; 2977 goto out_mcfilter;
3003 err = inet_ctl_sock_create(&net->ipv4.mc_autojoin_sk, AF_INET, 2978 err = inet_ctl_sock_create(&net->ipv4.mc_autojoin_sk, AF_INET,
diff --git a/net/ipv4/ipconfig.c b/net/ipv4/ipconfig.c
index 43f620feb1c4..bbcbcc113d19 100644
--- a/net/ipv4/ipconfig.c
+++ b/net/ipv4/ipconfig.c
@@ -1282,18 +1282,6 @@ static int pnp_seq_show(struct seq_file *seq, void *v)
1282 &ic_servaddr); 1282 &ic_servaddr);
1283 return 0; 1283 return 0;
1284} 1284}
1285
1286static int pnp_seq_open(struct inode *indoe, struct file *file)
1287{
1288 return single_open(file, pnp_seq_show, NULL);
1289}
1290
1291static const struct file_operations pnp_seq_fops = {
1292 .open = pnp_seq_open,
1293 .read = seq_read,
1294 .llseek = seq_lseek,
1295 .release = single_release,
1296};
1297#endif /* CONFIG_PROC_FS */ 1285#endif /* CONFIG_PROC_FS */
1298 1286
1299/* 1287/*
@@ -1369,7 +1357,7 @@ static int __init ip_auto_config(void)
1369 unsigned int i; 1357 unsigned int i;
1370 1358
1371#ifdef CONFIG_PROC_FS 1359#ifdef CONFIG_PROC_FS
1372 proc_create("pnp", 0444, init_net.proc_net, &pnp_seq_fops); 1360 proc_create_single("pnp", 0444, init_net.proc_net, pnp_seq_show);
1373#endif /* CONFIG_PROC_FS */ 1361#endif /* CONFIG_PROC_FS */
1374 1362
1375 if (!ic_enable) 1363 if (!ic_enable)
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c
index 2fb4de3f7f66..37c4f885ff7b 100644
--- a/net/ipv4/ipmr.c
+++ b/net/ipv4/ipmr.c
@@ -2828,19 +2828,6 @@ static const struct seq_operations ipmr_vif_seq_ops = {
2828 .show = ipmr_vif_seq_show, 2828 .show = ipmr_vif_seq_show,
2829}; 2829};
2830 2830
2831static int ipmr_vif_open(struct inode *inode, struct file *file)
2832{
2833 return seq_open_net(inode, file, &ipmr_vif_seq_ops,
2834 sizeof(struct mr_vif_iter));
2835}
2836
2837static const struct file_operations ipmr_vif_fops = {
2838 .open = ipmr_vif_open,
2839 .read = seq_read,
2840 .llseek = seq_lseek,
2841 .release = seq_release_net,
2842};
2843
2844static void *ipmr_mfc_seq_start(struct seq_file *seq, loff_t *pos) 2831static void *ipmr_mfc_seq_start(struct seq_file *seq, loff_t *pos)
2845{ 2832{
2846 struct net *net = seq_file_net(seq); 2833 struct net *net = seq_file_net(seq);
@@ -2900,19 +2887,6 @@ static const struct seq_operations ipmr_mfc_seq_ops = {
2900 .stop = mr_mfc_seq_stop, 2887 .stop = mr_mfc_seq_stop,
2901 .show = ipmr_mfc_seq_show, 2888 .show = ipmr_mfc_seq_show,
2902}; 2889};
2903
2904static int ipmr_mfc_open(struct inode *inode, struct file *file)
2905{
2906 return seq_open_net(inode, file, &ipmr_mfc_seq_ops,
2907 sizeof(struct mr_mfc_iter));
2908}
2909
2910static const struct file_operations ipmr_mfc_fops = {
2911 .open = ipmr_mfc_open,
2912 .read = seq_read,
2913 .llseek = seq_lseek,
2914 .release = seq_release_net,
2915};
2916#endif 2890#endif
2917 2891
2918#ifdef CONFIG_IP_PIMSM_V2 2892#ifdef CONFIG_IP_PIMSM_V2
@@ -2977,9 +2951,11 @@ static int __net_init ipmr_net_init(struct net *net)
2977 2951
2978#ifdef CONFIG_PROC_FS 2952#ifdef CONFIG_PROC_FS
2979 err = -ENOMEM; 2953 err = -ENOMEM;
2980 if (!proc_create("ip_mr_vif", 0, net->proc_net, &ipmr_vif_fops)) 2954 if (!proc_create_net("ip_mr_vif", 0, net->proc_net, &ipmr_vif_seq_ops,
2955 sizeof(struct mr_vif_iter)))
2981 goto proc_vif_fail; 2956 goto proc_vif_fail;
2982 if (!proc_create("ip_mr_cache", 0, net->proc_net, &ipmr_mfc_fops)) 2957 if (!proc_create_net("ip_mr_cache", 0, net->proc_net, &ipmr_mfc_seq_ops,
2958 sizeof(struct mr_mfc_iter)))
2983 goto proc_cache_fail; 2959 goto proc_cache_fail;
2984#endif 2960#endif
2985 return 0; 2961 return 0;
diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c
index 56a010622f70..2ed64bca54e3 100644
--- a/net/ipv4/ping.c
+++ b/net/ipv4/ping.c
@@ -1150,58 +1150,24 @@ 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{ 1154 .start = ping_v4_seq_start,
1155 struct ping_seq_afinfo *afinfo = PDE_DATA(inode); 1155 .show = ping_v4_seq_show,
1156 return seq_open_net(inode, file, &afinfo->seq_ops, 1156 .next = ping_seq_next,
1157 sizeof(struct ping_iter_state)); 1157 .stop = ping_seq_stop,
1158}
1159
1160const struct file_operations ping_seq_fops = {
1161 .open = ping_seq_open,
1162 .read = seq_read,
1163 .llseek = seq_lseek,
1164 .release = seq_release_net,
1165};
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}; 1158};
1179 1159
1180int ping_proc_register(struct net *net, struct ping_seq_afinfo *afinfo) 1160static int __net_init ping_v4_proc_init_net(struct net *net)
1181{ 1161{
1182 struct proc_dir_entry *p; 1162 if (!proc_create_net("icmp", 0444, net->proc_net, &ping_v4_seq_ops,
1183 p = proc_create_data(afinfo->name, 0444, net->proc_net, 1163 sizeof(struct ping_iter_state)))
1184 afinfo->seq_fops, afinfo);
1185 if (!p)
1186 return -ENOMEM; 1164 return -ENOMEM;
1187 return 0; 1165 return 0;
1188} 1166}
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 1167
1202static void __net_exit ping_v4_proc_exit_net(struct net *net) 1168static void __net_exit ping_v4_proc_exit_net(struct net *net)
1203{ 1169{
1204 ping_proc_unregister(net, &ping_v4_seq_afinfo); 1170 remove_proc_entry("icmp", net->proc_net);
1205} 1171}
1206 1172
1207static struct pernet_operations ping_v4_net_ops = { 1173static struct pernet_operations ping_v4_net_ops = {
diff --git a/net/ipv4/proc.c b/net/ipv4/proc.c
index a058de677e94..573e43c8ed87 100644
--- a/net/ipv4/proc.c
+++ b/net/ipv4/proc.c
@@ -77,18 +77,6 @@ static int sockstat_seq_show(struct seq_file *seq, void *v)
77 return 0; 77 return 0;
78} 78}
79 79
80static int sockstat_seq_open(struct inode *inode, struct file *file)
81{
82 return single_open_net(inode, file, sockstat_seq_show);
83}
84
85static const struct file_operations sockstat_seq_fops = {
86 .open = sockstat_seq_open,
87 .read = seq_read,
88 .llseek = seq_lseek,
89 .release = single_release_net,
90};
91
92/* snmp items */ 80/* snmp items */
93static const struct snmp_mib snmp4_ipstats_list[] = { 81static const struct snmp_mib snmp4_ipstats_list[] = {
94 SNMP_MIB_ITEM("InReceives", IPSTATS_MIB_INPKTS), 82 SNMP_MIB_ITEM("InReceives", IPSTATS_MIB_INPKTS),
@@ -460,20 +448,6 @@ static int snmp_seq_show(struct seq_file *seq, void *v)
460 return 0; 448 return 0;
461} 449}
462 450
463static int snmp_seq_open(struct inode *inode, struct file *file)
464{
465 return single_open_net(inode, file, snmp_seq_show);
466}
467
468static const struct file_operations snmp_seq_fops = {
469 .open = snmp_seq_open,
470 .read = seq_read,
471 .llseek = seq_lseek,
472 .release = single_release_net,
473};
474
475
476
477/* 451/*
478 * Output /proc/net/netstat 452 * Output /proc/net/netstat
479 */ 453 */
@@ -507,26 +481,16 @@ static int netstat_seq_show(struct seq_file *seq, void *v)
507 return 0; 481 return 0;
508} 482}
509 483
510static int netstat_seq_open(struct inode *inode, struct file *file)
511{
512 return single_open_net(inode, file, netstat_seq_show);
513}
514
515static const struct file_operations netstat_seq_fops = {
516 .open = netstat_seq_open,
517 .read = seq_read,
518 .llseek = seq_lseek,
519 .release = single_release_net,
520};
521
522static __net_init int ip_proc_init_net(struct net *net) 484static __net_init int ip_proc_init_net(struct net *net)
523{ 485{
524 if (!proc_create("sockstat", 0444, net->proc_net, 486 if (!proc_create_net_single("sockstat", 0444, net->proc_net,
525 &sockstat_seq_fops)) 487 sockstat_seq_show, NULL))
526 goto out_sockstat; 488 goto out_sockstat;
527 if (!proc_create("netstat", 0444, net->proc_net, &netstat_seq_fops)) 489 if (!proc_create_net_single("netstat", 0444, net->proc_net,
490 netstat_seq_show, NULL))
528 goto out_netstat; 491 goto out_netstat;
529 if (!proc_create("snmp", 0444, net->proc_net, &snmp_seq_fops)) 492 if (!proc_create_net_single("snmp", 0444, net->proc_net, snmp_seq_show,
493 NULL))
530 goto out_snmp; 494 goto out_snmp;
531 495
532 return 0; 496 return 0;
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c
index 1b4d3355624a..abb3c9490c55 100644
--- a/net/ipv4/raw.c
+++ b/net/ipv4/raw.c
@@ -1003,11 +1003,12 @@ struct proto raw_prot = {
1003static struct sock *raw_get_first(struct seq_file *seq) 1003static struct sock *raw_get_first(struct seq_file *seq)
1004{ 1004{
1005 struct sock *sk; 1005 struct sock *sk;
1006 struct raw_hashinfo *h = PDE_DATA(file_inode(seq->file));
1006 struct raw_iter_state *state = raw_seq_private(seq); 1007 struct raw_iter_state *state = raw_seq_private(seq);
1007 1008
1008 for (state->bucket = 0; state->bucket < RAW_HTABLE_SIZE; 1009 for (state->bucket = 0; state->bucket < RAW_HTABLE_SIZE;
1009 ++state->bucket) { 1010 ++state->bucket) {
1010 sk_for_each(sk, &state->h->ht[state->bucket]) 1011 sk_for_each(sk, &h->ht[state->bucket])
1011 if (sock_net(sk) == seq_file_net(seq)) 1012 if (sock_net(sk) == seq_file_net(seq))
1012 goto found; 1013 goto found;
1013 } 1014 }
@@ -1018,6 +1019,7 @@ found:
1018 1019
1019static struct sock *raw_get_next(struct seq_file *seq, struct sock *sk) 1020static struct sock *raw_get_next(struct seq_file *seq, struct sock *sk)
1020{ 1021{
1022 struct raw_hashinfo *h = PDE_DATA(file_inode(seq->file));
1021 struct raw_iter_state *state = raw_seq_private(seq); 1023 struct raw_iter_state *state = raw_seq_private(seq);
1022 1024
1023 do { 1025 do {
@@ -1027,7 +1029,7 @@ try_again:
1027 } while (sk && sock_net(sk) != seq_file_net(seq)); 1029 } while (sk && sock_net(sk) != seq_file_net(seq));
1028 1030
1029 if (!sk && ++state->bucket < RAW_HTABLE_SIZE) { 1031 if (!sk && ++state->bucket < RAW_HTABLE_SIZE) {
1030 sk = sk_head(&state->h->ht[state->bucket]); 1032 sk = sk_head(&h->ht[state->bucket]);
1031 goto try_again; 1033 goto try_again;
1032 } 1034 }
1033 return sk; 1035 return sk;
@@ -1045,9 +1047,9 @@ static struct sock *raw_get_idx(struct seq_file *seq, loff_t pos)
1045 1047
1046void *raw_seq_start(struct seq_file *seq, loff_t *pos) 1048void *raw_seq_start(struct seq_file *seq, loff_t *pos)
1047{ 1049{
1048 struct raw_iter_state *state = raw_seq_private(seq); 1050 struct raw_hashinfo *h = PDE_DATA(file_inode(seq->file));
1049 1051
1050 read_lock(&state->h->lock); 1052 read_lock(&h->lock);
1051 return *pos ? raw_get_idx(seq, *pos - 1) : SEQ_START_TOKEN; 1053 return *pos ? raw_get_idx(seq, *pos - 1) : SEQ_START_TOKEN;
1052} 1054}
1053EXPORT_SYMBOL_GPL(raw_seq_start); 1055EXPORT_SYMBOL_GPL(raw_seq_start);
@@ -1067,9 +1069,9 @@ EXPORT_SYMBOL_GPL(raw_seq_next);
1067 1069
1068void raw_seq_stop(struct seq_file *seq, void *v) 1070void raw_seq_stop(struct seq_file *seq, void *v)
1069{ 1071{
1070 struct raw_iter_state *state = raw_seq_private(seq); 1072 struct raw_hashinfo *h = PDE_DATA(file_inode(seq->file));
1071 1073
1072 read_unlock(&state->h->lock); 1074 read_unlock(&h->lock);
1073} 1075}
1074EXPORT_SYMBOL_GPL(raw_seq_stop); 1076EXPORT_SYMBOL_GPL(raw_seq_stop);
1075 1077
@@ -1110,37 +1112,10 @@ static const struct seq_operations raw_seq_ops = {
1110 .show = raw_seq_show, 1112 .show = raw_seq_show,
1111}; 1113};
1112 1114
1113int raw_seq_open(struct inode *ino, struct file *file,
1114 struct raw_hashinfo *h, const struct seq_operations *ops)
1115{
1116 int err;
1117 struct raw_iter_state *i;
1118
1119 err = seq_open_net(ino, file, ops, sizeof(struct raw_iter_state));
1120 if (err < 0)
1121 return err;
1122
1123 i = raw_seq_private((struct seq_file *)file->private_data);
1124 i->h = h;
1125 return 0;
1126}
1127EXPORT_SYMBOL_GPL(raw_seq_open);
1128
1129static int raw_v4_seq_open(struct inode *inode, struct file *file)
1130{
1131 return raw_seq_open(inode, file, &raw_v4_hashinfo, &raw_seq_ops);
1132}
1133
1134static const struct file_operations raw_seq_fops = {
1135 .open = raw_v4_seq_open,
1136 .read = seq_read,
1137 .llseek = seq_lseek,
1138 .release = seq_release_net,
1139};
1140
1141static __net_init int raw_init_net(struct net *net) 1115static __net_init int raw_init_net(struct net *net)
1142{ 1116{
1143 if (!proc_create("raw", 0444, net->proc_net, &raw_seq_fops)) 1117 if (!proc_create_net_data("raw", 0444, net->proc_net, &raw_seq_ops,
1118 sizeof(struct raw_iter_state), &raw_v4_hashinfo))
1144 return -ENOMEM; 1119 return -ENOMEM;
1145 1120
1146 return 0; 1121 return 0;
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index 2cfa1b518f8d..75fb8864be67 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -360,18 +360,6 @@ static int rt_acct_proc_show(struct seq_file *m, void *v)
360 kfree(dst); 360 kfree(dst);
361 return 0; 361 return 0;
362} 362}
363
364static int rt_acct_proc_open(struct inode *inode, struct file *file)
365{
366 return single_open(file, rt_acct_proc_show, NULL);
367}
368
369static const struct file_operations rt_acct_proc_fops = {
370 .open = rt_acct_proc_open,
371 .read = seq_read,
372 .llseek = seq_lseek,
373 .release = single_release,
374};
375#endif 363#endif
376 364
377static int __net_init ip_rt_do_proc_init(struct net *net) 365static int __net_init ip_rt_do_proc_init(struct net *net)
@@ -389,7 +377,8 @@ static int __net_init ip_rt_do_proc_init(struct net *net)
389 goto err2; 377 goto err2;
390 378
391#ifdef CONFIG_IP_ROUTE_CLASSID 379#ifdef CONFIG_IP_ROUTE_CLASSID
392 pde = proc_create("rt_acct", 0, net->proc_net, &rt_acct_proc_fops); 380 pde = proc_create_single("rt_acct", 0, net->proc_net,
381 rt_acct_proc_show);
393 if (!pde) 382 if (!pde)
394 goto err3; 383 goto err3;
395#endif 384#endif
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
index f70586b50838..2c970626b398 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,30 +2343,28 @@ out:
2377 return 0; 2343 return 0;
2378} 2344}
2379 2345
2380static const struct file_operations tcp_afinfo_seq_fops = { 2346static const struct seq_operations tcp4_seq_ops = {
2381 .open = tcp_seq_open, 2347 .show = tcp4_seq_show,
2382 .read = seq_read, 2348 .start = tcp_seq_start,
2383 .llseek = seq_lseek, 2349 .next = tcp_seq_next,
2384 .release = seq_release_net 2350 .stop = tcp_seq_stop,
2385}; 2351};
2386 2352
2387static struct tcp_seq_afinfo tcp4_seq_afinfo = { 2353static struct tcp_seq_afinfo tcp4_seq_afinfo = {
2388 .name = "tcp",
2389 .family = AF_INET, 2354 .family = AF_INET,
2390 .seq_fops = &tcp_afinfo_seq_fops,
2391 .seq_ops = {
2392 .show = tcp4_seq_show,
2393 },
2394}; 2355};
2395 2356
2396static int __net_init tcp4_proc_init_net(struct net *net) 2357static int __net_init tcp4_proc_init_net(struct net *net)
2397{ 2358{
2398 return tcp_proc_register(net, &tcp4_seq_afinfo); 2359 if (!proc_create_net_data("tcp", 0444, net->proc_net, &tcp4_seq_ops,
2360 sizeof(struct tcp_iter_state), &tcp4_seq_afinfo))
2361 return -ENOMEM;
2362 return 0;
2399} 2363}
2400 2364
2401static void __net_exit tcp4_proc_exit_net(struct net *net) 2365static void __net_exit tcp4_proc_exit_net(struct net *net)
2402{ 2366{
2403 tcp_proc_unregister(net, &tcp4_seq_afinfo); 2367 remove_proc_entry("tcp", net->proc_net);
2404} 2368}
2405 2369
2406static struct pernet_operations tcp4_net_ops = { 2370static struct pernet_operations tcp4_net_ops = {
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
index b61a770884fa..051a43ff3fb8 100644
--- a/net/ipv4/udp.c
+++ b/net/ipv4/udp.c
@@ -2582,12 +2582,13 @@ EXPORT_SYMBOL(udp_prot);
2582static struct sock *udp_get_first(struct seq_file *seq, int start) 2582static struct sock *udp_get_first(struct seq_file *seq, int start)
2583{ 2583{
2584 struct sock *sk; 2584 struct sock *sk;
2585 struct udp_seq_afinfo *afinfo = PDE_DATA(file_inode(seq->file));
2585 struct udp_iter_state *state = seq->private; 2586 struct udp_iter_state *state = seq->private;
2586 struct net *net = seq_file_net(seq); 2587 struct net *net = seq_file_net(seq);
2587 2588
2588 for (state->bucket = start; state->bucket <= state->udp_table->mask; 2589 for (state->bucket = start; state->bucket <= afinfo->udp_table->mask;
2589 ++state->bucket) { 2590 ++state->bucket) {
2590 struct udp_hslot *hslot = &state->udp_table->hash[state->bucket]; 2591 struct udp_hslot *hslot = &afinfo->udp_table->hash[state->bucket];
2591 2592
2592 if (hlist_empty(&hslot->head)) 2593 if (hlist_empty(&hslot->head))
2593 continue; 2594 continue;
@@ -2596,7 +2597,7 @@ static struct sock *udp_get_first(struct seq_file *seq, int start)
2596 sk_for_each(sk, &hslot->head) { 2597 sk_for_each(sk, &hslot->head) {
2597 if (!net_eq(sock_net(sk), net)) 2598 if (!net_eq(sock_net(sk), net))
2598 continue; 2599 continue;
2599 if (sk->sk_family == state->family) 2600 if (sk->sk_family == afinfo->family)
2600 goto found; 2601 goto found;
2601 } 2602 }
2602 spin_unlock_bh(&hslot->lock); 2603 spin_unlock_bh(&hslot->lock);
@@ -2608,16 +2609,17 @@ found:
2608 2609
2609static struct sock *udp_get_next(struct seq_file *seq, struct sock *sk) 2610static struct sock *udp_get_next(struct seq_file *seq, struct sock *sk)
2610{ 2611{
2612 struct udp_seq_afinfo *afinfo = PDE_DATA(file_inode(seq->file));
2611 struct udp_iter_state *state = seq->private; 2613 struct udp_iter_state *state = seq->private;
2612 struct net *net = seq_file_net(seq); 2614 struct net *net = seq_file_net(seq);
2613 2615
2614 do { 2616 do {
2615 sk = sk_next(sk); 2617 sk = sk_next(sk);
2616 } while (sk && (!net_eq(sock_net(sk), net) || sk->sk_family != state->family)); 2618 } while (sk && (!net_eq(sock_net(sk), net) || sk->sk_family != afinfo->family));
2617 2619
2618 if (!sk) { 2620 if (!sk) {
2619 if (state->bucket <= state->udp_table->mask) 2621 if (state->bucket <= afinfo->udp_table->mask)
2620 spin_unlock_bh(&state->udp_table->hash[state->bucket].lock); 2622 spin_unlock_bh(&afinfo->udp_table->hash[state->bucket].lock);
2621 return udp_get_first(seq, state->bucket + 1); 2623 return udp_get_first(seq, state->bucket + 1);
2622 } 2624 }
2623 return sk; 2625 return sk;
@@ -2633,15 +2635,16 @@ static struct sock *udp_get_idx(struct seq_file *seq, loff_t pos)
2633 return pos ? NULL : sk; 2635 return pos ? NULL : sk;
2634} 2636}
2635 2637
2636static void *udp_seq_start(struct seq_file *seq, loff_t *pos) 2638void *udp_seq_start(struct seq_file *seq, loff_t *pos)
2637{ 2639{
2638 struct udp_iter_state *state = seq->private; 2640 struct udp_iter_state *state = seq->private;
2639 state->bucket = MAX_UDP_PORTS; 2641 state->bucket = MAX_UDP_PORTS;
2640 2642
2641 return *pos ? udp_get_idx(seq, *pos-1) : SEQ_START_TOKEN; 2643 return *pos ? udp_get_idx(seq, *pos-1) : SEQ_START_TOKEN;
2642} 2644}
2645EXPORT_SYMBOL(udp_seq_start);
2643 2646
2644static void *udp_seq_next(struct seq_file *seq, void *v, loff_t *pos) 2647void *udp_seq_next(struct seq_file *seq, void *v, loff_t *pos)
2645{ 2648{
2646 struct sock *sk; 2649 struct sock *sk;
2647 2650
@@ -2653,56 +2656,17 @@ static void *udp_seq_next(struct seq_file *seq, void *v, loff_t *pos)
2653 ++*pos; 2656 ++*pos;
2654 return sk; 2657 return sk;
2655} 2658}
2659EXPORT_SYMBOL(udp_seq_next);
2656 2660
2657static void udp_seq_stop(struct seq_file *seq, void *v) 2661void udp_seq_stop(struct seq_file *seq, void *v)
2658{ 2662{
2663 struct udp_seq_afinfo *afinfo = PDE_DATA(file_inode(seq->file));
2659 struct udp_iter_state *state = seq->private; 2664 struct udp_iter_state *state = seq->private;
2660 2665
2661 if (state->bucket <= state->udp_table->mask) 2666 if (state->bucket <= afinfo->udp_table->mask)
2662 spin_unlock_bh(&state->udp_table->hash[state->bucket].lock); 2667 spin_unlock_bh(&afinfo->udp_table->hash[state->bucket].lock);
2663} 2668}
2664 2669EXPORT_SYMBOL(udp_seq_stop);
2665int udp_seq_open(struct inode *inode, struct file *file)
2666{
2667 struct udp_seq_afinfo *afinfo = PDE_DATA(inode);
2668 struct udp_iter_state *s;
2669 int err;
2670
2671 err = seq_open_net(inode, file, &afinfo->seq_ops,
2672 sizeof(struct udp_iter_state));
2673 if (err < 0)
2674 return err;
2675
2676 s = ((struct seq_file *)file->private_data)->private;
2677 s->family = afinfo->family;
2678 s->udp_table = afinfo->udp_table;
2679 return err;
2680}
2681EXPORT_SYMBOL(udp_seq_open);
2682
2683/* ------------------------------------------------------------------------ */
2684int udp_proc_register(struct net *net, struct udp_seq_afinfo *afinfo)
2685{
2686 struct proc_dir_entry *p;
2687 int rc = 0;
2688
2689 afinfo->seq_ops.start = udp_seq_start;
2690 afinfo->seq_ops.next = udp_seq_next;
2691 afinfo->seq_ops.stop = udp_seq_stop;
2692
2693 p = proc_create_data(afinfo->name, 0444, net->proc_net,
2694 afinfo->seq_fops, afinfo);
2695 if (!p)
2696 rc = -ENOMEM;
2697 return rc;
2698}
2699EXPORT_SYMBOL(udp_proc_register);
2700
2701void udp_proc_unregister(struct net *net, struct udp_seq_afinfo *afinfo)
2702{
2703 remove_proc_entry(afinfo->name, net->proc_net);
2704}
2705EXPORT_SYMBOL(udp_proc_unregister);
2706 2670
2707/* ------------------------------------------------------------------------ */ 2671/* ------------------------------------------------------------------------ */
2708static void udp4_format_sock(struct sock *sp, struct seq_file *f, 2672static void udp4_format_sock(struct sock *sp, struct seq_file *f,
@@ -2742,32 +2706,30 @@ int udp4_seq_show(struct seq_file *seq, void *v)
2742 return 0; 2706 return 0;
2743} 2707}
2744 2708
2745static const struct file_operations udp_afinfo_seq_fops = { 2709const struct seq_operations udp_seq_ops = {
2746 .open = udp_seq_open, 2710 .start = udp_seq_start,
2747 .read = seq_read, 2711 .next = udp_seq_next,
2748 .llseek = seq_lseek, 2712 .stop = udp_seq_stop,
2749 .release = seq_release_net 2713 .show = udp4_seq_show,
2750}; 2714};
2715EXPORT_SYMBOL(udp_seq_ops);
2751 2716
2752/* ------------------------------------------------------------------------ */
2753static struct udp_seq_afinfo udp4_seq_afinfo = { 2717static struct udp_seq_afinfo udp4_seq_afinfo = {
2754 .name = "udp",
2755 .family = AF_INET, 2718 .family = AF_INET,
2756 .udp_table = &udp_table, 2719 .udp_table = &udp_table,
2757 .seq_fops = &udp_afinfo_seq_fops,
2758 .seq_ops = {
2759 .show = udp4_seq_show,
2760 },
2761}; 2720};
2762 2721
2763static int __net_init udp4_proc_init_net(struct net *net) 2722static int __net_init udp4_proc_init_net(struct net *net)
2764{ 2723{
2765 return udp_proc_register(net, &udp4_seq_afinfo); 2724 if (!proc_create_net_data("udp", 0444, net->proc_net, &udp_seq_ops,
2725 sizeof(struct udp_iter_state), &udp4_seq_afinfo))
2726 return -ENOMEM;
2727 return 0;
2766} 2728}
2767 2729
2768static void __net_exit udp4_proc_exit_net(struct net *net) 2730static void __net_exit udp4_proc_exit_net(struct net *net)
2769{ 2731{
2770 udp_proc_unregister(net, &udp4_seq_afinfo); 2732 remove_proc_entry("udp", net->proc_net);
2771} 2733}
2772 2734
2773static struct pernet_operations udp4_net_ops = { 2735static struct pernet_operations udp4_net_ops = {
diff --git a/net/ipv4/udplite.c b/net/ipv4/udplite.c
index f96614e9b9a5..8545457752fb 100644
--- a/net/ipv4/udplite.c
+++ b/net/ipv4/udplite.c
@@ -14,6 +14,7 @@
14#define pr_fmt(fmt) "UDPLite: " fmt 14#define pr_fmt(fmt) "UDPLite: " fmt
15 15
16#include <linux/export.h> 16#include <linux/export.h>
17#include <linux/proc_fs.h>
17#include "udp_impl.h" 18#include "udp_impl.h"
18 19
19struct udp_table udplite_table __read_mostly; 20struct udp_table udplite_table __read_mostly;
@@ -73,32 +74,22 @@ static struct inet_protosw udplite4_protosw = {
73}; 74};
74 75
75#ifdef CONFIG_PROC_FS 76#ifdef CONFIG_PROC_FS
76
77static const struct file_operations udplite_afinfo_seq_fops = {
78 .open = udp_seq_open,
79 .read = seq_read,
80 .llseek = seq_lseek,
81 .release = seq_release_net
82};
83
84static struct udp_seq_afinfo udplite4_seq_afinfo = { 77static struct udp_seq_afinfo udplite4_seq_afinfo = {
85 .name = "udplite",
86 .family = AF_INET, 78 .family = AF_INET,
87 .udp_table = &udplite_table, 79 .udp_table = &udplite_table,
88 .seq_fops = &udplite_afinfo_seq_fops,
89 .seq_ops = {
90 .show = udp4_seq_show,
91 },
92}; 80};
93 81
94static int __net_init udplite4_proc_init_net(struct net *net) 82static int __net_init udplite4_proc_init_net(struct net *net)
95{ 83{
96 return udp_proc_register(net, &udplite4_seq_afinfo); 84 if (!proc_create_net_data("udplite", 0444, net->proc_net, &udp_seq_ops,
85 sizeof(struct udp_iter_state), &udplite4_seq_afinfo))
86 return -ENOMEM;
87 return 0;
97} 88}
98 89
99static void __net_exit udplite4_proc_exit_net(struct net *net) 90static void __net_exit udplite4_proc_exit_net(struct net *net)
100{ 91{
101 udp_proc_unregister(net, &udplite4_seq_afinfo); 92 remove_proc_entry("udplite", net->proc_net);
102} 93}
103 94
104static struct pernet_operations udplite4_net_ops = { 95static struct pernet_operations udplite4_net_ops = {
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index 78cef00c9596..1b5ea3379d9b 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -4254,22 +4254,10 @@ static const struct seq_operations if6_seq_ops = {
4254 .stop = if6_seq_stop, 4254 .stop = if6_seq_stop,
4255}; 4255};
4256 4256
4257static int if6_seq_open(struct inode *inode, struct file *file)
4258{
4259 return seq_open_net(inode, file, &if6_seq_ops,
4260 sizeof(struct if6_iter_state));
4261}
4262
4263static const struct file_operations if6_fops = {
4264 .open = if6_seq_open,
4265 .read = seq_read,
4266 .llseek = seq_lseek,
4267 .release = seq_release_net,
4268};
4269
4270static int __net_init if6_proc_net_init(struct net *net) 4257static int __net_init if6_proc_net_init(struct net *net)
4271{ 4258{
4272 if (!proc_create("if_inet6", 0444, net->proc_net, &if6_fops)) 4259 if (!proc_create_net("if_inet6", 0444, net->proc_net, &if6_seq_ops,
4260 sizeof(struct if6_iter_state)))
4273 return -ENOMEM; 4261 return -ENOMEM;
4274 return 0; 4262 return 0;
4275} 4263}
diff --git a/net/ipv6/anycast.c b/net/ipv6/anycast.c
index bbcabbba9bd8..ebeaf47d5c8d 100644
--- a/net/ipv6/anycast.c
+++ b/net/ipv6/anycast.c
@@ -529,22 +529,10 @@ static const struct seq_operations ac6_seq_ops = {
529 .show = ac6_seq_show, 529 .show = ac6_seq_show,
530}; 530};
531 531
532static int ac6_seq_open(struct inode *inode, struct file *file)
533{
534 return seq_open_net(inode, file, &ac6_seq_ops,
535 sizeof(struct ac6_iter_state));
536}
537
538static const struct file_operations ac6_seq_fops = {
539 .open = ac6_seq_open,
540 .read = seq_read,
541 .llseek = seq_lseek,
542 .release = seq_release_net,
543};
544
545int __net_init ac6_proc_init(struct net *net) 532int __net_init ac6_proc_init(struct net *net)
546{ 533{
547 if (!proc_create("anycast6", 0444, net->proc_net, &ac6_seq_fops)) 534 if (!proc_create_net("anycast6", 0444, net->proc_net, &ac6_seq_ops,
535 sizeof(struct ac6_iter_state)))
548 return -ENOMEM; 536 return -ENOMEM;
549 537
550 return 0; 538 return 0;
diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c
index deab2db6692e..01372dd74e38 100644
--- a/net/ipv6/ip6_fib.c
+++ b/net/ipv6/ip6_fib.c
@@ -2209,15 +2209,6 @@ void fib6_gc_cleanup(void)
2209} 2209}
2210 2210
2211#ifdef CONFIG_PROC_FS 2211#ifdef CONFIG_PROC_FS
2212
2213struct ipv6_route_iter {
2214 struct seq_net_private p;
2215 struct fib6_walker w;
2216 loff_t skip;
2217 struct fib6_table *tbl;
2218 int sernum;
2219};
2220
2221static int ipv6_route_seq_show(struct seq_file *seq, void *v) 2212static int ipv6_route_seq_show(struct seq_file *seq, void *v)
2222{ 2213{
2223 struct rt6_info *rt = v; 2214 struct rt6_info *rt = v;
@@ -2383,17 +2374,10 @@ static void ipv6_route_seq_stop(struct seq_file *seq, void *v)
2383 rcu_read_unlock_bh(); 2374 rcu_read_unlock_bh();
2384} 2375}
2385 2376
2386static const struct seq_operations ipv6_route_seq_ops = { 2377const struct seq_operations ipv6_route_seq_ops = {
2387 .start = ipv6_route_seq_start, 2378 .start = ipv6_route_seq_start,
2388 .next = ipv6_route_seq_next, 2379 .next = ipv6_route_seq_next,
2389 .stop = ipv6_route_seq_stop, 2380 .stop = ipv6_route_seq_stop,
2390 .show = ipv6_route_seq_show 2381 .show = ipv6_route_seq_show
2391}; 2382};
2392
2393int ipv6_route_open(struct inode *inode, struct file *file)
2394{
2395 return seq_open_net(inode, file, &ipv6_route_seq_ops,
2396 sizeof(struct ipv6_route_iter));
2397}
2398
2399#endif /* CONFIG_PROC_FS */ 2383#endif /* CONFIG_PROC_FS */
diff --git a/net/ipv6/ip6_flowlabel.c b/net/ipv6/ip6_flowlabel.c
index c05c4e82a7ca..3eee7637bdfe 100644
--- a/net/ipv6/ip6_flowlabel.c
+++ b/net/ipv6/ip6_flowlabel.c
@@ -754,6 +754,10 @@ static struct ip6_flowlabel *ip6fl_get_idx(struct seq_file *seq, loff_t pos)
754static void *ip6fl_seq_start(struct seq_file *seq, loff_t *pos) 754static void *ip6fl_seq_start(struct seq_file *seq, loff_t *pos)
755 __acquires(RCU) 755 __acquires(RCU)
756{ 756{
757 struct ip6fl_iter_state *state = ip6fl_seq_private(seq);
758
759 state->pid_ns = proc_pid_ns(file_inode(seq->file));
760
757 rcu_read_lock_bh(); 761 rcu_read_lock_bh();
758 return *pos ? ip6fl_get_idx(seq, *pos - 1) : SEQ_START_TOKEN; 762 return *pos ? ip6fl_get_idx(seq, *pos - 1) : SEQ_START_TOKEN;
759} 763}
@@ -808,44 +812,10 @@ static const struct seq_operations ip6fl_seq_ops = {
808 .show = ip6fl_seq_show, 812 .show = ip6fl_seq_show,
809}; 813};
810 814
811static int ip6fl_seq_open(struct inode *inode, struct file *file)
812{
813 struct seq_file *seq;
814 struct ip6fl_iter_state *state;
815 int err;
816
817 err = seq_open_net(inode, file, &ip6fl_seq_ops,
818 sizeof(struct ip6fl_iter_state));
819
820 if (!err) {
821 seq = file->private_data;
822 state = ip6fl_seq_private(seq);
823 rcu_read_lock();
824 state->pid_ns = get_pid_ns(task_active_pid_ns(current));
825 rcu_read_unlock();
826 }
827 return err;
828}
829
830static int ip6fl_seq_release(struct inode *inode, struct file *file)
831{
832 struct seq_file *seq = file->private_data;
833 struct ip6fl_iter_state *state = ip6fl_seq_private(seq);
834 put_pid_ns(state->pid_ns);
835 return seq_release_net(inode, file);
836}
837
838static const struct file_operations ip6fl_seq_fops = {
839 .open = ip6fl_seq_open,
840 .read = seq_read,
841 .llseek = seq_lseek,
842 .release = ip6fl_seq_release,
843};
844
845static int __net_init ip6_flowlabel_proc_init(struct net *net) 815static int __net_init ip6_flowlabel_proc_init(struct net *net)
846{ 816{
847 if (!proc_create("ip6_flowlabel", 0444, net->proc_net, 817 if (!proc_create_net("ip6_flowlabel", 0444, net->proc_net,
848 &ip6fl_seq_fops)) 818 &ip6fl_seq_ops, sizeof(struct ip6fl_iter_state)))
849 return -ENOMEM; 819 return -ENOMEM;
850 return 0; 820 return 0;
851} 821}
diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c
index 298fd8b6ed17..4a15529d33eb 100644
--- a/net/ipv6/ip6mr.c
+++ b/net/ipv6/ip6mr.c
@@ -439,19 +439,6 @@ static const struct seq_operations ip6mr_vif_seq_ops = {
439 .show = ip6mr_vif_seq_show, 439 .show = ip6mr_vif_seq_show,
440}; 440};
441 441
442static int ip6mr_vif_open(struct inode *inode, struct file *file)
443{
444 return seq_open_net(inode, file, &ip6mr_vif_seq_ops,
445 sizeof(struct mr_vif_iter));
446}
447
448static const struct file_operations ip6mr_vif_fops = {
449 .open = ip6mr_vif_open,
450 .read = seq_read,
451 .llseek = seq_lseek,
452 .release = seq_release_net,
453};
454
455static void *ipmr_mfc_seq_start(struct seq_file *seq, loff_t *pos) 442static void *ipmr_mfc_seq_start(struct seq_file *seq, loff_t *pos)
456{ 443{
457 struct net *net = seq_file_net(seq); 444 struct net *net = seq_file_net(seq);
@@ -512,19 +499,6 @@ static const struct seq_operations ipmr_mfc_seq_ops = {
512 .stop = mr_mfc_seq_stop, 499 .stop = mr_mfc_seq_stop,
513 .show = ipmr_mfc_seq_show, 500 .show = ipmr_mfc_seq_show,
514}; 501};
515
516static int ipmr_mfc_open(struct inode *inode, struct file *file)
517{
518 return seq_open_net(inode, file, &ipmr_mfc_seq_ops,
519 sizeof(struct mr_mfc_iter));
520}
521
522static const struct file_operations ip6mr_mfc_fops = {
523 .open = ipmr_mfc_open,
524 .read = seq_read,
525 .llseek = seq_lseek,
526 .release = seq_release_net,
527};
528#endif 502#endif
529 503
530#ifdef CONFIG_IPV6_PIMSM_V2 504#ifdef CONFIG_IPV6_PIMSM_V2
@@ -1316,9 +1290,11 @@ static int __net_init ip6mr_net_init(struct net *net)
1316 1290
1317#ifdef CONFIG_PROC_FS 1291#ifdef CONFIG_PROC_FS
1318 err = -ENOMEM; 1292 err = -ENOMEM;
1319 if (!proc_create("ip6_mr_vif", 0, net->proc_net, &ip6mr_vif_fops)) 1293 if (!proc_create_net("ip6_mr_vif", 0, net->proc_net, &ip6mr_vif_seq_ops,
1294 sizeof(struct mr_vif_iter)))
1320 goto proc_vif_fail; 1295 goto proc_vif_fail;
1321 if (!proc_create("ip6_mr_cache", 0, net->proc_net, &ip6mr_mfc_fops)) 1296 if (!proc_create_net("ip6_mr_cache", 0, net->proc_net, &ipmr_mfc_seq_ops,
1297 sizeof(struct mr_mfc_iter)))
1322 goto proc_cache_fail; 1298 goto proc_cache_fail;
1323#endif 1299#endif
1324 1300
diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c
index 793159d77d8a..975021df7c1c 100644
--- a/net/ipv6/mcast.c
+++ b/net/ipv6/mcast.c
@@ -2749,19 +2749,6 @@ static const struct seq_operations igmp6_mc_seq_ops = {
2749 .show = igmp6_mc_seq_show, 2749 .show = igmp6_mc_seq_show,
2750}; 2750};
2751 2751
2752static int igmp6_mc_seq_open(struct inode *inode, struct file *file)
2753{
2754 return seq_open_net(inode, file, &igmp6_mc_seq_ops,
2755 sizeof(struct igmp6_mc_iter_state));
2756}
2757
2758static const struct file_operations igmp6_mc_seq_fops = {
2759 .open = igmp6_mc_seq_open,
2760 .read = seq_read,
2761 .llseek = seq_lseek,
2762 .release = seq_release_net,
2763};
2764
2765struct igmp6_mcf_iter_state { 2752struct igmp6_mcf_iter_state {
2766 struct seq_net_private p; 2753 struct seq_net_private p;
2767 struct net_device *dev; 2754 struct net_device *dev;
@@ -2903,28 +2890,17 @@ static const struct seq_operations igmp6_mcf_seq_ops = {
2903 .show = igmp6_mcf_seq_show, 2890 .show = igmp6_mcf_seq_show,
2904}; 2891};
2905 2892
2906static int igmp6_mcf_seq_open(struct inode *inode, struct file *file)
2907{
2908 return seq_open_net(inode, file, &igmp6_mcf_seq_ops,
2909 sizeof(struct igmp6_mcf_iter_state));
2910}
2911
2912static const struct file_operations igmp6_mcf_seq_fops = {
2913 .open = igmp6_mcf_seq_open,
2914 .read = seq_read,
2915 .llseek = seq_lseek,
2916 .release = seq_release_net,
2917};
2918
2919static int __net_init igmp6_proc_init(struct net *net) 2893static int __net_init igmp6_proc_init(struct net *net)
2920{ 2894{
2921 int err; 2895 int err;
2922 2896
2923 err = -ENOMEM; 2897 err = -ENOMEM;
2924 if (!proc_create("igmp6", 0444, net->proc_net, &igmp6_mc_seq_fops)) 2898 if (!proc_create_net("igmp6", 0444, net->proc_net, &igmp6_mc_seq_ops,
2899 sizeof(struct igmp6_mc_iter_state)))
2925 goto out; 2900 goto out;
2926 if (!proc_create("mcfilter6", 0444, net->proc_net, 2901 if (!proc_create_net("mcfilter6", 0444, net->proc_net,
2927 &igmp6_mcf_seq_fops)) 2902 &igmp6_mcf_seq_ops,
2903 sizeof(struct igmp6_mcf_iter_state)))
2928 goto out_proc_net_igmp6; 2904 goto out_proc_net_igmp6;
2929 2905
2930 err = 0; 2906 err = 0;
diff --git a/net/ipv6/ping.c b/net/ipv6/ping.c
index 746eeae7f581..96f56bf49a30 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,24 @@ 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 .show = ping_v6_seq_show,
225 .next = ping_seq_next,
226 .stop = ping_seq_stop,
227 },
228}; 224};
229 225
230static int __net_init ping_v6_proc_init_net(struct net *net) 226static int __net_init ping_v6_proc_init_net(struct net *net)
231{ 227{
232 return ping_proc_register(net, &ping_v6_seq_afinfo); 228 if (!proc_create_net("icmp6", 0444, net->proc_net, &ping_v6_seq_ops,
229 sizeof(struct ping_iter_state)))
230 return -ENOMEM;
231 return 0;
233} 232}
234 233
235static void __net_init ping_v6_proc_exit_net(struct net *net) 234static void __net_init ping_v6_proc_exit_net(struct net *net)
236{ 235{
237 return ping_proc_unregister(net, &ping_v6_seq_afinfo); 236 remove_proc_entry("icmp6", net->proc_net);
238} 237}
239 238
240static struct pernet_operations ping_v6_net_ops = { 239static struct pernet_operations ping_v6_net_ops = {
diff --git a/net/ipv6/proc.c b/net/ipv6/proc.c
index a85f7e0b14b1..2356b4af7309 100644
--- a/net/ipv6/proc.c
+++ b/net/ipv6/proc.c
@@ -53,18 +53,6 @@ static int sockstat6_seq_show(struct seq_file *seq, void *v)
53 return 0; 53 return 0;
54} 54}
55 55
56static int sockstat6_seq_open(struct inode *inode, struct file *file)
57{
58 return single_open_net(inode, file, sockstat6_seq_show);
59}
60
61static const struct file_operations sockstat6_seq_fops = {
62 .open = sockstat6_seq_open,
63 .read = seq_read,
64 .llseek = seq_lseek,
65 .release = single_release_net,
66};
67
68static const struct snmp_mib snmp6_ipstats_list[] = { 56static const struct snmp_mib snmp6_ipstats_list[] = {
69/* ipv6 mib according to RFC 2465 */ 57/* ipv6 mib according to RFC 2465 */
70 SNMP_MIB_ITEM("Ip6InReceives", IPSTATS_MIB_INPKTS), 58 SNMP_MIB_ITEM("Ip6InReceives", IPSTATS_MIB_INPKTS),
@@ -242,18 +230,6 @@ static int snmp6_seq_show(struct seq_file *seq, void *v)
242 return 0; 230 return 0;
243} 231}
244 232
245static int snmp6_seq_open(struct inode *inode, struct file *file)
246{
247 return single_open_net(inode, file, snmp6_seq_show);
248}
249
250static const struct file_operations snmp6_seq_fops = {
251 .open = snmp6_seq_open,
252 .read = seq_read,
253 .llseek = seq_lseek,
254 .release = single_release_net,
255};
256
257static int snmp6_dev_seq_show(struct seq_file *seq, void *v) 233static int snmp6_dev_seq_show(struct seq_file *seq, void *v)
258{ 234{
259 struct inet6_dev *idev = (struct inet6_dev *)seq->private; 235 struct inet6_dev *idev = (struct inet6_dev *)seq->private;
@@ -267,18 +243,6 @@ static int snmp6_dev_seq_show(struct seq_file *seq, void *v)
267 return 0; 243 return 0;
268} 244}
269 245
270static int snmp6_dev_seq_open(struct inode *inode, struct file *file)
271{
272 return single_open(file, snmp6_dev_seq_show, PDE_DATA(inode));
273}
274
275static const struct file_operations snmp6_dev_seq_fops = {
276 .open = snmp6_dev_seq_open,
277 .read = seq_read,
278 .llseek = seq_lseek,
279 .release = single_release,
280};
281
282int snmp6_register_dev(struct inet6_dev *idev) 246int snmp6_register_dev(struct inet6_dev *idev)
283{ 247{
284 struct proc_dir_entry *p; 248 struct proc_dir_entry *p;
@@ -291,9 +255,8 @@ int snmp6_register_dev(struct inet6_dev *idev)
291 if (!net->mib.proc_net_devsnmp6) 255 if (!net->mib.proc_net_devsnmp6)
292 return -ENOENT; 256 return -ENOENT;
293 257
294 p = proc_create_data(idev->dev->name, 0444, 258 p = proc_create_single_data(idev->dev->name, 0444,
295 net->mib.proc_net_devsnmp6, 259 net->mib.proc_net_devsnmp6, snmp6_dev_seq_show, idev);
296 &snmp6_dev_seq_fops, idev);
297 if (!p) 260 if (!p)
298 return -ENOMEM; 261 return -ENOMEM;
299 262
@@ -315,11 +278,12 @@ int snmp6_unregister_dev(struct inet6_dev *idev)
315 278
316static int __net_init ipv6_proc_init_net(struct net *net) 279static int __net_init ipv6_proc_init_net(struct net *net)
317{ 280{
318 if (!proc_create("sockstat6", 0444, net->proc_net, 281 if (!proc_create_net_single("sockstat6", 0444, net->proc_net,
319 &sockstat6_seq_fops)) 282 sockstat6_seq_show, NULL))
320 return -ENOMEM; 283 return -ENOMEM;
321 284
322 if (!proc_create("snmp6", 0444, net->proc_net, &snmp6_seq_fops)) 285 if (!proc_create_net_single("snmp6", 0444, net->proc_net,
286 snmp6_seq_show, NULL))
323 goto proc_snmp6_fail; 287 goto proc_snmp6_fail;
324 288
325 net->mib.proc_net_devsnmp6 = proc_mkdir("dev_snmp6", net->proc_net); 289 net->mib.proc_net_devsnmp6 = proc_mkdir("dev_snmp6", net->proc_net);
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c
index 5eb9b08947ed..afc307c89d1a 100644
--- a/net/ipv6/raw.c
+++ b/net/ipv6/raw.c
@@ -1304,21 +1304,10 @@ static const struct seq_operations raw6_seq_ops = {
1304 .show = raw6_seq_show, 1304 .show = raw6_seq_show,
1305}; 1305};
1306 1306
1307static int raw6_seq_open(struct inode *inode, struct file *file)
1308{
1309 return raw_seq_open(inode, file, &raw_v6_hashinfo, &raw6_seq_ops);
1310}
1311
1312static const struct file_operations raw6_seq_fops = {
1313 .open = raw6_seq_open,
1314 .read = seq_read,
1315 .llseek = seq_lseek,
1316 .release = seq_release_net,
1317};
1318
1319static int __net_init raw6_init_net(struct net *net) 1307static int __net_init raw6_init_net(struct net *net)
1320{ 1308{
1321 if (!proc_create("raw6", 0444, net->proc_net, &raw6_seq_fops)) 1309 if (!proc_create_net_data("raw6", 0444, net->proc_net, &raw6_seq_ops,
1310 sizeof(struct raw_iter_state), &raw_v6_hashinfo))
1322 return -ENOMEM; 1311 return -ENOMEM;
1323 1312
1324 return 0; 1313 return 0;
diff --git a/net/ipv6/route.c b/net/ipv6/route.c
index f4d61736c41a..a6598762d2c1 100644
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c
@@ -4862,14 +4862,6 @@ static int ip6_route_dev_notify(struct notifier_block *this,
4862 */ 4862 */
4863 4863
4864#ifdef CONFIG_PROC_FS 4864#ifdef CONFIG_PROC_FS
4865
4866static const struct file_operations ipv6_route_proc_fops = {
4867 .open = ipv6_route_open,
4868 .read = seq_read,
4869 .llseek = seq_lseek,
4870 .release = seq_release_net,
4871};
4872
4873static int rt6_stats_seq_show(struct seq_file *seq, void *v) 4865static int rt6_stats_seq_show(struct seq_file *seq, void *v)
4874{ 4866{
4875 struct net *net = (struct net *)seq->private; 4867 struct net *net = (struct net *)seq->private;
@@ -4884,18 +4876,6 @@ static int rt6_stats_seq_show(struct seq_file *seq, void *v)
4884 4876
4885 return 0; 4877 return 0;
4886} 4878}
4887
4888static int rt6_stats_seq_open(struct inode *inode, struct file *file)
4889{
4890 return single_open_net(inode, file, rt6_stats_seq_show);
4891}
4892
4893static const struct file_operations rt6_stats_seq_fops = {
4894 .open = rt6_stats_seq_open,
4895 .read = seq_read,
4896 .llseek = seq_lseek,
4897 .release = single_release_net,
4898};
4899#endif /* CONFIG_PROC_FS */ 4879#endif /* CONFIG_PROC_FS */
4900 4880
4901#ifdef CONFIG_SYSCTL 4881#ifdef CONFIG_SYSCTL
@@ -5100,8 +5080,10 @@ static void __net_exit ip6_route_net_exit(struct net *net)
5100static int __net_init ip6_route_net_init_late(struct net *net) 5080static int __net_init ip6_route_net_init_late(struct net *net)
5101{ 5081{
5102#ifdef CONFIG_PROC_FS 5082#ifdef CONFIG_PROC_FS
5103 proc_create("ipv6_route", 0, net->proc_net, &ipv6_route_proc_fops); 5083 proc_create_net("ipv6_route", 0, net->proc_net, &ipv6_route_seq_ops,
5104 proc_create("rt6_stats", 0444, net->proc_net, &rt6_stats_seq_fops); 5084 sizeof(struct ipv6_route_iter));
5085 proc_create_net_single("rt6_stats", 0444, net->proc_net,
5086 rt6_stats_seq_show, NULL);
5105#endif 5087#endif
5106 return 0; 5088 return 0;
5107} 5089}
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
index 6d664d83cd16..d2ce66b23430 100644
--- a/net/ipv6/tcp_ipv6.c
+++ b/net/ipv6/tcp_ipv6.c
@@ -1909,30 +1909,28 @@ out:
1909 return 0; 1909 return 0;
1910} 1910}
1911 1911
1912static const struct file_operations tcp6_afinfo_seq_fops = { 1912static const struct seq_operations tcp6_seq_ops = {
1913 .open = tcp_seq_open, 1913 .show = tcp6_seq_show,
1914 .read = seq_read, 1914 .start = tcp_seq_start,
1915 .llseek = seq_lseek, 1915 .next = tcp_seq_next,
1916 .release = seq_release_net 1916 .stop = tcp_seq_stop,
1917}; 1917};
1918 1918
1919static struct tcp_seq_afinfo tcp6_seq_afinfo = { 1919static struct tcp_seq_afinfo tcp6_seq_afinfo = {
1920 .name = "tcp6",
1921 .family = AF_INET6, 1920 .family = AF_INET6,
1922 .seq_fops = &tcp6_afinfo_seq_fops,
1923 .seq_ops = {
1924 .show = tcp6_seq_show,
1925 },
1926}; 1921};
1927 1922
1928int __net_init tcp6_proc_init(struct net *net) 1923int __net_init tcp6_proc_init(struct net *net)
1929{ 1924{
1930 return tcp_proc_register(net, &tcp6_seq_afinfo); 1925 if (!proc_create_net_data("tcp6", 0444, net->proc_net, &tcp6_seq_ops,
1926 sizeof(struct tcp_iter_state), &tcp6_seq_afinfo))
1927 return -ENOMEM;
1928 return 0;
1931} 1929}
1932 1930
1933void tcp6_proc_exit(struct net *net) 1931void tcp6_proc_exit(struct net *net)
1934{ 1932{
1935 tcp_proc_unregister(net, &tcp6_seq_afinfo); 1933 remove_proc_entry("tcp6", net->proc_net);
1936} 1934}
1937#endif 1935#endif
1938 1936
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
index ea0730028e5d..00e2112da26d 100644
--- a/net/ipv6/udp.c
+++ b/net/ipv6/udp.c
@@ -1480,31 +1480,30 @@ int udp6_seq_show(struct seq_file *seq, void *v)
1480 return 0; 1480 return 0;
1481} 1481}
1482 1482
1483static const struct file_operations udp6_afinfo_seq_fops = { 1483const struct seq_operations udp6_seq_ops = {
1484 .open = udp_seq_open, 1484 .start = udp_seq_start,
1485 .read = seq_read, 1485 .next = udp_seq_next,
1486 .llseek = seq_lseek, 1486 .stop = udp_seq_stop,
1487 .release = seq_release_net 1487 .show = udp6_seq_show,
1488}; 1488};
1489EXPORT_SYMBOL(udp6_seq_ops);
1489 1490
1490static struct udp_seq_afinfo udp6_seq_afinfo = { 1491static struct udp_seq_afinfo udp6_seq_afinfo = {
1491 .name = "udp6",
1492 .family = AF_INET6, 1492 .family = AF_INET6,
1493 .udp_table = &udp_table, 1493 .udp_table = &udp_table,
1494 .seq_fops = &udp6_afinfo_seq_fops,
1495 .seq_ops = {
1496 .show = udp6_seq_show,
1497 },
1498}; 1494};
1499 1495
1500int __net_init udp6_proc_init(struct net *net) 1496int __net_init udp6_proc_init(struct net *net)
1501{ 1497{
1502 return udp_proc_register(net, &udp6_seq_afinfo); 1498 if (!proc_create_net_data("udp6", 0444, net->proc_net, &udp6_seq_ops,
1499 sizeof(struct udp_iter_state), &udp6_seq_afinfo))
1500 return -ENOMEM;
1501 return 0;
1503} 1502}
1504 1503
1505void udp6_proc_exit(struct net *net) 1504void udp6_proc_exit(struct net *net)
1506{ 1505{
1507 udp_proc_unregister(net, &udp6_seq_afinfo); 1506 remove_proc_entry("udp6", net->proc_net);
1508} 1507}
1509#endif /* CONFIG_PROC_FS */ 1508#endif /* CONFIG_PROC_FS */
1510 1509
diff --git a/net/ipv6/udplite.c b/net/ipv6/udplite.c
index 14ae32bb1f3d..5000ad6878e6 100644
--- a/net/ipv6/udplite.c
+++ b/net/ipv6/udplite.c
@@ -12,6 +12,7 @@
12 * 2 of the License, or (at your option) any later version. 12 * 2 of the License, or (at your option) any later version.
13 */ 13 */
14#include <linux/export.h> 14#include <linux/export.h>
15#include <linux/proc_fs.h>
15#include "udp_impl.h" 16#include "udp_impl.h"
16 17
17static int udplitev6_rcv(struct sk_buff *skb) 18static int udplitev6_rcv(struct sk_buff *skb)
@@ -92,32 +93,23 @@ void udplitev6_exit(void)
92} 93}
93 94
94#ifdef CONFIG_PROC_FS 95#ifdef CONFIG_PROC_FS
95
96static const struct file_operations udplite6_afinfo_seq_fops = {
97 .open = udp_seq_open,
98 .read = seq_read,
99 .llseek = seq_lseek,
100 .release = seq_release_net
101};
102
103static struct udp_seq_afinfo udplite6_seq_afinfo = { 96static struct udp_seq_afinfo udplite6_seq_afinfo = {
104 .name = "udplite6",
105 .family = AF_INET6, 97 .family = AF_INET6,
106 .udp_table = &udplite_table, 98 .udp_table = &udplite_table,
107 .seq_fops = &udplite6_afinfo_seq_fops,
108 .seq_ops = {
109 .show = udp6_seq_show,
110 },
111}; 99};
112 100
113static int __net_init udplite6_proc_init_net(struct net *net) 101static int __net_init udplite6_proc_init_net(struct net *net)
114{ 102{
115 return udp_proc_register(net, &udplite6_seq_afinfo); 103 if (!proc_create_net_data("udplite6", 0444, net->proc_net,
104 &udp6_seq_ops, sizeof(struct udp_iter_state),
105 &udplite6_seq_afinfo))
106 return -ENOMEM;
107 return 0;
116} 108}
117 109
118static void __net_exit udplite6_proc_exit_net(struct net *net) 110static void __net_exit udplite6_proc_exit_net(struct net *net)
119{ 111{
120 udp_proc_unregister(net, &udplite6_seq_afinfo); 112 remove_proc_entry("udplite6", net->proc_net);
121} 113}
122 114
123static struct pernet_operations udplite6_net_ops = { 115static struct pernet_operations udplite6_net_ops = {
diff --git a/net/kcm/kcmproc.c b/net/kcm/kcmproc.c
index 1fac92543094..370da2f80e3c 100644
--- a/net/kcm/kcmproc.c
+++ b/net/kcm/kcmproc.c
@@ -15,12 +15,6 @@
15#include <net/tcp.h> 15#include <net/tcp.h>
16 16
17#ifdef CONFIG_PROC_FS 17#ifdef CONFIG_PROC_FS
18struct kcm_seq_muxinfo {
19 char *name;
20 const struct file_operations *seq_fops;
21 const struct seq_operations seq_ops;
22};
23
24static struct kcm_mux *kcm_get_first(struct seq_file *seq) 18static struct kcm_mux *kcm_get_first(struct seq_file *seq)
25{ 19{
26 struct net *net = seq_file_net(seq); 20 struct net *net = seq_file_net(seq);
@@ -86,14 +80,6 @@ struct kcm_proc_mux_state {
86 int idx; 80 int idx;
87}; 81};
88 82
89static int kcm_seq_open(struct inode *inode, struct file *file)
90{
91 struct kcm_seq_muxinfo *muxinfo = PDE_DATA(inode);
92
93 return seq_open_net(inode, file, &muxinfo->seq_ops,
94 sizeof(struct kcm_proc_mux_state));
95}
96
97static void kcm_format_mux_header(struct seq_file *seq) 83static void kcm_format_mux_header(struct seq_file *seq)
98{ 84{
99 struct net *net = seq_file_net(seq); 85 struct net *net = seq_file_net(seq);
@@ -246,44 +232,13 @@ static int kcm_seq_show(struct seq_file *seq, void *v)
246 return 0; 232 return 0;
247} 233}
248 234
249static const struct file_operations kcm_seq_fops = { 235static const struct seq_operations kcm_seq_ops = {
250 .open = kcm_seq_open, 236 .show = kcm_seq_show,
251 .read = seq_read, 237 .start = kcm_seq_start,
252 .llseek = seq_lseek, 238 .next = kcm_seq_next,
253 .release = seq_release_net, 239 .stop = kcm_seq_stop,
254}; 240};
255 241
256static struct kcm_seq_muxinfo kcm_seq_muxinfo = {
257 .name = "kcm",
258 .seq_fops = &kcm_seq_fops,
259 .seq_ops = {
260 .show = kcm_seq_show,
261 .start = kcm_seq_start,
262 .next = kcm_seq_next,
263 .stop = kcm_seq_stop,
264 }
265};
266
267static int kcm_proc_register(struct net *net, struct kcm_seq_muxinfo *muxinfo)
268{
269 struct proc_dir_entry *p;
270 int rc = 0;
271
272 p = proc_create_data(muxinfo->name, 0444, net->proc_net,
273 muxinfo->seq_fops, muxinfo);
274 if (!p)
275 rc = -ENOMEM;
276 return rc;
277}
278EXPORT_SYMBOL(kcm_proc_register);
279
280static void kcm_proc_unregister(struct net *net,
281 struct kcm_seq_muxinfo *muxinfo)
282{
283 remove_proc_entry(muxinfo->name, net->proc_net);
284}
285EXPORT_SYMBOL(kcm_proc_unregister);
286
287static int kcm_stats_seq_show(struct seq_file *seq, void *v) 242static int kcm_stats_seq_show(struct seq_file *seq, void *v)
288{ 243{
289 struct kcm_psock_stats psock_stats; 244 struct kcm_psock_stats psock_stats;
@@ -390,30 +345,14 @@ static int kcm_stats_seq_show(struct seq_file *seq, void *v)
390 return 0; 345 return 0;
391} 346}
392 347
393static int kcm_stats_seq_open(struct inode *inode, struct file *file)
394{
395 return single_open_net(inode, file, kcm_stats_seq_show);
396}
397
398static const struct file_operations kcm_stats_seq_fops = {
399 .open = kcm_stats_seq_open,
400 .read = seq_read,
401 .llseek = seq_lseek,
402 .release = single_release_net,
403};
404
405static int kcm_proc_init_net(struct net *net) 348static int kcm_proc_init_net(struct net *net)
406{ 349{
407 int err; 350 if (!proc_create_net_single("kcm_stats", 0444, net->proc_net,
408 351 kcm_stats_seq_show, NULL))
409 if (!proc_create("kcm_stats", 0444, net->proc_net,
410 &kcm_stats_seq_fops)) {
411 err = -ENOMEM;
412 goto out_kcm_stats; 352 goto out_kcm_stats;
413 }
414 353
415 err = kcm_proc_register(net, &kcm_seq_muxinfo); 354 if (!proc_create_net("kcm", 0444, net->proc_net, &kcm_seq_ops,
416 if (err) 355 sizeof(struct kcm_proc_mux_state)))
417 goto out_kcm; 356 goto out_kcm;
418 357
419 return 0; 358 return 0;
@@ -421,12 +360,12 @@ static int kcm_proc_init_net(struct net *net)
421out_kcm: 360out_kcm:
422 remove_proc_entry("kcm_stats", net->proc_net); 361 remove_proc_entry("kcm_stats", net->proc_net);
423out_kcm_stats: 362out_kcm_stats:
424 return err; 363 return -ENOMEM;
425} 364}
426 365
427static void kcm_proc_exit_net(struct net *net) 366static void kcm_proc_exit_net(struct net *net)
428{ 367{
429 kcm_proc_unregister(net, &kcm_seq_muxinfo); 368 remove_proc_entry("kcm", net->proc_net);
430 remove_proc_entry("kcm_stats", net->proc_net); 369 remove_proc_entry("kcm_stats", net->proc_net);
431} 370}
432 371
diff --git a/net/key/af_key.c b/net/key/af_key.c
index e62e52e8f141..5e1d2946ffbf 100644
--- a/net/key/af_key.c
+++ b/net/key/af_key.c
@@ -3812,24 +3812,12 @@ static const struct seq_operations pfkey_seq_ops = {
3812 .show = pfkey_seq_show, 3812 .show = pfkey_seq_show,
3813}; 3813};
3814 3814
3815static int pfkey_seq_open(struct inode *inode, struct file *file)
3816{
3817 return seq_open_net(inode, file, &pfkey_seq_ops,
3818 sizeof(struct seq_net_private));
3819}
3820
3821static const struct file_operations pfkey_proc_ops = {
3822 .open = pfkey_seq_open,
3823 .read = seq_read,
3824 .llseek = seq_lseek,
3825 .release = seq_release_net,
3826};
3827
3828static int __net_init pfkey_init_proc(struct net *net) 3815static int __net_init pfkey_init_proc(struct net *net)
3829{ 3816{
3830 struct proc_dir_entry *e; 3817 struct proc_dir_entry *e;
3831 3818
3832 e = proc_create("pfkey", 0, net->proc_net, &pfkey_proc_ops); 3819 e = proc_create_net("pfkey", 0, net->proc_net, &pfkey_seq_ops,
3820 sizeof(struct seq_net_private));
3833 if (e == NULL) 3821 if (e == NULL)
3834 return -ENOMEM; 3822 return -ENOMEM;
3835 3823
diff --git a/net/l2tp/l2tp_ppp.c b/net/l2tp/l2tp_ppp.c
index 1fd9e145076a..830469766c1f 100644
--- a/net/l2tp/l2tp_ppp.c
+++ b/net/l2tp/l2tp_ppp.c
@@ -1742,24 +1742,6 @@ static const struct seq_operations pppol2tp_seq_ops = {
1742 .stop = pppol2tp_seq_stop, 1742 .stop = pppol2tp_seq_stop,
1743 .show = pppol2tp_seq_show, 1743 .show = pppol2tp_seq_show,
1744}; 1744};
1745
1746/* Called when our /proc file is opened. We allocate data for use when
1747 * iterating our tunnel / session contexts and store it in the private
1748 * data of the seq_file.
1749 */
1750static int pppol2tp_proc_open(struct inode *inode, struct file *file)
1751{
1752 return seq_open_net(inode, file, &pppol2tp_seq_ops,
1753 sizeof(struct pppol2tp_seq_data));
1754}
1755
1756static const struct file_operations pppol2tp_proc_fops = {
1757 .open = pppol2tp_proc_open,
1758 .read = seq_read,
1759 .llseek = seq_lseek,
1760 .release = seq_release_net,
1761};
1762
1763#endif /* CONFIG_PROC_FS */ 1745#endif /* CONFIG_PROC_FS */
1764 1746
1765/***************************************************************************** 1747/*****************************************************************************
@@ -1771,8 +1753,8 @@ static __net_init int pppol2tp_init_net(struct net *net)
1771 struct proc_dir_entry *pde; 1753 struct proc_dir_entry *pde;
1772 int err = 0; 1754 int err = 0;
1773 1755
1774 pde = proc_create("pppol2tp", 0444, net->proc_net, 1756 pde = proc_create_net("pppol2tp", 0444, net->proc_net,
1775 &pppol2tp_proc_fops); 1757 &pppol2tp_seq_ops, sizeof(struct pppol2tp_seq_data));
1776 if (!pde) { 1758 if (!pde) {
1777 err = -ENOMEM; 1759 err = -ENOMEM;
1778 goto out; 1760 goto out;
diff --git a/net/llc/llc_proc.c b/net/llc/llc_proc.c
index 62ea0aed94b4..f3a36c16a5e7 100644
--- a/net/llc/llc_proc.c
+++ b/net/llc/llc_proc.c
@@ -214,30 +214,6 @@ static const struct seq_operations llc_seq_core_ops = {
214 .show = llc_seq_core_show, 214 .show = llc_seq_core_show,
215}; 215};
216 216
217static int llc_seq_socket_open(struct inode *inode, struct file *file)
218{
219 return seq_open(file, &llc_seq_socket_ops);
220}
221
222static int llc_seq_core_open(struct inode *inode, struct file *file)
223{
224 return seq_open(file, &llc_seq_core_ops);
225}
226
227static const struct file_operations llc_seq_socket_fops = {
228 .open = llc_seq_socket_open,
229 .read = seq_read,
230 .llseek = seq_lseek,
231 .release = seq_release,
232};
233
234static const struct file_operations llc_seq_core_fops = {
235 .open = llc_seq_core_open,
236 .read = seq_read,
237 .llseek = seq_lseek,
238 .release = seq_release,
239};
240
241static struct proc_dir_entry *llc_proc_dir; 217static struct proc_dir_entry *llc_proc_dir;
242 218
243int __init llc_proc_init(void) 219int __init llc_proc_init(void)
@@ -249,11 +225,11 @@ int __init llc_proc_init(void)
249 if (!llc_proc_dir) 225 if (!llc_proc_dir)
250 goto out; 226 goto out;
251 227
252 p = proc_create("socket", 0444, llc_proc_dir, &llc_seq_socket_fops); 228 p = proc_create_seq("socket", 0444, llc_proc_dir, &llc_seq_socket_ops);
253 if (!p) 229 if (!p)
254 goto out_socket; 230 goto out_socket;
255 231
256 p = proc_create("core", 0444, llc_proc_dir, &llc_seq_core_fops); 232 p = proc_create_seq("core", 0444, llc_proc_dir, &llc_seq_core_ops);
257 if (!p) 233 if (!p)
258 goto out_core; 234 goto out_core;
259 235
diff --git a/net/netfilter/ipvs/ip_vs_app.c b/net/netfilter/ipvs/ip_vs_app.c
index 1c98c907bc63..c3db074fc1f7 100644
--- a/net/netfilter/ipvs/ip_vs_app.c
+++ b/net/netfilter/ipvs/ip_vs_app.c
@@ -587,25 +587,13 @@ static const struct seq_operations ip_vs_app_seq_ops = {
587 .stop = ip_vs_app_seq_stop, 587 .stop = ip_vs_app_seq_stop,
588 .show = ip_vs_app_seq_show, 588 .show = ip_vs_app_seq_show,
589}; 589};
590
591static int ip_vs_app_open(struct inode *inode, struct file *file)
592{
593 return seq_open_net(inode, file, &ip_vs_app_seq_ops,
594 sizeof(struct seq_net_private));
595}
596
597static const struct file_operations ip_vs_app_fops = {
598 .open = ip_vs_app_open,
599 .read = seq_read,
600 .llseek = seq_lseek,
601 .release = seq_release_net,
602};
603#endif 590#endif
604 591
605int __net_init ip_vs_app_net_init(struct netns_ipvs *ipvs) 592int __net_init ip_vs_app_net_init(struct netns_ipvs *ipvs)
606{ 593{
607 INIT_LIST_HEAD(&ipvs->app_list); 594 INIT_LIST_HEAD(&ipvs->app_list);
608 proc_create("ip_vs_app", 0, ipvs->net->proc_net, &ip_vs_app_fops); 595 proc_create_net("ip_vs_app", 0, ipvs->net->proc_net, &ip_vs_app_seq_ops,
596 sizeof(struct seq_net_private));
609 return 0; 597 return 0;
610} 598}
611 599
diff --git a/net/netfilter/ipvs/ip_vs_conn.c b/net/netfilter/ipvs/ip_vs_conn.c
index 75de46576f51..61c3a389da89 100644
--- a/net/netfilter/ipvs/ip_vs_conn.c
+++ b/net/netfilter/ipvs/ip_vs_conn.c
@@ -1131,19 +1131,6 @@ static const struct seq_operations ip_vs_conn_seq_ops = {
1131 .show = ip_vs_conn_seq_show, 1131 .show = ip_vs_conn_seq_show,
1132}; 1132};
1133 1133
1134static int ip_vs_conn_open(struct inode *inode, struct file *file)
1135{
1136 return seq_open_net(inode, file, &ip_vs_conn_seq_ops,
1137 sizeof(struct ip_vs_iter_state));
1138}
1139
1140static const struct file_operations ip_vs_conn_fops = {
1141 .open = ip_vs_conn_open,
1142 .read = seq_read,
1143 .llseek = seq_lseek,
1144 .release = seq_release_net,
1145};
1146
1147static const char *ip_vs_origin_name(unsigned int flags) 1134static const char *ip_vs_origin_name(unsigned int flags)
1148{ 1135{
1149 if (flags & IP_VS_CONN_F_SYNC) 1136 if (flags & IP_VS_CONN_F_SYNC)
@@ -1207,20 +1194,6 @@ static const struct seq_operations ip_vs_conn_sync_seq_ops = {
1207 .stop = ip_vs_conn_seq_stop, 1194 .stop = ip_vs_conn_seq_stop,
1208 .show = ip_vs_conn_sync_seq_show, 1195 .show = ip_vs_conn_sync_seq_show,
1209}; 1196};
1210
1211static int ip_vs_conn_sync_open(struct inode *inode, struct file *file)
1212{
1213 return seq_open_net(inode, file, &ip_vs_conn_sync_seq_ops,
1214 sizeof(struct ip_vs_iter_state));
1215}
1216
1217static const struct file_operations ip_vs_conn_sync_fops = {
1218 .open = ip_vs_conn_sync_open,
1219 .read = seq_read,
1220 .llseek = seq_lseek,
1221 .release = seq_release_net,
1222};
1223
1224#endif 1197#endif
1225 1198
1226 1199
@@ -1380,9 +1353,11 @@ int __net_init ip_vs_conn_net_init(struct netns_ipvs *ipvs)
1380{ 1353{
1381 atomic_set(&ipvs->conn_count, 0); 1354 atomic_set(&ipvs->conn_count, 0);
1382 1355
1383 proc_create("ip_vs_conn", 0, ipvs->net->proc_net, &ip_vs_conn_fops); 1356 proc_create_net("ip_vs_conn", 0, ipvs->net->proc_net,
1384 proc_create("ip_vs_conn_sync", 0, ipvs->net->proc_net, 1357 &ip_vs_conn_seq_ops, sizeof(struct ip_vs_iter_state));
1385 &ip_vs_conn_sync_fops); 1358 proc_create_net("ip_vs_conn_sync", 0, ipvs->net->proc_net,
1359 &ip_vs_conn_sync_seq_ops,
1360 sizeof(struct ip_vs_iter_state));
1386 return 0; 1361 return 0;
1387} 1362}
1388 1363
diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c
index 3ecca0616d8c..141b1509c948 100644
--- a/net/netfilter/ipvs/ip_vs_ctl.c
+++ b/net/netfilter/ipvs/ip_vs_ctl.c
@@ -2109,19 +2109,6 @@ static const struct seq_operations ip_vs_info_seq_ops = {
2109 .show = ip_vs_info_seq_show, 2109 .show = ip_vs_info_seq_show,
2110}; 2110};
2111 2111
2112static int ip_vs_info_open(struct inode *inode, struct file *file)
2113{
2114 return seq_open_net(inode, file, &ip_vs_info_seq_ops,
2115 sizeof(struct ip_vs_iter));
2116}
2117
2118static const struct file_operations ip_vs_info_fops = {
2119 .open = ip_vs_info_open,
2120 .read = seq_read,
2121 .llseek = seq_lseek,
2122 .release = seq_release_net,
2123};
2124
2125static int ip_vs_stats_show(struct seq_file *seq, void *v) 2112static int ip_vs_stats_show(struct seq_file *seq, void *v)
2126{ 2113{
2127 struct net *net = seq_file_single_net(seq); 2114 struct net *net = seq_file_single_net(seq);
@@ -2154,18 +2141,6 @@ static int ip_vs_stats_show(struct seq_file *seq, void *v)
2154 return 0; 2141 return 0;
2155} 2142}
2156 2143
2157static int ip_vs_stats_seq_open(struct inode *inode, struct file *file)
2158{
2159 return single_open_net(inode, file, ip_vs_stats_show);
2160}
2161
2162static const struct file_operations ip_vs_stats_fops = {
2163 .open = ip_vs_stats_seq_open,
2164 .read = seq_read,
2165 .llseek = seq_lseek,
2166 .release = single_release_net,
2167};
2168
2169static int ip_vs_stats_percpu_show(struct seq_file *seq, void *v) 2144static int ip_vs_stats_percpu_show(struct seq_file *seq, void *v)
2170{ 2145{
2171 struct net *net = seq_file_single_net(seq); 2146 struct net *net = seq_file_single_net(seq);
@@ -2221,18 +2196,6 @@ static int ip_vs_stats_percpu_show(struct seq_file *seq, void *v)
2221 2196
2222 return 0; 2197 return 0;
2223} 2198}
2224
2225static int ip_vs_stats_percpu_seq_open(struct inode *inode, struct file *file)
2226{
2227 return single_open_net(inode, file, ip_vs_stats_percpu_show);
2228}
2229
2230static const struct file_operations ip_vs_stats_percpu_fops = {
2231 .open = ip_vs_stats_percpu_seq_open,
2232 .read = seq_read,
2233 .llseek = seq_lseek,
2234 .release = single_release_net,
2235};
2236#endif 2199#endif
2237 2200
2238/* 2201/*
@@ -4039,10 +4002,12 @@ int __net_init ip_vs_control_net_init(struct netns_ipvs *ipvs)
4039 4002
4040 spin_lock_init(&ipvs->tot_stats.lock); 4003 spin_lock_init(&ipvs->tot_stats.lock);
4041 4004
4042 proc_create("ip_vs", 0, ipvs->net->proc_net, &ip_vs_info_fops); 4005 proc_create_net("ip_vs", 0, ipvs->net->proc_net, &ip_vs_info_seq_ops,
4043 proc_create("ip_vs_stats", 0, ipvs->net->proc_net, &ip_vs_stats_fops); 4006 sizeof(struct ip_vs_iter));
4044 proc_create("ip_vs_stats_percpu", 0, ipvs->net->proc_net, 4007 proc_create_net_single("ip_vs_stats", 0, ipvs->net->proc_net,
4045 &ip_vs_stats_percpu_fops); 4008 ip_vs_stats_show, NULL);
4009 proc_create_net_single("ip_vs_stats_percpu", 0, ipvs->net->proc_net,
4010 ip_vs_stats_percpu_show, NULL);
4046 4011
4047 if (ip_vs_control_net_init_sysctl(ipvs)) 4012 if (ip_vs_control_net_init_sysctl(ipvs))
4048 goto err; 4013 goto err;
diff --git a/net/netfilter/nf_conntrack_expect.c b/net/netfilter/nf_conntrack_expect.c
index 4b2b3d53acfc..853b23206bb7 100644
--- a/net/netfilter/nf_conntrack_expect.c
+++ b/net/netfilter/nf_conntrack_expect.c
@@ -644,19 +644,6 @@ static const struct seq_operations exp_seq_ops = {
644 .stop = exp_seq_stop, 644 .stop = exp_seq_stop,
645 .show = exp_seq_show 645 .show = exp_seq_show
646}; 646};
647
648static int exp_open(struct inode *inode, struct file *file)
649{
650 return seq_open_net(inode, file, &exp_seq_ops,
651 sizeof(struct ct_expect_iter_state));
652}
653
654static const struct file_operations exp_file_ops = {
655 .open = exp_open,
656 .read = seq_read,
657 .llseek = seq_lseek,
658 .release = seq_release_net,
659};
660#endif /* CONFIG_NF_CONNTRACK_PROCFS */ 647#endif /* CONFIG_NF_CONNTRACK_PROCFS */
661 648
662static int exp_proc_init(struct net *net) 649static int exp_proc_init(struct net *net)
@@ -666,8 +653,8 @@ static int exp_proc_init(struct net *net)
666 kuid_t root_uid; 653 kuid_t root_uid;
667 kgid_t root_gid; 654 kgid_t root_gid;
668 655
669 proc = proc_create("nf_conntrack_expect", 0440, net->proc_net, 656 proc = proc_create_net("nf_conntrack_expect", 0440, net->proc_net,
670 &exp_file_ops); 657 &exp_seq_ops, sizeof(struct ct_expect_iter_state));
671 if (!proc) 658 if (!proc)
672 return -ENOMEM; 659 return -ENOMEM;
673 660
diff --git a/net/netfilter/nf_conntrack_standalone.c b/net/netfilter/nf_conntrack_standalone.c
index 037fec54c850..b642c0b2495c 100644
--- a/net/netfilter/nf_conntrack_standalone.c
+++ b/net/netfilter/nf_conntrack_standalone.c
@@ -375,19 +375,6 @@ static const struct seq_operations ct_seq_ops = {
375 .show = ct_seq_show 375 .show = ct_seq_show
376}; 376};
377 377
378static int ct_open(struct inode *inode, struct file *file)
379{
380 return seq_open_net(inode, file, &ct_seq_ops,
381 sizeof(struct ct_iter_state));
382}
383
384static const struct file_operations ct_file_ops = {
385 .open = ct_open,
386 .read = seq_read,
387 .llseek = seq_lseek,
388 .release = seq_release_net,
389};
390
391static void *ct_cpu_seq_start(struct seq_file *seq, loff_t *pos) 378static void *ct_cpu_seq_start(struct seq_file *seq, loff_t *pos)
392{ 379{
393 struct net *net = seq_file_net(seq); 380 struct net *net = seq_file_net(seq);
@@ -467,26 +454,14 @@ static const struct seq_operations ct_cpu_seq_ops = {
467 .show = ct_cpu_seq_show, 454 .show = ct_cpu_seq_show,
468}; 455};
469 456
470static int ct_cpu_seq_open(struct inode *inode, struct file *file)
471{
472 return seq_open_net(inode, file, &ct_cpu_seq_ops,
473 sizeof(struct seq_net_private));
474}
475
476static const struct file_operations ct_cpu_seq_fops = {
477 .open = ct_cpu_seq_open,
478 .read = seq_read,
479 .llseek = seq_lseek,
480 .release = seq_release_net,
481};
482
483static int nf_conntrack_standalone_init_proc(struct net *net) 457static int nf_conntrack_standalone_init_proc(struct net *net)
484{ 458{
485 struct proc_dir_entry *pde; 459 struct proc_dir_entry *pde;
486 kuid_t root_uid; 460 kuid_t root_uid;
487 kgid_t root_gid; 461 kgid_t root_gid;
488 462
489 pde = proc_create("nf_conntrack", 0440, net->proc_net, &ct_file_ops); 463 pde = proc_create_net("nf_conntrack", 0440, net->proc_net, &ct_seq_ops,
464 sizeof(struct ct_iter_state));
490 if (!pde) 465 if (!pde)
491 goto out_nf_conntrack; 466 goto out_nf_conntrack;
492 467
@@ -495,8 +470,8 @@ static int nf_conntrack_standalone_init_proc(struct net *net)
495 if (uid_valid(root_uid) && gid_valid(root_gid)) 470 if (uid_valid(root_uid) && gid_valid(root_gid))
496 proc_set_user(pde, root_uid, root_gid); 471 proc_set_user(pde, root_uid, root_gid);
497 472
498 pde = proc_create("nf_conntrack", 0444, net->proc_net_stat, 473 pde = proc_create_net("nf_conntrack", 0444, net->proc_net_stat,
499 &ct_cpu_seq_fops); 474 &ct_cpu_seq_ops, sizeof(struct seq_net_private));
500 if (!pde) 475 if (!pde)
501 goto out_stat_nf_conntrack; 476 goto out_stat_nf_conntrack;
502 return 0; 477 return 0;
diff --git a/net/netfilter/nf_log.c b/net/netfilter/nf_log.c
index 6d0357817cda..426457047578 100644
--- a/net/netfilter/nf_log.c
+++ b/net/netfilter/nf_log.c
@@ -394,21 +394,6 @@ static const struct seq_operations nflog_seq_ops = {
394 .stop = seq_stop, 394 .stop = seq_stop,
395 .show = seq_show, 395 .show = seq_show,
396}; 396};
397
398static int nflog_open(struct inode *inode, struct file *file)
399{
400 return seq_open_net(inode, file, &nflog_seq_ops,
401 sizeof(struct seq_net_private));
402}
403
404static const struct file_operations nflog_file_ops = {
405 .open = nflog_open,
406 .read = seq_read,
407 .llseek = seq_lseek,
408 .release = seq_release_net,
409};
410
411
412#endif /* PROC_FS */ 397#endif /* PROC_FS */
413 398
414#ifdef CONFIG_SYSCTL 399#ifdef CONFIG_SYSCTL
@@ -549,8 +534,8 @@ static int __net_init nf_log_net_init(struct net *net)
549 int ret = -ENOMEM; 534 int ret = -ENOMEM;
550 535
551#ifdef CONFIG_PROC_FS 536#ifdef CONFIG_PROC_FS
552 if (!proc_create("nf_log", 0444, 537 if (!proc_create_net("nf_log", 0444, net->nf.proc_netfilter,
553 net->nf.proc_netfilter, &nflog_file_ops)) 538 &nflog_seq_ops, sizeof(struct seq_net_private)))
554 return ret; 539 return ret;
555#endif 540#endif
556 ret = netfilter_log_sysctl_init(net); 541 ret = netfilter_log_sysctl_init(net);
diff --git a/net/netfilter/nf_synproxy_core.c b/net/netfilter/nf_synproxy_core.c
index 6039b350abbe..8ff4d22f10b2 100644
--- a/net/netfilter/nf_synproxy_core.c
+++ b/net/netfilter/nf_synproxy_core.c
@@ -310,23 +310,10 @@ static const struct seq_operations synproxy_cpu_seq_ops = {
310 .show = synproxy_cpu_seq_show, 310 .show = synproxy_cpu_seq_show,
311}; 311};
312 312
313static int synproxy_cpu_seq_open(struct inode *inode, struct file *file)
314{
315 return seq_open_net(inode, file, &synproxy_cpu_seq_ops,
316 sizeof(struct seq_net_private));
317}
318
319static const struct file_operations synproxy_cpu_seq_fops = {
320 .open = synproxy_cpu_seq_open,
321 .read = seq_read,
322 .llseek = seq_lseek,
323 .release = seq_release_net,
324};
325
326static int __net_init synproxy_proc_init(struct net *net) 313static int __net_init synproxy_proc_init(struct net *net)
327{ 314{
328 if (!proc_create("synproxy", 0444, net->proc_net_stat, 315 if (!proc_create_net("synproxy", 0444, net->proc_net_stat,
329 &synproxy_cpu_seq_fops)) 316 &synproxy_cpu_seq_ops, sizeof(struct seq_net_private)))
330 return -ENOMEM; 317 return -ENOMEM;
331 return 0; 318 return 0;
332} 319}
diff --git a/net/netfilter/nfnetlink_log.c b/net/netfilter/nfnetlink_log.c
index 7b46aa4c478d..c14822b9729f 100644
--- a/net/netfilter/nfnetlink_log.c
+++ b/net/netfilter/nfnetlink_log.c
@@ -1046,20 +1046,6 @@ static const struct seq_operations nful_seq_ops = {
1046 .stop = seq_stop, 1046 .stop = seq_stop,
1047 .show = seq_show, 1047 .show = seq_show,
1048}; 1048};
1049
1050static int nful_open(struct inode *inode, struct file *file)
1051{
1052 return seq_open_net(inode, file, &nful_seq_ops,
1053 sizeof(struct iter_state));
1054}
1055
1056static const struct file_operations nful_file_ops = {
1057 .open = nful_open,
1058 .read = seq_read,
1059 .llseek = seq_lseek,
1060 .release = seq_release_net,
1061};
1062
1063#endif /* PROC_FS */ 1049#endif /* PROC_FS */
1064 1050
1065static int __net_init nfnl_log_net_init(struct net *net) 1051static int __net_init nfnl_log_net_init(struct net *net)
@@ -1077,8 +1063,8 @@ static int __net_init nfnl_log_net_init(struct net *net)
1077 spin_lock_init(&log->instances_lock); 1063 spin_lock_init(&log->instances_lock);
1078 1064
1079#ifdef CONFIG_PROC_FS 1065#ifdef CONFIG_PROC_FS
1080 proc = proc_create("nfnetlink_log", 0440, 1066 proc = proc_create_net("nfnetlink_log", 0440, net->nf.proc_netfilter,
1081 net->nf.proc_netfilter, &nful_file_ops); 1067 &nful_seq_ops, sizeof(struct iter_state));
1082 if (!proc) 1068 if (!proc)
1083 return -ENOMEM; 1069 return -ENOMEM;
1084 1070
diff --git a/net/netfilter/nfnetlink_queue.c b/net/netfilter/nfnetlink_queue.c
index 74a04638ef03..494a9ab35cb6 100644
--- a/net/netfilter/nfnetlink_queue.c
+++ b/net/netfilter/nfnetlink_queue.c
@@ -1469,20 +1469,6 @@ static const struct seq_operations nfqnl_seq_ops = {
1469 .stop = seq_stop, 1469 .stop = seq_stop,
1470 .show = seq_show, 1470 .show = seq_show,
1471}; 1471};
1472
1473static int nfqnl_open(struct inode *inode, struct file *file)
1474{
1475 return seq_open_net(inode, file, &nfqnl_seq_ops,
1476 sizeof(struct iter_state));
1477}
1478
1479static const struct file_operations nfqnl_file_ops = {
1480 .open = nfqnl_open,
1481 .read = seq_read,
1482 .llseek = seq_lseek,
1483 .release = seq_release_net,
1484};
1485
1486#endif /* PROC_FS */ 1472#endif /* PROC_FS */
1487 1473
1488static int __net_init nfnl_queue_net_init(struct net *net) 1474static int __net_init nfnl_queue_net_init(struct net *net)
@@ -1496,8 +1482,8 @@ static int __net_init nfnl_queue_net_init(struct net *net)
1496 spin_lock_init(&q->instances_lock); 1482 spin_lock_init(&q->instances_lock);
1497 1483
1498#ifdef CONFIG_PROC_FS 1484#ifdef CONFIG_PROC_FS
1499 if (!proc_create("nfnetlink_queue", 0440, 1485 if (!proc_create_net("nfnetlink_queue", 0440, net->nf.proc_netfilter,
1500 net->nf.proc_netfilter, &nfqnl_file_ops)) 1486 &nfqnl_seq_ops, sizeof(struct iter_state)))
1501 return -ENOMEM; 1487 return -ENOMEM;
1502#endif 1488#endif
1503 nf_register_queue_handler(net, &nfqh); 1489 nf_register_queue_handler(net, &nfqh);
diff --git a/net/netfilter/x_tables.c b/net/netfilter/x_tables.c
index cb7cb300c3bc..55cb4d197184 100644
--- a/net/netfilter/x_tables.c
+++ b/net/netfilter/x_tables.c
@@ -1495,15 +1495,10 @@ void *xt_unregister_table(struct xt_table *table)
1495EXPORT_SYMBOL_GPL(xt_unregister_table); 1495EXPORT_SYMBOL_GPL(xt_unregister_table);
1496 1496
1497#ifdef CONFIG_PROC_FS 1497#ifdef CONFIG_PROC_FS
1498struct xt_names_priv {
1499 struct seq_net_private p;
1500 u_int8_t af;
1501};
1502static void *xt_table_seq_start(struct seq_file *seq, loff_t *pos) 1498static void *xt_table_seq_start(struct seq_file *seq, loff_t *pos)
1503{ 1499{
1504 struct xt_names_priv *priv = seq->private;
1505 struct net *net = seq_file_net(seq); 1500 struct net *net = seq_file_net(seq);
1506 u_int8_t af = priv->af; 1501 u_int8_t af = (unsigned long)PDE_DATA(file_inode(seq->file));
1507 1502
1508 mutex_lock(&xt[af].mutex); 1503 mutex_lock(&xt[af].mutex);
1509 return seq_list_start(&net->xt.tables[af], *pos); 1504 return seq_list_start(&net->xt.tables[af], *pos);
@@ -1511,17 +1506,15 @@ static void *xt_table_seq_start(struct seq_file *seq, loff_t *pos)
1511 1506
1512static void *xt_table_seq_next(struct seq_file *seq, void *v, loff_t *pos) 1507static void *xt_table_seq_next(struct seq_file *seq, void *v, loff_t *pos)
1513{ 1508{
1514 struct xt_names_priv *priv = seq->private;
1515 struct net *net = seq_file_net(seq); 1509 struct net *net = seq_file_net(seq);
1516 u_int8_t af = priv->af; 1510 u_int8_t af = (unsigned long)PDE_DATA(file_inode(seq->file));
1517 1511
1518 return seq_list_next(v, &net->xt.tables[af], pos); 1512 return seq_list_next(v, &net->xt.tables[af], pos);
1519} 1513}
1520 1514
1521static void xt_table_seq_stop(struct seq_file *seq, void *v) 1515static void xt_table_seq_stop(struct seq_file *seq, void *v)
1522{ 1516{
1523 struct xt_names_priv *priv = seq->private; 1517 u_int8_t af = (unsigned long)PDE_DATA(file_inode(seq->file));
1524 u_int8_t af = priv->af;
1525 1518
1526 mutex_unlock(&xt[af].mutex); 1519 mutex_unlock(&xt[af].mutex);
1527} 1520}
@@ -1542,34 +1535,13 @@ static const struct seq_operations xt_table_seq_ops = {
1542 .show = xt_table_seq_show, 1535 .show = xt_table_seq_show,
1543}; 1536};
1544 1537
1545static int xt_table_open(struct inode *inode, struct file *file)
1546{
1547 int ret;
1548 struct xt_names_priv *priv;
1549
1550 ret = seq_open_net(inode, file, &xt_table_seq_ops,
1551 sizeof(struct xt_names_priv));
1552 if (!ret) {
1553 priv = ((struct seq_file *)file->private_data)->private;
1554 priv->af = (unsigned long)PDE_DATA(inode);
1555 }
1556 return ret;
1557}
1558
1559static const struct file_operations xt_table_ops = {
1560 .open = xt_table_open,
1561 .read = seq_read,
1562 .llseek = seq_lseek,
1563 .release = seq_release_net,
1564};
1565
1566/* 1538/*
1567 * Traverse state for ip{,6}_{tables,matches} for helping crossing 1539 * Traverse state for ip{,6}_{tables,matches} for helping crossing
1568 * the multi-AF mutexes. 1540 * the multi-AF mutexes.
1569 */ 1541 */
1570struct nf_mttg_trav { 1542struct nf_mttg_trav {
1571 struct list_head *head, *curr; 1543 struct list_head *head, *curr;
1572 uint8_t class, nfproto; 1544 uint8_t class;
1573}; 1545};
1574 1546
1575enum { 1547enum {
@@ -1586,6 +1558,7 @@ static void *xt_mttg_seq_next(struct seq_file *seq, void *v, loff_t *ppos,
1586 [MTTG_TRAV_NFP_UNSPEC] = MTTG_TRAV_NFP_SPEC, 1558 [MTTG_TRAV_NFP_UNSPEC] = MTTG_TRAV_NFP_SPEC,
1587 [MTTG_TRAV_NFP_SPEC] = MTTG_TRAV_DONE, 1559 [MTTG_TRAV_NFP_SPEC] = MTTG_TRAV_DONE,
1588 }; 1560 };
1561 uint8_t nfproto = (unsigned long)PDE_DATA(file_inode(seq->file));
1589 struct nf_mttg_trav *trav = seq->private; 1562 struct nf_mttg_trav *trav = seq->private;
1590 1563
1591 switch (trav->class) { 1564 switch (trav->class) {
@@ -1600,9 +1573,9 @@ static void *xt_mttg_seq_next(struct seq_file *seq, void *v, loff_t *ppos,
1600 if (trav->curr != trav->head) 1573 if (trav->curr != trav->head)
1601 break; 1574 break;
1602 mutex_unlock(&xt[NFPROTO_UNSPEC].mutex); 1575 mutex_unlock(&xt[NFPROTO_UNSPEC].mutex);
1603 mutex_lock(&xt[trav->nfproto].mutex); 1576 mutex_lock(&xt[nfproto].mutex);
1604 trav->head = trav->curr = is_target ? 1577 trav->head = trav->curr = is_target ?
1605 &xt[trav->nfproto].target : &xt[trav->nfproto].match; 1578 &xt[nfproto].target : &xt[nfproto].match;
1606 trav->class = next_class[trav->class]; 1579 trav->class = next_class[trav->class];
1607 break; 1580 break;
1608 case MTTG_TRAV_NFP_SPEC: 1581 case MTTG_TRAV_NFP_SPEC:
@@ -1634,6 +1607,7 @@ static void *xt_mttg_seq_start(struct seq_file *seq, loff_t *pos,
1634 1607
1635static void xt_mttg_seq_stop(struct seq_file *seq, void *v) 1608static void xt_mttg_seq_stop(struct seq_file *seq, void *v)
1636{ 1609{
1610 uint8_t nfproto = (unsigned long)PDE_DATA(file_inode(seq->file));
1637 struct nf_mttg_trav *trav = seq->private; 1611 struct nf_mttg_trav *trav = seq->private;
1638 1612
1639 switch (trav->class) { 1613 switch (trav->class) {
@@ -1641,7 +1615,7 @@ static void xt_mttg_seq_stop(struct seq_file *seq, void *v)
1641 mutex_unlock(&xt[NFPROTO_UNSPEC].mutex); 1615 mutex_unlock(&xt[NFPROTO_UNSPEC].mutex);
1642 break; 1616 break;
1643 case MTTG_TRAV_NFP_SPEC: 1617 case MTTG_TRAV_NFP_SPEC:
1644 mutex_unlock(&xt[trav->nfproto].mutex); 1618 mutex_unlock(&xt[nfproto].mutex);
1645 break; 1619 break;
1646 } 1620 }
1647} 1621}
@@ -1680,24 +1654,6 @@ static const struct seq_operations xt_match_seq_ops = {
1680 .show = xt_match_seq_show, 1654 .show = xt_match_seq_show,
1681}; 1655};
1682 1656
1683static int xt_match_open(struct inode *inode, struct file *file)
1684{
1685 struct nf_mttg_trav *trav;
1686 trav = __seq_open_private(file, &xt_match_seq_ops, sizeof(*trav));
1687 if (!trav)
1688 return -ENOMEM;
1689
1690 trav->nfproto = (unsigned long)PDE_DATA(inode);
1691 return 0;
1692}
1693
1694static const struct file_operations xt_match_ops = {
1695 .open = xt_match_open,
1696 .read = seq_read,
1697 .llseek = seq_lseek,
1698 .release = seq_release_private,
1699};
1700
1701static void *xt_target_seq_start(struct seq_file *seq, loff_t *pos) 1657static void *xt_target_seq_start(struct seq_file *seq, loff_t *pos)
1702{ 1658{
1703 return xt_mttg_seq_start(seq, pos, true); 1659 return xt_mttg_seq_start(seq, pos, true);
@@ -1732,24 +1688,6 @@ static const struct seq_operations xt_target_seq_ops = {
1732 .show = xt_target_seq_show, 1688 .show = xt_target_seq_show,
1733}; 1689};
1734 1690
1735static int xt_target_open(struct inode *inode, struct file *file)
1736{
1737 struct nf_mttg_trav *trav;
1738 trav = __seq_open_private(file, &xt_target_seq_ops, sizeof(*trav));
1739 if (!trav)
1740 return -ENOMEM;
1741
1742 trav->nfproto = (unsigned long)PDE_DATA(inode);
1743 return 0;
1744}
1745
1746static const struct file_operations xt_target_ops = {
1747 .open = xt_target_open,
1748 .read = seq_read,
1749 .llseek = seq_lseek,
1750 .release = seq_release_private,
1751};
1752
1753#define FORMAT_TABLES "_tables_names" 1691#define FORMAT_TABLES "_tables_names"
1754#define FORMAT_MATCHES "_tables_matches" 1692#define FORMAT_MATCHES "_tables_matches"
1755#define FORMAT_TARGETS "_tables_targets" 1693#define FORMAT_TARGETS "_tables_targets"
@@ -1813,8 +1751,9 @@ int xt_proto_init(struct net *net, u_int8_t af)
1813 1751
1814 strlcpy(buf, xt_prefix[af], sizeof(buf)); 1752 strlcpy(buf, xt_prefix[af], sizeof(buf));
1815 strlcat(buf, FORMAT_TABLES, sizeof(buf)); 1753 strlcat(buf, FORMAT_TABLES, sizeof(buf));
1816 proc = proc_create_data(buf, 0440, net->proc_net, &xt_table_ops, 1754 proc = proc_create_net_data(buf, 0440, net->proc_net, &xt_table_seq_ops,
1817 (void *)(unsigned long)af); 1755 sizeof(struct seq_net_private),
1756 (void *)(unsigned long)af);
1818 if (!proc) 1757 if (!proc)
1819 goto out; 1758 goto out;
1820 if (uid_valid(root_uid) && gid_valid(root_gid)) 1759 if (uid_valid(root_uid) && gid_valid(root_gid))
@@ -1822,8 +1761,9 @@ int xt_proto_init(struct net *net, u_int8_t af)
1822 1761
1823 strlcpy(buf, xt_prefix[af], sizeof(buf)); 1762 strlcpy(buf, xt_prefix[af], sizeof(buf));
1824 strlcat(buf, FORMAT_MATCHES, sizeof(buf)); 1763 strlcat(buf, FORMAT_MATCHES, sizeof(buf));
1825 proc = proc_create_data(buf, 0440, net->proc_net, &xt_match_ops, 1764 proc = proc_create_seq_private(buf, 0440, net->proc_net,
1826 (void *)(unsigned long)af); 1765 &xt_match_seq_ops, sizeof(struct nf_mttg_trav),
1766 (void *)(unsigned long)af);
1827 if (!proc) 1767 if (!proc)
1828 goto out_remove_tables; 1768 goto out_remove_tables;
1829 if (uid_valid(root_uid) && gid_valid(root_gid)) 1769 if (uid_valid(root_uid) && gid_valid(root_gid))
@@ -1831,8 +1771,9 @@ int xt_proto_init(struct net *net, u_int8_t af)
1831 1771
1832 strlcpy(buf, xt_prefix[af], sizeof(buf)); 1772 strlcpy(buf, xt_prefix[af], sizeof(buf));
1833 strlcat(buf, FORMAT_TARGETS, sizeof(buf)); 1773 strlcat(buf, FORMAT_TARGETS, sizeof(buf));
1834 proc = proc_create_data(buf, 0440, net->proc_net, &xt_target_ops, 1774 proc = proc_create_seq_private(buf, 0440, net->proc_net,
1835 (void *)(unsigned long)af); 1775 &xt_target_seq_ops, sizeof(struct nf_mttg_trav),
1776 (void *)(unsigned long)af);
1836 if (!proc) 1777 if (!proc)
1837 goto out_remove_matches; 1778 goto out_remove_matches;
1838 if (uid_valid(root_uid) && gid_valid(root_gid)) 1779 if (uid_valid(root_uid) && gid_valid(root_gid))
diff --git a/net/netfilter/xt_hashlimit.c b/net/netfilter/xt_hashlimit.c
index 0cd73567e7ff..9b16402f29af 100644
--- a/net/netfilter/xt_hashlimit.c
+++ b/net/netfilter/xt_hashlimit.c
@@ -57,9 +57,9 @@ static inline struct hashlimit_net *hashlimit_pernet(struct net *net)
57} 57}
58 58
59/* need to declare this at the top */ 59/* need to declare this at the top */
60static const struct file_operations dl_file_ops_v2; 60static const struct seq_operations dl_seq_ops_v2;
61static const struct file_operations dl_file_ops_v1; 61static const struct seq_operations dl_seq_ops_v1;
62static const struct file_operations dl_file_ops; 62static const struct seq_operations dl_seq_ops;
63 63
64/* hash table crap */ 64/* hash table crap */
65struct dsthash_dst { 65struct dsthash_dst {
@@ -272,7 +272,7 @@ static int htable_create(struct net *net, struct hashlimit_cfg3 *cfg,
272{ 272{
273 struct hashlimit_net *hashlimit_net = hashlimit_pernet(net); 273 struct hashlimit_net *hashlimit_net = hashlimit_pernet(net);
274 struct xt_hashlimit_htable *hinfo; 274 struct xt_hashlimit_htable *hinfo;
275 const struct file_operations *fops; 275 const struct seq_operations *ops;
276 unsigned int size, i; 276 unsigned int size, i;
277 int ret; 277 int ret;
278 278
@@ -321,19 +321,19 @@ static int htable_create(struct net *net, struct hashlimit_cfg3 *cfg,
321 321
322 switch (revision) { 322 switch (revision) {
323 case 1: 323 case 1:
324 fops = &dl_file_ops_v1; 324 ops = &dl_seq_ops_v1;
325 break; 325 break;
326 case 2: 326 case 2:
327 fops = &dl_file_ops_v2; 327 ops = &dl_seq_ops_v2;
328 break; 328 break;
329 default: 329 default:
330 fops = &dl_file_ops; 330 ops = &dl_seq_ops;
331 } 331 }
332 332
333 hinfo->pde = proc_create_data(name, 0, 333 hinfo->pde = proc_create_seq_data(name, 0,
334 (family == NFPROTO_IPV4) ? 334 (family == NFPROTO_IPV4) ?
335 hashlimit_net->ipt_hashlimit : hashlimit_net->ip6t_hashlimit, 335 hashlimit_net->ipt_hashlimit : hashlimit_net->ip6t_hashlimit,
336 fops, hinfo); 336 ops, hinfo);
337 if (hinfo->pde == NULL) { 337 if (hinfo->pde == NULL) {
338 kfree(hinfo->name); 338 kfree(hinfo->name);
339 vfree(hinfo); 339 vfree(hinfo);
@@ -1057,7 +1057,7 @@ static struct xt_match hashlimit_mt_reg[] __read_mostly = {
1057static void *dl_seq_start(struct seq_file *s, loff_t *pos) 1057static void *dl_seq_start(struct seq_file *s, loff_t *pos)
1058 __acquires(htable->lock) 1058 __acquires(htable->lock)
1059{ 1059{
1060 struct xt_hashlimit_htable *htable = s->private; 1060 struct xt_hashlimit_htable *htable = PDE_DATA(file_inode(s->private));
1061 unsigned int *bucket; 1061 unsigned int *bucket;
1062 1062
1063 spin_lock_bh(&htable->lock); 1063 spin_lock_bh(&htable->lock);
@@ -1074,7 +1074,7 @@ static void *dl_seq_start(struct seq_file *s, loff_t *pos)
1074 1074
1075static void *dl_seq_next(struct seq_file *s, void *v, loff_t *pos) 1075static void *dl_seq_next(struct seq_file *s, void *v, loff_t *pos)
1076{ 1076{
1077 struct xt_hashlimit_htable *htable = s->private; 1077 struct xt_hashlimit_htable *htable = PDE_DATA(file_inode(s->private));
1078 unsigned int *bucket = v; 1078 unsigned int *bucket = v;
1079 1079
1080 *pos = ++(*bucket); 1080 *pos = ++(*bucket);
@@ -1088,7 +1088,7 @@ static void *dl_seq_next(struct seq_file *s, void *v, loff_t *pos)
1088static void dl_seq_stop(struct seq_file *s, void *v) 1088static void dl_seq_stop(struct seq_file *s, void *v)
1089 __releases(htable->lock) 1089 __releases(htable->lock)
1090{ 1090{
1091 struct xt_hashlimit_htable *htable = s->private; 1091 struct xt_hashlimit_htable *htable = PDE_DATA(file_inode(s->private));
1092 unsigned int *bucket = v; 1092 unsigned int *bucket = v;
1093 1093
1094 if (!IS_ERR(bucket)) 1094 if (!IS_ERR(bucket))
@@ -1130,7 +1130,7 @@ static void dl_seq_print(struct dsthash_ent *ent, u_int8_t family,
1130static int dl_seq_real_show_v2(struct dsthash_ent *ent, u_int8_t family, 1130static int dl_seq_real_show_v2(struct dsthash_ent *ent, u_int8_t family,
1131 struct seq_file *s) 1131 struct seq_file *s)
1132{ 1132{
1133 const struct xt_hashlimit_htable *ht = s->private; 1133 struct xt_hashlimit_htable *ht = PDE_DATA(file_inode(s->private));
1134 1134
1135 spin_lock(&ent->lock); 1135 spin_lock(&ent->lock);
1136 /* recalculate to show accurate numbers */ 1136 /* recalculate to show accurate numbers */
@@ -1145,7 +1145,7 @@ static int dl_seq_real_show_v2(struct dsthash_ent *ent, u_int8_t family,
1145static int dl_seq_real_show_v1(struct dsthash_ent *ent, u_int8_t family, 1145static int dl_seq_real_show_v1(struct dsthash_ent *ent, u_int8_t family,
1146 struct seq_file *s) 1146 struct seq_file *s)
1147{ 1147{
1148 const struct xt_hashlimit_htable *ht = s->private; 1148 struct xt_hashlimit_htable *ht = PDE_DATA(file_inode(s->private));
1149 1149
1150 spin_lock(&ent->lock); 1150 spin_lock(&ent->lock);
1151 /* recalculate to show accurate numbers */ 1151 /* recalculate to show accurate numbers */
@@ -1160,7 +1160,7 @@ static int dl_seq_real_show_v1(struct dsthash_ent *ent, u_int8_t family,
1160static int dl_seq_real_show(struct dsthash_ent *ent, u_int8_t family, 1160static int dl_seq_real_show(struct dsthash_ent *ent, u_int8_t family,
1161 struct seq_file *s) 1161 struct seq_file *s)
1162{ 1162{
1163 const struct xt_hashlimit_htable *ht = s->private; 1163 struct xt_hashlimit_htable *ht = PDE_DATA(file_inode(s->private));
1164 1164
1165 spin_lock(&ent->lock); 1165 spin_lock(&ent->lock);
1166 /* recalculate to show accurate numbers */ 1166 /* recalculate to show accurate numbers */
@@ -1174,7 +1174,7 @@ static int dl_seq_real_show(struct dsthash_ent *ent, u_int8_t family,
1174 1174
1175static int dl_seq_show_v2(struct seq_file *s, void *v) 1175static int dl_seq_show_v2(struct seq_file *s, void *v)
1176{ 1176{
1177 struct xt_hashlimit_htable *htable = s->private; 1177 struct xt_hashlimit_htable *htable = PDE_DATA(file_inode(s->private));
1178 unsigned int *bucket = (unsigned int *)v; 1178 unsigned int *bucket = (unsigned int *)v;
1179 struct dsthash_ent *ent; 1179 struct dsthash_ent *ent;
1180 1180
@@ -1188,7 +1188,7 @@ static int dl_seq_show_v2(struct seq_file *s, void *v)
1188 1188
1189static int dl_seq_show_v1(struct seq_file *s, void *v) 1189static int dl_seq_show_v1(struct seq_file *s, void *v)
1190{ 1190{
1191 struct xt_hashlimit_htable *htable = s->private; 1191 struct xt_hashlimit_htable *htable = PDE_DATA(file_inode(s->private));
1192 unsigned int *bucket = v; 1192 unsigned int *bucket = v;
1193 struct dsthash_ent *ent; 1193 struct dsthash_ent *ent;
1194 1194
@@ -1202,7 +1202,7 @@ static int dl_seq_show_v1(struct seq_file *s, void *v)
1202 1202
1203static int dl_seq_show(struct seq_file *s, void *v) 1203static int dl_seq_show(struct seq_file *s, void *v)
1204{ 1204{
1205 struct xt_hashlimit_htable *htable = s->private; 1205 struct xt_hashlimit_htable *htable = PDE_DATA(file_inode(s->private));
1206 unsigned int *bucket = v; 1206 unsigned int *bucket = v;
1207 struct dsthash_ent *ent; 1207 struct dsthash_ent *ent;
1208 1208
@@ -1235,62 +1235,6 @@ static const struct seq_operations dl_seq_ops = {
1235 .show = dl_seq_show 1235 .show = dl_seq_show
1236}; 1236};
1237 1237
1238static int dl_proc_open_v2(struct inode *inode, struct file *file)
1239{
1240 int ret = seq_open(file, &dl_seq_ops_v2);
1241
1242 if (!ret) {
1243 struct seq_file *sf = file->private_data;
1244
1245 sf->private = PDE_DATA(inode);
1246 }
1247 return ret;
1248}
1249
1250static int dl_proc_open_v1(struct inode *inode, struct file *file)
1251{
1252 int ret = seq_open(file, &dl_seq_ops_v1);
1253
1254 if (!ret) {
1255 struct seq_file *sf = file->private_data;
1256 sf->private = PDE_DATA(inode);
1257 }
1258 return ret;
1259}
1260
1261static int dl_proc_open(struct inode *inode, struct file *file)
1262{
1263 int ret = seq_open(file, &dl_seq_ops);
1264
1265 if (!ret) {
1266 struct seq_file *sf = file->private_data;
1267
1268 sf->private = PDE_DATA(inode);
1269 }
1270 return ret;
1271}
1272
1273static const struct file_operations dl_file_ops_v2 = {
1274 .open = dl_proc_open_v2,
1275 .read = seq_read,
1276 .llseek = seq_lseek,
1277 .release = seq_release
1278};
1279
1280static const struct file_operations dl_file_ops_v1 = {
1281 .open = dl_proc_open_v1,
1282 .read = seq_read,
1283 .llseek = seq_lseek,
1284 .release = seq_release
1285};
1286
1287static const struct file_operations dl_file_ops = {
1288 .open = dl_proc_open,
1289 .read = seq_read,
1290 .llseek = seq_lseek,
1291 .release = seq_release
1292};
1293
1294static int __net_init hashlimit_proc_net_init(struct net *net) 1238static int __net_init hashlimit_proc_net_init(struct net *net)
1295{ 1239{
1296 struct hashlimit_net *hashlimit_net = hashlimit_pernet(net); 1240 struct hashlimit_net *hashlimit_net = hashlimit_pernet(net);
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
index 2e2dd88fc79f..393573a99a5a 100644
--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
@@ -2635,21 +2635,6 @@ static const struct seq_operations netlink_seq_ops = {
2635 .stop = netlink_seq_stop, 2635 .stop = netlink_seq_stop,
2636 .show = netlink_seq_show, 2636 .show = netlink_seq_show,
2637}; 2637};
2638
2639
2640static int netlink_seq_open(struct inode *inode, struct file *file)
2641{
2642 return seq_open_net(inode, file, &netlink_seq_ops,
2643 sizeof(struct nl_seq_iter));
2644}
2645
2646static const struct file_operations netlink_seq_fops = {
2647 .open = netlink_seq_open,
2648 .read = seq_read,
2649 .llseek = seq_lseek,
2650 .release = seq_release_net,
2651};
2652
2653#endif 2638#endif
2654 2639
2655int netlink_register_notifier(struct notifier_block *nb) 2640int netlink_register_notifier(struct notifier_block *nb)
@@ -2694,7 +2679,8 @@ static const struct net_proto_family netlink_family_ops = {
2694static int __net_init netlink_net_init(struct net *net) 2679static int __net_init netlink_net_init(struct net *net)
2695{ 2680{
2696#ifdef CONFIG_PROC_FS 2681#ifdef CONFIG_PROC_FS
2697 if (!proc_create("netlink", 0, net->proc_net, &netlink_seq_fops)) 2682 if (!proc_create_net("netlink", 0, net->proc_net, &netlink_seq_ops,
2683 sizeof(struct nl_seq_iter)))
2698 return -ENOMEM; 2684 return -ENOMEM;
2699#endif 2685#endif
2700 return 0; 2686 return 0;
diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c
index 4221d98a314b..c2888c78d4c1 100644
--- a/net/netrom/af_netrom.c
+++ b/net/netrom/af_netrom.c
@@ -1338,18 +1338,6 @@ static const struct seq_operations nr_info_seqops = {
1338 .stop = nr_info_stop, 1338 .stop = nr_info_stop,
1339 .show = nr_info_show, 1339 .show = nr_info_show,
1340}; 1340};
1341
1342static int nr_info_open(struct inode *inode, struct file *file)
1343{
1344 return seq_open(file, &nr_info_seqops);
1345}
1346
1347static const struct file_operations nr_info_fops = {
1348 .open = nr_info_open,
1349 .read = seq_read,
1350 .llseek = seq_lseek,
1351 .release = seq_release,
1352};
1353#endif /* CONFIG_PROC_FS */ 1341#endif /* CONFIG_PROC_FS */
1354 1342
1355static const struct net_proto_family nr_family_ops = { 1343static const struct net_proto_family nr_family_ops = {
@@ -1450,9 +1438,9 @@ static int __init nr_proto_init(void)
1450 1438
1451 nr_loopback_init(); 1439 nr_loopback_init();
1452 1440
1453 proc_create("nr", 0444, init_net.proc_net, &nr_info_fops); 1441 proc_create_seq("nr", 0444, init_net.proc_net, &nr_info_seqops);
1454 proc_create("nr_neigh", 0444, init_net.proc_net, &nr_neigh_fops); 1442 proc_create_seq("nr_neigh", 0444, init_net.proc_net, &nr_neigh_seqops);
1455 proc_create("nr_nodes", 0444, init_net.proc_net, &nr_nodes_fops); 1443 proc_create_seq("nr_nodes", 0444, init_net.proc_net, &nr_node_seqops);
1456out: 1444out:
1457 return rc; 1445 return rc;
1458fail: 1446fail:
diff --git a/net/netrom/nr_route.c b/net/netrom/nr_route.c
index b5a7dcb30991..6485f593e2f0 100644
--- a/net/netrom/nr_route.c
+++ b/net/netrom/nr_route.c
@@ -888,25 +888,13 @@ static int nr_node_show(struct seq_file *seq, void *v)
888 return 0; 888 return 0;
889} 889}
890 890
891static const struct seq_operations nr_node_seqops = { 891const struct seq_operations nr_node_seqops = {
892 .start = nr_node_start, 892 .start = nr_node_start,
893 .next = nr_node_next, 893 .next = nr_node_next,
894 .stop = nr_node_stop, 894 .stop = nr_node_stop,
895 .show = nr_node_show, 895 .show = nr_node_show,
896}; 896};
897 897
898static int nr_node_info_open(struct inode *inode, struct file *file)
899{
900 return seq_open(file, &nr_node_seqops);
901}
902
903const struct file_operations nr_nodes_fops = {
904 .open = nr_node_info_open,
905 .read = seq_read,
906 .llseek = seq_lseek,
907 .release = seq_release,
908};
909
910static void *nr_neigh_start(struct seq_file *seq, loff_t *pos) 898static void *nr_neigh_start(struct seq_file *seq, loff_t *pos)
911{ 899{
912 spin_lock_bh(&nr_neigh_list_lock); 900 spin_lock_bh(&nr_neigh_list_lock);
@@ -954,25 +942,12 @@ static int nr_neigh_show(struct seq_file *seq, void *v)
954 return 0; 942 return 0;
955} 943}
956 944
957static const struct seq_operations nr_neigh_seqops = { 945const struct seq_operations nr_neigh_seqops = {
958 .start = nr_neigh_start, 946 .start = nr_neigh_start,
959 .next = nr_neigh_next, 947 .next = nr_neigh_next,
960 .stop = nr_neigh_stop, 948 .stop = nr_neigh_stop,
961 .show = nr_neigh_show, 949 .show = nr_neigh_show,
962}; 950};
963
964static int nr_neigh_info_open(struct inode *inode, struct file *file)
965{
966 return seq_open(file, &nr_neigh_seqops);
967}
968
969const struct file_operations nr_neigh_fops = {
970 .open = nr_neigh_info_open,
971 .read = seq_read,
972 .llseek = seq_lseek,
973 .release = seq_release,
974};
975
976#endif 951#endif
977 952
978/* 953/*
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index acb7b86574cd..f9cdd27a7f6f 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -4556,20 +4556,6 @@ static const struct seq_operations packet_seq_ops = {
4556 .stop = packet_seq_stop, 4556 .stop = packet_seq_stop,
4557 .show = packet_seq_show, 4557 .show = packet_seq_show,
4558}; 4558};
4559
4560static int packet_seq_open(struct inode *inode, struct file *file)
4561{
4562 return seq_open_net(inode, file, &packet_seq_ops,
4563 sizeof(struct seq_net_private));
4564}
4565
4566static const struct file_operations packet_seq_fops = {
4567 .open = packet_seq_open,
4568 .read = seq_read,
4569 .llseek = seq_lseek,
4570 .release = seq_release_net,
4571};
4572
4573#endif 4559#endif
4574 4560
4575static int __net_init packet_net_init(struct net *net) 4561static int __net_init packet_net_init(struct net *net)
@@ -4577,7 +4563,8 @@ static int __net_init packet_net_init(struct net *net)
4577 mutex_init(&net->packet.sklist_lock); 4563 mutex_init(&net->packet.sklist_lock);
4578 INIT_HLIST_HEAD(&net->packet.sklist); 4564 INIT_HLIST_HEAD(&net->packet.sklist);
4579 4565
4580 if (!proc_create("packet", 0, net->proc_net, &packet_seq_fops)) 4566 if (!proc_create_net("packet", 0, net->proc_net, &packet_seq_ops,
4567 sizeof(struct seq_net_private)))
4581 return -ENOMEM; 4568 return -ENOMEM;
4582 4569
4583 return 0; 4570 return 0;
diff --git a/net/phonet/pn_dev.c b/net/phonet/pn_dev.c
index 77787512fc32..6cb4f602ab71 100644
--- a/net/phonet/pn_dev.c
+++ b/net/phonet/pn_dev.c
@@ -320,7 +320,8 @@ static int __net_init phonet_init_net(struct net *net)
320{ 320{
321 struct phonet_net *pnn = phonet_pernet(net); 321 struct phonet_net *pnn = phonet_pernet(net);
322 322
323 if (!proc_create("phonet", 0, net->proc_net, &pn_sock_seq_fops)) 323 if (!proc_create_net("phonet", 0, net->proc_net, &pn_sock_seq_ops,
324 sizeof(struct seq_net_private)))
324 return -ENOMEM; 325 return -ENOMEM;
325 326
326 INIT_LIST_HEAD(&pnn->pndevs.list); 327 INIT_LIST_HEAD(&pnn->pndevs.list);
@@ -351,7 +352,8 @@ int __init phonet_device_init(void)
351 if (err) 352 if (err)
352 return err; 353 return err;
353 354
354 proc_create("pnresource", 0, init_net.proc_net, &pn_res_seq_fops); 355 proc_create_net("pnresource", 0, init_net.proc_net, &pn_res_seq_ops,
356 sizeof(struct seq_net_private));
355 register_netdevice_notifier(&phonet_device_notifier); 357 register_netdevice_notifier(&phonet_device_notifier);
356 err = phonet_netlink_register(); 358 err = phonet_netlink_register();
357 if (err) 359 if (err)
diff --git a/net/phonet/socket.c b/net/phonet/socket.c
index f9b40e6a18a5..30187990257f 100644
--- a/net/phonet/socket.c
+++ b/net/phonet/socket.c
@@ -620,25 +620,12 @@ static int pn_sock_seq_show(struct seq_file *seq, void *v)
620 return 0; 620 return 0;
621} 621}
622 622
623static const struct seq_operations pn_sock_seq_ops = { 623const struct seq_operations pn_sock_seq_ops = {
624 .start = pn_sock_seq_start, 624 .start = pn_sock_seq_start,
625 .next = pn_sock_seq_next, 625 .next = pn_sock_seq_next,
626 .stop = pn_sock_seq_stop, 626 .stop = pn_sock_seq_stop,
627 .show = pn_sock_seq_show, 627 .show = pn_sock_seq_show,
628}; 628};
629
630static int pn_sock_open(struct inode *inode, struct file *file)
631{
632 return seq_open_net(inode, file, &pn_sock_seq_ops,
633 sizeof(struct seq_net_private));
634}
635
636const struct file_operations pn_sock_seq_fops = {
637 .open = pn_sock_open,
638 .read = seq_read,
639 .llseek = seq_lseek,
640 .release = seq_release_net,
641};
642#endif 629#endif
643 630
644static struct { 631static struct {
@@ -802,23 +789,10 @@ static int pn_res_seq_show(struct seq_file *seq, void *v)
802 return 0; 789 return 0;
803} 790}
804 791
805static const struct seq_operations pn_res_seq_ops = { 792const struct seq_operations pn_res_seq_ops = {
806 .start = pn_res_seq_start, 793 .start = pn_res_seq_start,
807 .next = pn_res_seq_next, 794 .next = pn_res_seq_next,
808 .stop = pn_res_seq_stop, 795 .stop = pn_res_seq_stop,
809 .show = pn_res_seq_show, 796 .show = pn_res_seq_show,
810}; 797};
811
812static int pn_res_open(struct inode *inode, struct file *file)
813{
814 return seq_open_net(inode, file, &pn_res_seq_ops,
815 sizeof(struct seq_net_private));
816}
817
818const struct file_operations pn_res_seq_fops = {
819 .open = pn_res_open,
820 .read = seq_read,
821 .llseek = seq_lseek,
822 .release = seq_release_net,
823};
824#endif 798#endif
diff --git a/net/rose/af_rose.c b/net/rose/af_rose.c
index 9ff5e0a76593..22a7f2b413ac 100644
--- a/net/rose/af_rose.c
+++ b/net/rose/af_rose.c
@@ -1453,18 +1453,6 @@ static const struct seq_operations rose_info_seqops = {
1453 .stop = rose_info_stop, 1453 .stop = rose_info_stop,
1454 .show = rose_info_show, 1454 .show = rose_info_show,
1455}; 1455};
1456
1457static int rose_info_open(struct inode *inode, struct file *file)
1458{
1459 return seq_open(file, &rose_info_seqops);
1460}
1461
1462static const struct file_operations rose_info_fops = {
1463 .open = rose_info_open,
1464 .read = seq_read,
1465 .llseek = seq_lseek,
1466 .release = seq_release,
1467};
1468#endif /* CONFIG_PROC_FS */ 1456#endif /* CONFIG_PROC_FS */
1469 1457
1470static const struct net_proto_family rose_family_ops = { 1458static const struct net_proto_family rose_family_ops = {
@@ -1567,13 +1555,13 @@ static int __init rose_proto_init(void)
1567 1555
1568 rose_add_loopback_neigh(); 1556 rose_add_loopback_neigh();
1569 1557
1570 proc_create("rose", 0444, init_net.proc_net, &rose_info_fops); 1558 proc_create_seq("rose", 0444, init_net.proc_net, &rose_info_seqops);
1571 proc_create("rose_neigh", 0444, init_net.proc_net, 1559 proc_create_seq("rose_neigh", 0444, init_net.proc_net,
1572 &rose_neigh_fops); 1560 &rose_neigh_seqops);
1573 proc_create("rose_nodes", 0444, init_net.proc_net, 1561 proc_create_seq("rose_nodes", 0444, init_net.proc_net,
1574 &rose_nodes_fops); 1562 &rose_node_seqops);
1575 proc_create("rose_routes", 0444, init_net.proc_net, 1563 proc_create_seq("rose_routes", 0444, init_net.proc_net,
1576 &rose_routes_fops); 1564 &rose_route_seqops);
1577out: 1565out:
1578 return rc; 1566 return rc;
1579fail: 1567fail:
diff --git a/net/rose/rose_route.c b/net/rose/rose_route.c
index 178619ddab68..77e9f85a2c92 100644
--- a/net/rose/rose_route.c
+++ b/net/rose/rose_route.c
@@ -1143,25 +1143,13 @@ static int rose_node_show(struct seq_file *seq, void *v)
1143 return 0; 1143 return 0;
1144} 1144}
1145 1145
1146static const struct seq_operations rose_node_seqops = { 1146const struct seq_operations rose_node_seqops = {
1147 .start = rose_node_start, 1147 .start = rose_node_start,
1148 .next = rose_node_next, 1148 .next = rose_node_next,
1149 .stop = rose_node_stop, 1149 .stop = rose_node_stop,
1150 .show = rose_node_show, 1150 .show = rose_node_show,
1151}; 1151};
1152 1152
1153static int rose_nodes_open(struct inode *inode, struct file *file)
1154{
1155 return seq_open(file, &rose_node_seqops);
1156}
1157
1158const struct file_operations rose_nodes_fops = {
1159 .open = rose_nodes_open,
1160 .read = seq_read,
1161 .llseek = seq_lseek,
1162 .release = seq_release,
1163};
1164
1165static void *rose_neigh_start(struct seq_file *seq, loff_t *pos) 1153static void *rose_neigh_start(struct seq_file *seq, loff_t *pos)
1166 __acquires(rose_neigh_list_lock) 1154 __acquires(rose_neigh_list_lock)
1167{ 1155{
@@ -1226,26 +1214,13 @@ static int rose_neigh_show(struct seq_file *seq, void *v)
1226} 1214}
1227 1215
1228 1216
1229static const struct seq_operations rose_neigh_seqops = { 1217const struct seq_operations rose_neigh_seqops = {
1230 .start = rose_neigh_start, 1218 .start = rose_neigh_start,
1231 .next = rose_neigh_next, 1219 .next = rose_neigh_next,
1232 .stop = rose_neigh_stop, 1220 .stop = rose_neigh_stop,
1233 .show = rose_neigh_show, 1221 .show = rose_neigh_show,
1234}; 1222};
1235 1223
1236static int rose_neigh_open(struct inode *inode, struct file *file)
1237{
1238 return seq_open(file, &rose_neigh_seqops);
1239}
1240
1241const struct file_operations rose_neigh_fops = {
1242 .open = rose_neigh_open,
1243 .read = seq_read,
1244 .llseek = seq_lseek,
1245 .release = seq_release,
1246};
1247
1248
1249static void *rose_route_start(struct seq_file *seq, loff_t *pos) 1224static void *rose_route_start(struct seq_file *seq, loff_t *pos)
1250 __acquires(rose_route_list_lock) 1225 __acquires(rose_route_list_lock)
1251{ 1226{
@@ -1311,25 +1286,12 @@ static int rose_route_show(struct seq_file *seq, void *v)
1311 return 0; 1286 return 0;
1312} 1287}
1313 1288
1314static const struct seq_operations rose_route_seqops = { 1289struct seq_operations rose_route_seqops = {
1315 .start = rose_route_start, 1290 .start = rose_route_start,
1316 .next = rose_route_next, 1291 .next = rose_route_next,
1317 .stop = rose_route_stop, 1292 .stop = rose_route_stop,
1318 .show = rose_route_show, 1293 .show = rose_route_show,
1319}; 1294};
1320
1321static int rose_route_open(struct inode *inode, struct file *file)
1322{
1323 return seq_open(file, &rose_route_seqops);
1324}
1325
1326const struct file_operations rose_routes_fops = {
1327 .open = rose_route_open,
1328 .read = seq_read,
1329 .llseek = seq_lseek,
1330 .release = seq_release,
1331};
1332
1333#endif /* CONFIG_PROC_FS */ 1295#endif /* CONFIG_PROC_FS */
1334 1296
1335/* 1297/*
diff --git a/net/rxrpc/ar-internal.h b/net/rxrpc/ar-internal.h
index 19975d2ca9a2..29923ec2189c 100644
--- a/net/rxrpc/ar-internal.h
+++ b/net/rxrpc/ar-internal.h
@@ -1051,8 +1051,8 @@ void __rxrpc_queue_peer_error(struct rxrpc_peer *);
1051/* 1051/*
1052 * proc.c 1052 * proc.c
1053 */ 1053 */
1054extern const struct file_operations rxrpc_call_seq_fops; 1054extern const struct seq_operations rxrpc_call_seq_ops;
1055extern const struct file_operations rxrpc_connection_seq_fops; 1055extern const struct seq_operations rxrpc_connection_seq_ops;
1056 1056
1057/* 1057/*
1058 * recvmsg.c 1058 * recvmsg.c
diff --git a/net/rxrpc/net_ns.c b/net/rxrpc/net_ns.c
index c7a023fb22d0..5d6a773db973 100644
--- a/net/rxrpc/net_ns.c
+++ b/net/rxrpc/net_ns.c
@@ -97,8 +97,11 @@ static __net_init int rxrpc_init_net(struct net *net)
97 if (!rxnet->proc_net) 97 if (!rxnet->proc_net)
98 goto err_proc; 98 goto err_proc;
99 99
100 proc_create("calls", 0444, rxnet->proc_net, &rxrpc_call_seq_fops); 100 proc_create_net("calls", 0444, rxnet->proc_net, &rxrpc_call_seq_ops,
101 proc_create("conns", 0444, rxnet->proc_net, &rxrpc_connection_seq_fops); 101 sizeof(struct seq_net_private));
102 proc_create_net("conns", 0444, rxnet->proc_net,
103 &rxrpc_connection_seq_ops,
104 sizeof(struct seq_net_private));
102 return 0; 105 return 0;
103 106
104err_proc: 107err_proc:
diff --git a/net/rxrpc/proc.c b/net/rxrpc/proc.c
index 7e45db058823..d9fca8c4bcdc 100644
--- a/net/rxrpc/proc.c
+++ b/net/rxrpc/proc.c
@@ -115,26 +115,13 @@ static int rxrpc_call_seq_show(struct seq_file *seq, void *v)
115 return 0; 115 return 0;
116} 116}
117 117
118static const struct seq_operations rxrpc_call_seq_ops = { 118const struct seq_operations rxrpc_call_seq_ops = {
119 .start = rxrpc_call_seq_start, 119 .start = rxrpc_call_seq_start,
120 .next = rxrpc_call_seq_next, 120 .next = rxrpc_call_seq_next,
121 .stop = rxrpc_call_seq_stop, 121 .stop = rxrpc_call_seq_stop,
122 .show = rxrpc_call_seq_show, 122 .show = rxrpc_call_seq_show,
123}; 123};
124 124
125static int rxrpc_call_seq_open(struct inode *inode, struct file *file)
126{
127 return seq_open_net(inode, file, &rxrpc_call_seq_ops,
128 sizeof(struct seq_net_private));
129}
130
131const struct file_operations rxrpc_call_seq_fops = {
132 .open = rxrpc_call_seq_open,
133 .read = seq_read,
134 .llseek = seq_lseek,
135 .release = seq_release,
136};
137
138/* 125/*
139 * generate a list of extant virtual connections in /proc/net/rxrpc_conns 126 * generate a list of extant virtual connections in /proc/net/rxrpc_conns
140 */ 127 */
@@ -207,23 +194,9 @@ print:
207 return 0; 194 return 0;
208} 195}
209 196
210static const struct seq_operations rxrpc_connection_seq_ops = { 197const struct seq_operations rxrpc_connection_seq_ops = {
211 .start = rxrpc_connection_seq_start, 198 .start = rxrpc_connection_seq_start,
212 .next = rxrpc_connection_seq_next, 199 .next = rxrpc_connection_seq_next,
213 .stop = rxrpc_connection_seq_stop, 200 .stop = rxrpc_connection_seq_stop,
214 .show = rxrpc_connection_seq_show, 201 .show = rxrpc_connection_seq_show,
215}; 202};
216
217
218static int rxrpc_connection_seq_open(struct inode *inode, struct file *file)
219{
220 return seq_open_net(inode, file, &rxrpc_connection_seq_ops,
221 sizeof(struct seq_net_private));
222}
223
224const struct file_operations rxrpc_connection_seq_fops = {
225 .open = rxrpc_connection_seq_open,
226 .read = seq_read,
227 .llseek = seq_lseek,
228 .release = seq_release,
229};
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c
index 106dae7e4818..54eca685420f 100644
--- a/net/sched/sch_api.c
+++ b/net/sched/sch_api.c
@@ -2092,23 +2092,11 @@ static int psched_show(struct seq_file *seq, void *v)
2092 return 0; 2092 return 0;
2093} 2093}
2094 2094
2095static int psched_open(struct inode *inode, struct file *file)
2096{
2097 return single_open(file, psched_show, NULL);
2098}
2099
2100static const struct file_operations psched_fops = {
2101 .open = psched_open,
2102 .read = seq_read,
2103 .llseek = seq_lseek,
2104 .release = single_release,
2105};
2106
2107static int __net_init psched_net_init(struct net *net) 2095static int __net_init psched_net_init(struct net *net)
2108{ 2096{
2109 struct proc_dir_entry *e; 2097 struct proc_dir_entry *e;
2110 2098
2111 e = proc_create("psched", 0, net->proc_net, &psched_fops); 2099 e = proc_create_single("psched", 0, net->proc_net, psched_show);
2112 if (e == NULL) 2100 if (e == NULL)
2113 return -ENOMEM; 2101 return -ENOMEM;
2114 2102
diff --git a/net/sctp/objcnt.c b/net/sctp/objcnt.c
index fd2684ad94c8..a6179b26b80c 100644
--- a/net/sctp/objcnt.c
+++ b/net/sctp/objcnt.c
@@ -108,25 +108,13 @@ static const struct seq_operations sctp_objcnt_seq_ops = {
108 .show = sctp_objcnt_seq_show, 108 .show = sctp_objcnt_seq_show,
109}; 109};
110 110
111static int sctp_objcnt_seq_open(struct inode *inode, struct file *file)
112{
113 return seq_open(file, &sctp_objcnt_seq_ops);
114}
115
116static const struct file_operations sctp_objcnt_ops = {
117 .open = sctp_objcnt_seq_open,
118 .read = seq_read,
119 .llseek = seq_lseek,
120 .release = seq_release,
121};
122
123/* Initialize the objcount in the proc filesystem. */ 111/* Initialize the objcount in the proc filesystem. */
124void sctp_dbg_objcnt_init(struct net *net) 112void sctp_dbg_objcnt_init(struct net *net)
125{ 113{
126 struct proc_dir_entry *ent; 114 struct proc_dir_entry *ent;
127 115
128 ent = proc_create("sctp_dbg_objcnt", 0, 116 ent = proc_create_seq("sctp_dbg_objcnt", 0,
129 net->sctp.proc_net_sctp, &sctp_objcnt_ops); 117 net->sctp.proc_net_sctp, &sctp_objcnt_seq_ops);
130 if (!ent) 118 if (!ent)
131 pr_warn("sctp_dbg_objcnt: Unable to create /proc entry.\n"); 119 pr_warn("sctp_dbg_objcnt: Unable to create /proc entry.\n");
132} 120}
diff --git a/net/sctp/proc.c b/net/sctp/proc.c
index 1d9ccc6dab2b..ef5c9a82d4e8 100644
--- a/net/sctp/proc.c
+++ b/net/sctp/proc.c
@@ -88,19 +88,6 @@ static int sctp_snmp_seq_show(struct seq_file *seq, void *v)
88 return 0; 88 return 0;
89} 89}
90 90
91/* Initialize the seq file operations for 'snmp' object. */
92static int sctp_snmp_seq_open(struct inode *inode, struct file *file)
93{
94 return single_open_net(inode, file, sctp_snmp_seq_show);
95}
96
97static const struct file_operations sctp_snmp_seq_fops = {
98 .open = sctp_snmp_seq_open,
99 .read = seq_read,
100 .llseek = seq_lseek,
101 .release = single_release_net,
102};
103
104/* Dump local addresses of an association/endpoint. */ 91/* Dump local addresses of an association/endpoint. */
105static void sctp_seq_dump_local_addrs(struct seq_file *seq, struct sctp_ep_common *epb) 92static void sctp_seq_dump_local_addrs(struct seq_file *seq, struct sctp_ep_common *epb)
106{ 93{
@@ -225,21 +212,6 @@ static const struct seq_operations sctp_eps_ops = {
225 .show = sctp_eps_seq_show, 212 .show = sctp_eps_seq_show,
226}; 213};
227 214
228
229/* Initialize the seq file operations for 'eps' object. */
230static int sctp_eps_seq_open(struct inode *inode, struct file *file)
231{
232 return seq_open_net(inode, file, &sctp_eps_ops,
233 sizeof(struct seq_net_private));
234}
235
236static const struct file_operations sctp_eps_seq_fops = {
237 .open = sctp_eps_seq_open,
238 .read = seq_read,
239 .llseek = seq_lseek,
240 .release = seq_release_net,
241};
242
243struct sctp_ht_iter { 215struct sctp_ht_iter {
244 struct seq_net_private p; 216 struct seq_net_private p;
245 struct rhashtable_iter hti; 217 struct rhashtable_iter hti;
@@ -338,20 +310,6 @@ static const struct seq_operations sctp_assoc_ops = {
338 .show = sctp_assocs_seq_show, 310 .show = sctp_assocs_seq_show,
339}; 311};
340 312
341/* Initialize the seq file operations for 'assocs' object. */
342static int sctp_assocs_seq_open(struct inode *inode, struct file *file)
343{
344 return seq_open_net(inode, file, &sctp_assoc_ops,
345 sizeof(struct sctp_ht_iter));
346}
347
348static const struct file_operations sctp_assocs_seq_fops = {
349 .open = sctp_assocs_seq_open,
350 .read = seq_read,
351 .llseek = seq_lseek,
352 .release = seq_release_net,
353};
354
355static int sctp_remaddr_seq_show(struct seq_file *seq, void *v) 313static int sctp_remaddr_seq_show(struct seq_file *seq, void *v)
356{ 314{
357 struct sctp_association *assoc; 315 struct sctp_association *assoc;
@@ -431,36 +389,23 @@ static const struct seq_operations sctp_remaddr_ops = {
431 .show = sctp_remaddr_seq_show, 389 .show = sctp_remaddr_seq_show,
432}; 390};
433 391
434static int sctp_remaddr_seq_open(struct inode *inode, struct file *file)
435{
436 return seq_open_net(inode, file, &sctp_remaddr_ops,
437 sizeof(struct sctp_ht_iter));
438}
439
440static const struct file_operations sctp_remaddr_seq_fops = {
441 .open = sctp_remaddr_seq_open,
442 .read = seq_read,
443 .llseek = seq_lseek,
444 .release = seq_release_net,
445};
446
447/* Set up the proc fs entry for the SCTP protocol. */ 392/* Set up the proc fs entry for the SCTP protocol. */
448int __net_init sctp_proc_init(struct net *net) 393int __net_init sctp_proc_init(struct net *net)
449{ 394{
450 net->sctp.proc_net_sctp = proc_net_mkdir(net, "sctp", net->proc_net); 395 net->sctp.proc_net_sctp = proc_net_mkdir(net, "sctp", net->proc_net);
451 if (!net->sctp.proc_net_sctp) 396 if (!net->sctp.proc_net_sctp)
452 return -ENOMEM; 397 return -ENOMEM;
453 if (!proc_create("snmp", 0444, net->sctp.proc_net_sctp, 398 if (!proc_create_net_single("snmp", 0444, net->sctp.proc_net_sctp,
454 &sctp_snmp_seq_fops)) 399 sctp_snmp_seq_show, NULL))
455 goto cleanup; 400 goto cleanup;
456 if (!proc_create("eps", 0444, net->sctp.proc_net_sctp, 401 if (!proc_create_net("eps", 0444, net->sctp.proc_net_sctp,
457 &sctp_eps_seq_fops)) 402 &sctp_eps_ops, sizeof(struct seq_net_private)))
458 goto cleanup; 403 goto cleanup;
459 if (!proc_create("assocs", 0444, net->sctp.proc_net_sctp, 404 if (!proc_create_net("assocs", 0444, net->sctp.proc_net_sctp,
460 &sctp_assocs_seq_fops)) 405 &sctp_assoc_ops, sizeof(struct sctp_ht_iter)))
461 goto cleanup; 406 goto cleanup;
462 if (!proc_create("remaddr", 0444, net->sctp.proc_net_sctp, 407 if (!proc_create_net("remaddr", 0444, net->sctp.proc_net_sctp,
463 &sctp_remaddr_seq_fops)) 408 &sctp_remaddr_ops, sizeof(struct sctp_ht_iter)))
464 goto cleanup; 409 goto cleanup;
465 return 0; 410 return 0;
466 411
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
index 68bb70a62afe..e5473c03d667 100644
--- a/net/unix/af_unix.c
+++ b/net/unix/af_unix.c
@@ -2852,20 +2852,6 @@ static const struct seq_operations unix_seq_ops = {
2852 .stop = unix_seq_stop, 2852 .stop = unix_seq_stop,
2853 .show = unix_seq_show, 2853 .show = unix_seq_show,
2854}; 2854};
2855
2856static int unix_seq_open(struct inode *inode, struct file *file)
2857{
2858 return seq_open_net(inode, file, &unix_seq_ops,
2859 sizeof(struct seq_net_private));
2860}
2861
2862static const struct file_operations unix_seq_fops = {
2863 .open = unix_seq_open,
2864 .read = seq_read,
2865 .llseek = seq_lseek,
2866 .release = seq_release_net,
2867};
2868
2869#endif 2855#endif
2870 2856
2871static const struct net_proto_family unix_family_ops = { 2857static const struct net_proto_family unix_family_ops = {
@@ -2884,7 +2870,8 @@ static int __net_init unix_net_init(struct net *net)
2884 goto out; 2870 goto out;
2885 2871
2886#ifdef CONFIG_PROC_FS 2872#ifdef CONFIG_PROC_FS
2887 if (!proc_create("unix", 0, net->proc_net, &unix_seq_fops)) { 2873 if (!proc_create_net("unix", 0, net->proc_net, &unix_seq_ops,
2874 sizeof(struct seq_net_private))) {
2888 unix_sysctl_unregister(net); 2875 unix_sysctl_unregister(net);
2889 goto out; 2876 goto out;
2890 } 2877 }
diff --git a/net/wireless/wext-proc.c b/net/wireless/wext-proc.c
index b4c464594a5e..cadcf8613af2 100644
--- a/net/wireless/wext-proc.c
+++ b/net/wireless/wext-proc.c
@@ -126,24 +126,11 @@ static const struct seq_operations wireless_seq_ops = {
126 .show = wireless_dev_seq_show, 126 .show = wireless_dev_seq_show,
127}; 127};
128 128
129static int seq_open_wireless(struct inode *inode, struct file *file)
130{
131 return seq_open_net(inode, file, &wireless_seq_ops,
132 sizeof(struct seq_net_private));
133}
134
135static const struct file_operations wireless_seq_fops = {
136 .open = seq_open_wireless,
137 .read = seq_read,
138 .llseek = seq_lseek,
139 .release = seq_release_net,
140};
141
142int __net_init wext_proc_init(struct net *net) 129int __net_init wext_proc_init(struct net *net)
143{ 130{
144 /* Create /proc/net/wireless entry */ 131 /* Create /proc/net/wireless entry */
145 if (!proc_create("wireless", 0444, net->proc_net, 132 if (!proc_create_net("wireless", 0444, net->proc_net,
146 &wireless_seq_fops)) 133 &wireless_seq_ops, sizeof(struct seq_net_private)))
147 return -ENOMEM; 134 return -ENOMEM;
148 135
149 return 0; 136 return 0;
diff --git a/net/x25/x25_proc.c b/net/x25/x25_proc.c
index 64b415e93f6a..da52c9dc256c 100644
--- a/net/x25/x25_proc.c
+++ b/net/x25/x25_proc.c
@@ -171,57 +171,21 @@ static const struct seq_operations x25_seq_forward_ops = {
171 .show = x25_seq_forward_show, 171 .show = x25_seq_forward_show,
172}; 172};
173 173
174static int x25_seq_socket_open(struct inode *inode, struct file *file)
175{
176 return seq_open(file, &x25_seq_socket_ops);
177}
178
179static int x25_seq_route_open(struct inode *inode, struct file *file)
180{
181 return seq_open(file, &x25_seq_route_ops);
182}
183
184static int x25_seq_forward_open(struct inode *inode, struct file *file)
185{
186 return seq_open(file, &x25_seq_forward_ops);
187}
188
189static const struct file_operations x25_seq_socket_fops = {
190 .open = x25_seq_socket_open,
191 .read = seq_read,
192 .llseek = seq_lseek,
193 .release = seq_release,
194};
195
196static const struct file_operations x25_seq_route_fops = {
197 .open = x25_seq_route_open,
198 .read = seq_read,
199 .llseek = seq_lseek,
200 .release = seq_release,
201};
202
203static const struct file_operations x25_seq_forward_fops = {
204 .open = x25_seq_forward_open,
205 .read = seq_read,
206 .llseek = seq_lseek,
207 .release = seq_release,
208};
209
210int __init x25_proc_init(void) 174int __init x25_proc_init(void)
211{ 175{
212 if (!proc_mkdir("x25", init_net.proc_net)) 176 if (!proc_mkdir("x25", init_net.proc_net))
213 return -ENOMEM; 177 return -ENOMEM;
214 178
215 if (!proc_create("x25/route", 0444, init_net.proc_net, 179 if (!proc_create_seq("x25/route", 0444, init_net.proc_net,
216 &x25_seq_route_fops)) 180 &x25_seq_route_ops))
217 goto out; 181 goto out;
218 182
219 if (!proc_create("x25/socket", 0444, init_net.proc_net, 183 if (!proc_create_seq("x25/socket", 0444, init_net.proc_net,
220 &x25_seq_socket_fops)) 184 &x25_seq_socket_ops))
221 goto out; 185 goto out;
222 186
223 if (!proc_create("x25/forward", 0444, init_net.proc_net, 187 if (!proc_create_seq("x25/forward", 0444, init_net.proc_net,
224 &x25_seq_forward_fops)) 188 &x25_seq_forward_ops))
225 goto out; 189 goto out;
226 return 0; 190 return 0;
227 191
diff --git a/net/xfrm/xfrm_proc.c b/net/xfrm/xfrm_proc.c
index ed06903cd84d..178318d2e120 100644
--- a/net/xfrm/xfrm_proc.c
+++ b/net/xfrm/xfrm_proc.c
@@ -65,22 +65,10 @@ static int xfrm_statistics_seq_show(struct seq_file *seq, void *v)
65 return 0; 65 return 0;
66} 66}
67 67
68static int xfrm_statistics_seq_open(struct inode *inode, struct file *file)
69{
70 return single_open_net(inode, file, xfrm_statistics_seq_show);
71}
72
73static const struct file_operations xfrm_statistics_seq_fops = {
74 .open = xfrm_statistics_seq_open,
75 .read = seq_read,
76 .llseek = seq_lseek,
77 .release = single_release_net,
78};
79
80int __net_init xfrm_proc_init(struct net *net) 68int __net_init xfrm_proc_init(struct net *net)
81{ 69{
82 if (!proc_create("xfrm_stat", 0444, net->proc_net, 70 if (!proc_create_net_single("xfrm_stat", 0444, net->proc_net,
83 &xfrm_statistics_seq_fops)) 71 xfrm_statistics_seq_show, NULL))
84 return -ENOMEM; 72 return -ENOMEM;
85 return 0; 73 return 0;
86} 74}