hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/fs/proc/proc_net.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * linux/fs/proc/net.c
34 *
....@@ -73,13 +74,32 @@
7374 return 0;
7475 }
7576
76
-static const struct file_operations proc_net_seq_fops = {
77
- .open = seq_open_net,
78
- .read = seq_read,
79
- .write = proc_simple_write,
80
- .llseek = seq_lseek,
81
- .release = seq_release_net,
77
+static const struct proc_ops proc_net_seq_ops = {
78
+ .proc_open = seq_open_net,
79
+ .proc_read = seq_read,
80
+ .proc_write = proc_simple_write,
81
+ .proc_lseek = seq_lseek,
82
+ .proc_release = seq_release_net,
8283 };
84
+
85
+int bpf_iter_init_seq_net(void *priv_data, struct bpf_iter_aux_info *aux)
86
+{
87
+#ifdef CONFIG_NET_NS
88
+ struct seq_net_private *p = priv_data;
89
+
90
+ p->net = get_net(current->nsproxy->net_ns);
91
+#endif
92
+ return 0;
93
+}
94
+
95
+void bpf_iter_fini_seq_net(void *priv_data)
96
+{
97
+#ifdef CONFIG_NET_NS
98
+ struct seq_net_private *p = priv_data;
99
+
100
+ put_net(p->net);
101
+#endif
102
+}
83103
84104 struct proc_dir_entry *proc_create_net_data(const char *name, umode_t mode,
85105 struct proc_dir_entry *parent, const struct seq_operations *ops,
....@@ -91,7 +111,7 @@
91111 if (!p)
92112 return NULL;
93113 pde_force_lookup(p);
94
- p->proc_fops = &proc_net_seq_fops;
114
+ p->proc_ops = &proc_net_seq_ops;
95115 p->seq_ops = ops;
96116 p->state_size = state_size;
97117 return proc_register(parent, p);
....@@ -135,7 +155,7 @@
135155 if (!p)
136156 return NULL;
137157 pde_force_lookup(p);
138
- p->proc_fops = &proc_net_seq_fops;
158
+ p->proc_ops = &proc_net_seq_ops;
139159 p->seq_ops = ops;
140160 p->state_size = state_size;
141161 p->write = write;
....@@ -166,12 +186,12 @@
166186 return single_release(ino, f);
167187 }
168188
169
-static const struct file_operations proc_net_single_fops = {
170
- .open = single_open_net,
171
- .read = seq_read,
172
- .write = proc_simple_write,
173
- .llseek = seq_lseek,
174
- .release = single_release_net,
189
+static const struct proc_ops proc_net_single_ops = {
190
+ .proc_open = single_open_net,
191
+ .proc_read = seq_read,
192
+ .proc_write = proc_simple_write,
193
+ .proc_lseek = seq_lseek,
194
+ .proc_release = single_release_net,
175195 };
176196
177197 struct proc_dir_entry *proc_create_net_single(const char *name, umode_t mode,
....@@ -184,7 +204,7 @@
184204 if (!p)
185205 return NULL;
186206 pde_force_lookup(p);
187
- p->proc_fops = &proc_net_single_fops;
207
+ p->proc_ops = &proc_net_single_ops;
188208 p->single_show = show;
189209 return proc_register(parent, p);
190210 }
....@@ -227,7 +247,7 @@
227247 if (!p)
228248 return NULL;
229249 pde_force_lookup(p);
230
- p->proc_fops = &proc_net_single_fops;
250
+ p->proc_ops = &proc_net_single_ops;
231251 p->single_show = show;
232252 p->write = write;
233253 return proc_register(parent, p);
....@@ -342,6 +362,9 @@
342362
343363 proc_set_user(netd, uid, gid);
344364
365
+ /* Seed dentry revalidation for /proc/${pid}/net */
366
+ pde_force_lookup(netd);
367
+
345368 err = -EEXIST;
346369 net_statd = proc_net_mkdir(net, "stat", netd);
347370 if (!net_statd)