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 : : const struct file_operations *proc_fops;
43 : : const struct dentry_operations *proc_dops;
44 : : union {
45 : : const struct seq_operations *seq_ops;
46 : : int (*single_show)(struct seq_file *, void *);
47 : : };
48 : : proc_write_t write;
49 : : void *data;
50 : : unsigned int state_size;
51 : : unsigned int low_ino;
52 : : nlink_t nlink;
53 : : kuid_t uid;
54 : : kgid_t gid;
55 : : loff_t size;
56 : : struct proc_dir_entry *parent;
57 : : struct rb_root subdir;
58 : : struct rb_node subdir_node;
59 : : char *name;
60 : : umode_t mode;
61 : : u8 namelen;
62 : : char inline_name[];
63 : : } __randomize_layout;
64 : :
65 : : #define SIZEOF_PDE ( \
66 : : sizeof(struct proc_dir_entry) < 128 ? 128 : \
67 : : sizeof(struct proc_dir_entry) < 192 ? 192 : \
68 : : sizeof(struct proc_dir_entry) < 256 ? 256 : \
69 : : sizeof(struct proc_dir_entry) < 512 ? 512 : \
70 : : 0)
71 : : #define SIZEOF_PDE_INLINE_NAME (SIZEOF_PDE - sizeof(struct proc_dir_entry))
72 : :
73 : : extern struct kmem_cache *proc_dir_entry_cache;
74 : : void pde_free(struct proc_dir_entry *pde);
75 : :
76 : : union proc_op {
77 : : int (*proc_get_link)(struct dentry *, struct path *);
78 : : int (*proc_show)(struct seq_file *m,
79 : : struct pid_namespace *ns, struct pid *pid,
80 : : struct task_struct *task);
81 : : const char *lsm;
82 : : };
83 : :
84 : : struct proc_inode {
85 : : struct pid *pid;
86 : : unsigned int fd;
87 : : union proc_op op;
88 : : struct proc_dir_entry *pde;
89 : : struct ctl_table_header *sysctl;
90 : : struct ctl_table *sysctl_entry;
91 : : struct hlist_node sysctl_inodes;
92 : : const struct proc_ns_operations *ns_ops;
93 : : struct inode vfs_inode;
94 : : } __randomize_layout;
95 : :
96 : : /*
97 : : * General functions
98 : : */
99 : : static inline struct proc_inode *PROC_I(const struct inode *inode)
100 : : {
101 : 1353432 : return container_of(inode, struct proc_inode, vfs_inode);
102 : : }
103 : :
104 : : static inline struct proc_dir_entry *PDE(const struct inode *inode)
105 : : {
106 : 2084683 : return PROC_I(inode)->pde;
107 : : }
108 : :
109 : : static inline void *__PDE_DATA(const struct inode *inode)
110 : : {
111 : 0 : return PDE(inode)->data;
112 : : }
113 : :
114 : : static inline struct pid *proc_pid(const struct inode *inode)
115 : : {
116 : 4526943 : return PROC_I(inode)->pid;
117 : : }
118 : :
119 : : static inline struct task_struct *get_proc_task(const struct inode *inode)
120 : : {
121 : 2809742 : return get_pid_task(proc_pid(inode), PIDTYPE_PID);
122 : : }
123 : :
124 : : void task_dump_owner(struct task_struct *task, umode_t mode,
125 : : kuid_t *ruid, kgid_t *rgid);
126 : :
127 : : unsigned name_to_int(const struct qstr *qstr);
128 : : /*
129 : : * Offset of the first process in the /proc root directory..
130 : : */
131 : : #define FIRST_PROCESS_ENTRY 256
132 : :
133 : : /* Worst case buffer size needed for holding an integer. */
134 : : #define PROC_NUMBUF 13
135 : :
136 : : /*
137 : : * array.c
138 : : */
139 : : extern const struct file_operations proc_tid_children_operations;
140 : :
141 : : extern void proc_task_name(struct seq_file *m, struct task_struct *p,
142 : : bool escape);
143 : : extern int proc_tid_stat(struct seq_file *, struct pid_namespace *,
144 : : struct pid *, struct task_struct *);
145 : : extern int proc_tgid_stat(struct seq_file *, struct pid_namespace *,
146 : : struct pid *, struct task_struct *);
147 : : extern int proc_pid_status(struct seq_file *, struct pid_namespace *,
148 : : struct pid *, struct task_struct *);
149 : : extern int proc_pid_statm(struct seq_file *, struct pid_namespace *,
150 : : struct pid *, struct task_struct *);
151 : :
152 : : /*
153 : : * base.c
154 : : */
155 : : extern const struct dentry_operations pid_dentry_operations;
156 : : extern int pid_getattr(const struct path *, struct kstat *, u32, unsigned int);
157 : : extern int proc_setattr(struct dentry *, struct iattr *);
158 : : extern struct inode *proc_pid_make_inode(struct super_block *, struct task_struct *, umode_t);
159 : : extern void pid_update_inode(struct task_struct *, struct inode *);
160 : : extern int pid_delete_dentry(const struct dentry *);
161 : : extern int proc_pid_readdir(struct file *, struct dir_context *);
162 : : struct dentry *proc_pid_lookup(struct dentry *, unsigned int);
163 : : extern loff_t mem_lseek(struct file *, loff_t, int);
164 : :
165 : : /* Lookups */
166 : : typedef struct dentry *instantiate_t(struct dentry *,
167 : : struct task_struct *, const void *);
168 : : bool proc_fill_cache(struct file *, struct dir_context *, const char *, unsigned int,
169 : : instantiate_t, struct task_struct *, const void *);
170 : :
171 : : /*
172 : : * generic.c
173 : : */
174 : : struct proc_dir_entry *proc_create_reg(const char *name, umode_t mode,
175 : : struct proc_dir_entry **parent, void *data);
176 : : struct proc_dir_entry *proc_register(struct proc_dir_entry *dir,
177 : : struct proc_dir_entry *dp);
178 : : extern struct dentry *proc_lookup(struct inode *, struct dentry *, unsigned int);
179 : : struct dentry *proc_lookup_de(struct inode *, struct dentry *, struct proc_dir_entry *);
180 : : extern int proc_readdir(struct file *, struct dir_context *);
181 : : int proc_readdir_de(struct file *, struct dir_context *, struct proc_dir_entry *);
182 : :
183 : : static inline struct proc_dir_entry *pde_get(struct proc_dir_entry *pde)
184 : : {
185 : 10454 : refcount_inc(&pde->refcnt);
186 : : return pde;
187 : : }
188 : : extern void pde_put(struct proc_dir_entry *);
189 : :
190 : : static inline bool is_empty_pde(const struct proc_dir_entry *pde)
191 : : {
192 [ + + + - ]: 311018 : return S_ISDIR(pde->mode) && !pde->proc_iops;
193 : : }
194 : : extern ssize_t proc_simple_write(struct file *, const char __user *, size_t, loff_t *);
195 : :
196 : : /*
197 : : * inode.c
198 : : */
199 : : struct pde_opener {
200 : : struct file *file;
201 : : struct list_head lh;
202 : : bool closing;
203 : : struct completion *c;
204 : : } __randomize_layout;
205 : : extern const struct inode_operations proc_link_inode_operations;
206 : : extern const struct inode_operations proc_pid_link_inode_operations;
207 : : extern const struct super_operations proc_sops;
208 : :
209 : : void proc_init_kmemcache(void);
210 : : void set_proc_pid_nlink(void);
211 : : extern struct inode *proc_get_inode(struct super_block *, struct proc_dir_entry *);
212 : : extern void proc_entry_rundown(struct proc_dir_entry *);
213 : :
214 : : /*
215 : : * proc_namespaces.c
216 : : */
217 : : extern const struct inode_operations proc_ns_dir_inode_operations;
218 : : extern const struct file_operations proc_ns_dir_operations;
219 : :
220 : : /*
221 : : * proc_net.c
222 : : */
223 : : extern const struct file_operations proc_net_operations;
224 : : extern const struct inode_operations proc_net_inode_operations;
225 : :
226 : : #ifdef CONFIG_NET
227 : : extern int proc_net_init(void);
228 : : #else
229 : : static inline int proc_net_init(void) { return 0; }
230 : : #endif
231 : :
232 : : /*
233 : : * proc_self.c
234 : : */
235 : : extern int proc_setup_self(struct super_block *);
236 : :
237 : : /*
238 : : * proc_thread_self.c
239 : : */
240 : : extern int proc_setup_thread_self(struct super_block *);
241 : : extern void proc_thread_self_init(void);
242 : :
243 : : /*
244 : : * proc_sysctl.c
245 : : */
246 : : #ifdef CONFIG_PROC_SYSCTL
247 : : extern int proc_sys_init(void);
248 : : extern void proc_sys_evict_inode(struct inode *inode,
249 : : struct ctl_table_header *head);
250 : : #else
251 : : static inline void proc_sys_init(void) { }
252 : : static inline void proc_sys_evict_inode(struct inode *inode,
253 : : struct ctl_table_header *head) { }
254 : : #endif
255 : :
256 : : /*
257 : : * proc_tty.c
258 : : */
259 : : #ifdef CONFIG_TTY
260 : : extern void proc_tty_init(void);
261 : : #else
262 : : static inline void proc_tty_init(void) {}
263 : : #endif
264 : :
265 : : /*
266 : : * root.c
267 : : */
268 : : extern struct proc_dir_entry proc_root;
269 : :
270 : : extern void proc_self_init(void);
271 : :
272 : : /*
273 : : * task_[no]mmu.c
274 : : */
275 : : struct mem_size_stats;
276 : : struct proc_maps_private {
277 : : struct inode *inode;
278 : : struct task_struct *task;
279 : : struct mm_struct *mm;
280 : : #ifdef CONFIG_MMU
281 : : struct vm_area_struct *tail_vma;
282 : : #endif
283 : : #ifdef CONFIG_NUMA
284 : : struct mempolicy *task_mempolicy;
285 : : #endif
286 : : } __randomize_layout;
287 : :
288 : : struct mm_struct *proc_mem_open(struct inode *inode, unsigned int mode);
289 : :
290 : : extern const struct file_operations proc_pid_maps_operations;
291 : : extern const struct file_operations proc_pid_numa_maps_operations;
292 : : extern const struct file_operations proc_pid_smaps_operations;
293 : : extern const struct file_operations proc_pid_smaps_rollup_operations;
294 : : extern const struct file_operations proc_clear_refs_operations;
295 : : extern const struct file_operations proc_pagemap_operations;
296 : :
297 : : extern unsigned long task_vsize(struct mm_struct *);
298 : : extern unsigned long task_statm(struct mm_struct *,
299 : : unsigned long *, unsigned long *,
300 : : unsigned long *, unsigned long *);
301 : : extern void task_mem(struct seq_file *, struct mm_struct *);
|