Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0-or-later */
2 : : /* Internal procfs definitions
3 : : *
4 : : * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
5 : : * Written by David Howells (dhowells@redhat.com)
6 : : */
7 : :
8 : : #include <linux/proc_fs.h>
9 : : #include <linux/proc_ns.h>
10 : : #include <linux/refcount.h>
11 : : #include <linux/spinlock.h>
12 : : #include <linux/atomic.h>
13 : : #include <linux/binfmts.h>
14 : : #include <linux/sched/coredump.h>
15 : : #include <linux/sched/task.h>
16 : :
17 : : struct ctl_table_header;
18 : : struct mempolicy;
19 : :
20 : : /*
21 : : * This is not completely implemented yet. The idea is to
22 : : * create an in-memory tree (like the actual /proc filesystem
23 : : * tree) of these proc_dir_entries, so that we can dynamically
24 : : * add new files to /proc.
25 : : *
26 : : * parent/subdir are used for the directory structure (every /proc file has a
27 : : * parent, but "subdir" is empty for all non-directory entries).
28 : : * subdir_node is used to build the rb tree "subdir" of the parent.
29 : : */
30 : : struct proc_dir_entry {
31 : : /*
32 : : * number of callers into module in progress;
33 : : * negative -> it's going away RSN
34 : : */
35 : : atomic_t in_use;
36 : : refcount_t refcnt;
37 : : struct list_head pde_openers; /* who did ->open, but not ->release */
38 : : /* protects ->pde_openers and all struct pde_opener instances */
39 : : spinlock_t pde_unload_lock;
40 : : struct completion *pde_unload_completion;
41 : : const struct inode_operations *proc_iops;
42 : : union {
43 : : const struct proc_ops *proc_ops;
44 : : const struct file_operations *proc_dir_ops;
45 : : };
46 : : const struct dentry_operations *proc_dops;
47 : : union {
48 : : const struct seq_operations *seq_ops;
49 : : int (*single_show)(struct seq_file *, void *);
50 : : };
51 : : proc_write_t write;
52 : : void *data;
53 : : unsigned int state_size;
54 : : unsigned int low_ino;
55 : : nlink_t nlink;
56 : : kuid_t uid;
57 : : kgid_t gid;
58 : : loff_t size;
59 : : struct proc_dir_entry *parent;
60 : : struct rb_root subdir;
61 : : struct rb_node subdir_node;
62 : : char *name;
63 : : umode_t mode;
64 : : u8 namelen;
65 : : char inline_name[];
66 : : } __randomize_layout;
67 : :
68 : : #define SIZEOF_PDE ( \
69 : : sizeof(struct proc_dir_entry) < 128 ? 128 : \
70 : : sizeof(struct proc_dir_entry) < 192 ? 192 : \
71 : : sizeof(struct proc_dir_entry) < 256 ? 256 : \
72 : : sizeof(struct proc_dir_entry) < 512 ? 512 : \
73 : : 0)
74 : : #define SIZEOF_PDE_INLINE_NAME (SIZEOF_PDE - sizeof(struct proc_dir_entry))
75 : :
76 : : extern struct kmem_cache *proc_dir_entry_cache;
77 : : void pde_free(struct proc_dir_entry *pde);
78 : :
79 : : union proc_op {
80 : : int (*proc_get_link)(struct dentry *, struct path *);
81 : : int (*proc_show)(struct seq_file *m,
82 : : struct pid_namespace *ns, struct pid *pid,
83 : : struct task_struct *task);
84 : : const char *lsm;
85 : : };
86 : :
87 : : struct proc_inode {
88 : : struct pid *pid;
89 : : unsigned int fd;
90 : : union proc_op op;
91 : : struct proc_dir_entry *pde;
92 : : struct ctl_table_header *sysctl;
93 : : struct ctl_table *sysctl_entry;
94 : : struct hlist_node sysctl_inodes;
95 : : const struct proc_ns_operations *ns_ops;
96 : : struct inode vfs_inode;
97 : : } __randomize_layout;
98 : :
99 : : /*
100 : : * General functions
101 : : */
102 : 211966 : static inline struct proc_inode *PROC_I(const struct inode *inode)
103 : : {
104 [ + + + + : 117350 : return container_of(inode, struct proc_inode, vfs_inode);
- + + + +
+ - - - +
+ - - + -
+ - + - +
+ + - - ]
105 : : }
106 : :
107 : 25493 : static inline struct proc_dir_entry *PDE(const struct inode *inode)
108 : : {
109 [ + + - - : 25493 : return PROC_I(inode)->pde;
- - + - ]
110 : : }
111 : :
112 : 0 : static inline void *__PDE_DATA(const struct inode *inode)
113 : : {
114 : 0 : return PDE(inode)->data;
115 : : }
116 : :
117 : 75578 : static inline struct pid *proc_pid(const struct inode *inode)
118 : : {
119 [ - - ]: 3192 : return PROC_I(inode)->pid;
120 : : }
121 : :
122 : 45580 : static inline struct task_struct *get_proc_task(const struct inode *inode)
123 : : {
124 : 45580 : return get_pid_task(proc_pid(inode), PIDTYPE_PID);
125 : : }
126 : :
127 : : void task_dump_owner(struct task_struct *task, umode_t mode,
128 : : kuid_t *ruid, kgid_t *rgid);
129 : :
130 : : unsigned name_to_int(const struct qstr *qstr);
131 : : /*
132 : : * Offset of the first process in the /proc root directory..
133 : : */
134 : : #define FIRST_PROCESS_ENTRY 256
135 : :
136 : : /* Worst case buffer size needed for holding an integer. */
137 : : #define PROC_NUMBUF 13
138 : :
139 : : /*
140 : : * array.c
141 : : */
142 : : extern const struct file_operations proc_tid_children_operations;
143 : :
144 : : extern void proc_task_name(struct seq_file *m, struct task_struct *p,
145 : : bool escape);
146 : : extern int proc_tid_stat(struct seq_file *, struct pid_namespace *,
147 : : struct pid *, struct task_struct *);
148 : : extern int proc_tgid_stat(struct seq_file *, struct pid_namespace *,
149 : : struct pid *, struct task_struct *);
150 : : extern int proc_pid_status(struct seq_file *, struct pid_namespace *,
151 : : struct pid *, struct task_struct *);
152 : : extern int proc_pid_statm(struct seq_file *, struct pid_namespace *,
153 : : struct pid *, struct task_struct *);
154 : :
155 : : /*
156 : : * base.c
157 : : */
158 : : extern const struct dentry_operations pid_dentry_operations;
159 : : extern int pid_getattr(const struct path *, struct kstat *, u32, unsigned int);
160 : : extern int proc_setattr(struct dentry *, struct iattr *);
161 : : extern struct inode *proc_pid_make_inode(struct super_block *, struct task_struct *, umode_t);
162 : : extern void pid_update_inode(struct task_struct *, struct inode *);
163 : : extern int pid_delete_dentry(const struct dentry *);
164 : : extern int proc_pid_readdir(struct file *, struct dir_context *);
165 : : struct dentry *proc_pid_lookup(struct dentry *, unsigned int);
166 : : extern loff_t mem_lseek(struct file *, loff_t, int);
167 : :
168 : : /* Lookups */
169 : : typedef struct dentry *instantiate_t(struct dentry *,
170 : : struct task_struct *, const void *);
171 : : bool proc_fill_cache(struct file *, struct dir_context *, const char *, unsigned int,
172 : : instantiate_t, struct task_struct *, const void *);
173 : :
174 : : /*
175 : : * generic.c
176 : : */
177 : : struct proc_dir_entry *proc_create_reg(const char *name, umode_t mode,
178 : : struct proc_dir_entry **parent, void *data);
179 : : struct proc_dir_entry *proc_register(struct proc_dir_entry *dir,
180 : : struct proc_dir_entry *dp);
181 : : extern struct dentry *proc_lookup(struct inode *, struct dentry *, unsigned int);
182 : : struct dentry *proc_lookup_de(struct inode *, struct dentry *, struct proc_dir_entry *);
183 : : extern int proc_readdir(struct file *, struct dir_context *);
184 : : int proc_readdir_de(struct file *, struct dir_context *, struct proc_dir_entry *);
185 : :
186 : 364 : static inline struct proc_dir_entry *pde_get(struct proc_dir_entry *pde)
187 : : {
188 : 364 : refcount_inc(&pde->refcnt);
189 : 364 : return pde;
190 : : }
191 : : extern void pde_put(struct proc_dir_entry *);
192 : :
193 : 4797 : static inline bool is_empty_pde(const struct proc_dir_entry *pde)
194 : : {
195 [ + + + - : 9594 : return S_ISDIR(pde->mode) && !pde->proc_iops;
- + ]
196 : : }
197 : : extern ssize_t proc_simple_write(struct file *, const char __user *, size_t, loff_t *);
198 : :
199 : : /*
200 : : * inode.c
201 : : */
202 : : struct pde_opener {
203 : : struct list_head lh;
204 : : struct file *file;
205 : : bool closing;
206 : : struct completion *c;
207 : : } __randomize_layout;
208 : : extern const struct inode_operations proc_link_inode_operations;
209 : : extern const struct inode_operations proc_pid_link_inode_operations;
210 : : extern const struct super_operations proc_sops;
211 : :
212 : : void proc_init_kmemcache(void);
213 : : void set_proc_pid_nlink(void);
214 : : extern struct inode *proc_get_inode(struct super_block *, struct proc_dir_entry *);
215 : : extern void proc_entry_rundown(struct proc_dir_entry *);
216 : :
217 : : /*
218 : : * proc_namespaces.c
219 : : */
220 : : extern const struct inode_operations proc_ns_dir_inode_operations;
221 : : extern const struct file_operations proc_ns_dir_operations;
222 : :
223 : : /*
224 : : * proc_net.c
225 : : */
226 : : extern const struct file_operations proc_net_operations;
227 : : extern const struct inode_operations proc_net_inode_operations;
228 : :
229 : : #ifdef CONFIG_NET
230 : : extern int proc_net_init(void);
231 : : #else
232 : : static inline int proc_net_init(void) { return 0; }
233 : : #endif
234 : :
235 : : /*
236 : : * proc_self.c
237 : : */
238 : : extern int proc_setup_self(struct super_block *);
239 : :
240 : : /*
241 : : * proc_thread_self.c
242 : : */
243 : : extern int proc_setup_thread_self(struct super_block *);
244 : : extern void proc_thread_self_init(void);
245 : :
246 : : /*
247 : : * proc_sysctl.c
248 : : */
249 : : #ifdef CONFIG_PROC_SYSCTL
250 : : extern int proc_sys_init(void);
251 : : extern void proc_sys_evict_inode(struct inode *inode,
252 : : struct ctl_table_header *head);
253 : : #else
254 : : static inline void proc_sys_init(void) { }
255 : : static inline void proc_sys_evict_inode(struct inode *inode,
256 : : struct ctl_table_header *head) { }
257 : : #endif
258 : :
259 : : /*
260 : : * proc_tty.c
261 : : */
262 : : #ifdef CONFIG_TTY
263 : : extern void proc_tty_init(void);
264 : : #else
265 : : static inline void proc_tty_init(void) {}
266 : : #endif
267 : :
268 : : /*
269 : : * root.c
270 : : */
271 : : extern struct proc_dir_entry proc_root;
272 : :
273 : : extern void proc_self_init(void);
274 : :
275 : : /*
276 : : * task_[no]mmu.c
277 : : */
278 : : struct mem_size_stats;
279 : : struct proc_maps_private {
280 : : struct inode *inode;
281 : : struct task_struct *task;
282 : : struct mm_struct *mm;
283 : : #ifdef CONFIG_MMU
284 : : struct vm_area_struct *tail_vma;
285 : : #endif
286 : : #ifdef CONFIG_NUMA
287 : : struct mempolicy *task_mempolicy;
288 : : #endif
289 : : } __randomize_layout;
290 : :
291 : : struct mm_struct *proc_mem_open(struct inode *inode, unsigned int mode);
292 : :
293 : : extern const struct file_operations proc_pid_maps_operations;
294 : : extern const struct file_operations proc_pid_numa_maps_operations;
295 : : extern const struct file_operations proc_pid_smaps_operations;
296 : : extern const struct file_operations proc_pid_smaps_rollup_operations;
297 : : extern const struct file_operations proc_clear_refs_operations;
298 : : extern const struct file_operations proc_pagemap_operations;
299 : :
300 : : extern unsigned long task_vsize(struct mm_struct *);
301 : : extern unsigned long task_statm(struct mm_struct *,
302 : : unsigned long *, unsigned long *,
303 : : unsigned long *, unsigned long *);
304 : : extern void task_mem(struct seq_file *, struct mm_struct *);
|