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 : 3 : 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 : 3 : 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 : 3 : return PROC_I(inode)->pid; 117 : : } 118 : : 119 : : static inline struct task_struct *get_proc_task(const struct inode *inode) 120 : : { 121 : 3 : 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 : 3 : 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 : 3 : 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 *);