Home | History | Annotate | Download | only in linux
      1 #ifndef _LINUX_PROC_FS_H
      2 #define _LINUX_PROC_FS_H
      3 
      4 #include <linux/slab.h>
      5 #include <linux/fs.h>
      6 #include <linux/spinlock.h>
      7 #include <asm/atomic.h>
      8 
      9 /*
     10  * The proc filesystem constants/structures
     11  */
     12 
     13 /*
     14  * Offset of the first process in the /proc root directory..
     15  */
     16 #define FIRST_PROCESS_ENTRY 256
     17 
     18 
     19 /*
     20  * We always define these enumerators
     21  */
     22 
     23 enum {
     24 	PROC_ROOT_INO = 1,
     25 };
     26 
     27 #define PROC_SUPER_MAGIC 0x9fa0
     28 
     29 /*
     30  * This is not completely implemented yet. The idea is to
     31  * create an in-memory tree (like the actual /proc filesystem
     32  * tree) of these proc_dir_entries, so that we can dynamically
     33  * add new files to /proc.
     34  *
     35  * The "next" pointer creates a linked list of one /proc directory,
     36  * while parent/subdir create the directory structure (every
     37  * /proc file has a parent, but "subdir" is NULL for all
     38  * non-directory entries).
     39  *
     40  * "get_info" is called at "read", while "owner" is used to protect module
     41  * from unloading while proc_dir_entry is in use
     42  */
     43 
     44 typedef	int (read_proc_t)(char *page, char **start, off_t off,
     45 			  int count, int *eof, void *data);
     46 typedef	int (write_proc_t)(struct file *file, const char __user *buffer,
     47 			   unsigned long count, void *data);
     48 typedef int (get_info_t)(char *, char **, off_t, int);
     49 
     50 struct proc_dir_entry {
     51 	unsigned int low_ino;
     52 	unsigned short namelen;
     53 	const char *name;
     54 	mode_t mode;
     55 	nlink_t nlink;
     56 	uid_t uid;
     57 	gid_t gid;
     58 	loff_t size;
     59 	struct inode_operations * proc_iops;
     60 	const struct file_operations * proc_fops;
     61 	get_info_t *get_info;
     62 	struct module *owner;
     63 	struct proc_dir_entry *next, *parent, *subdir;
     64 	void *data;
     65 	read_proc_t *read_proc;
     66 	write_proc_t *write_proc;
     67 	atomic_t count;		/* use count */
     68 	int deleted;		/* delete flag */
     69 	void *set;
     70 };
     71 
     72 struct kcore_list {
     73 	struct kcore_list *next;
     74 	unsigned long addr;
     75 	size_t size;
     76 };
     77 
     78 struct vmcore {
     79 	struct list_head list;
     80 	unsigned long long paddr;
     81 	unsigned long long size;
     82 	loff_t offset;
     83 };
     84 
     85 #ifdef CONFIG_PROC_FS
     86 
     87 extern struct proc_dir_entry proc_root;
     88 extern struct proc_dir_entry *proc_root_fs;
     89 extern struct proc_dir_entry *proc_net;
     90 extern struct proc_dir_entry *proc_net_stat;
     91 extern struct proc_dir_entry *proc_bus;
     92 extern struct proc_dir_entry *proc_root_driver;
     93 extern struct proc_dir_entry *proc_root_kcore;
     94 
     95 extern spinlock_t proc_subdir_lock;
     96 
     97 extern void proc_root_init(void);
     98 extern void proc_misc_init(void);
     99 
    100 struct mm_struct;
    101 
    102 void proc_flush_task(struct task_struct *task);
    103 struct dentry *proc_pid_lookup(struct inode *dir, struct dentry * dentry, struct nameidata *);
    104 int proc_pid_readdir(struct file * filp, void * dirent, filldir_t filldir);
    105 unsigned long task_vsize(struct mm_struct *);
    106 int task_statm(struct mm_struct *, int *, int *, int *, int *);
    107 char *task_mem(struct mm_struct *, char *);
    108 
    109 extern struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode,
    110 						struct proc_dir_entry *parent);
    111 extern void remove_proc_entry(const char *name, struct proc_dir_entry *parent);
    112 
    113 extern struct vfsmount *proc_mnt;
    114 extern int proc_fill_super(struct super_block *,void *,int);
    115 extern struct inode *proc_get_inode(struct super_block *, unsigned int, struct proc_dir_entry *);
    116 
    117 extern int proc_match(int, const char *,struct proc_dir_entry *);
    118 
    119 /*
    120  * These are generic /proc routines that use the internal
    121  * "struct proc_dir_entry" tree to traverse the filesystem.
    122  *
    123  * The /proc root directory has extended versions to take care
    124  * of the /proc/<pid> subdirectories.
    125  */
    126 extern int proc_readdir(struct file *, void *, filldir_t);
    127 extern struct dentry *proc_lookup(struct inode *, struct dentry *, struct nameidata *);
    128 
    129 extern const struct file_operations proc_kcore_operations;
    130 extern const struct file_operations proc_kmsg_operations;
    131 extern const struct file_operations ppc_htab_operations;
    132 
    133 /*
    134  * proc_tty.c
    135  */
    136 struct tty_driver;
    137 extern void proc_tty_init(void);
    138 extern void proc_tty_register_driver(struct tty_driver *driver);
    139 extern void proc_tty_unregister_driver(struct tty_driver *driver);
    140 
    141 /*
    142  * proc_devtree.c
    143  */
    144 #ifdef CONFIG_PROC_DEVICETREE
    145 struct device_node;
    146 struct property;
    147 extern void proc_device_tree_init(void);
    148 extern void proc_device_tree_add_node(struct device_node *, struct proc_dir_entry *);
    149 extern void proc_device_tree_add_prop(struct proc_dir_entry *pde, struct property *prop);
    150 extern void proc_device_tree_remove_prop(struct proc_dir_entry *pde,
    151 					 struct property *prop);
    152 extern void proc_device_tree_update_prop(struct proc_dir_entry *pde,
    153 					 struct property *newprop,
    154 					 struct property *oldprop);
    155 #endif /* CONFIG_PROC_DEVICETREE */
    156 
    157 extern struct proc_dir_entry *proc_symlink(const char *,
    158 		struct proc_dir_entry *, const char *);
    159 extern struct proc_dir_entry *proc_mkdir(const char *,struct proc_dir_entry *);
    160 extern struct proc_dir_entry *proc_mkdir_mode(const char *name, mode_t mode,
    161 			struct proc_dir_entry *parent);
    162 
    163 static inline struct proc_dir_entry *create_proc_read_entry(const char *name,
    164 	mode_t mode, struct proc_dir_entry *base,
    165 	read_proc_t *read_proc, void * data)
    166 {
    167 	struct proc_dir_entry *res=create_proc_entry(name,mode,base);
    168 	if (res) {
    169 		res->read_proc=read_proc;
    170 		res->data=data;
    171 	}
    172 	return res;
    173 }
    174 
    175 static inline struct proc_dir_entry *create_proc_info_entry(const char *name,
    176 	mode_t mode, struct proc_dir_entry *base, get_info_t *get_info)
    177 {
    178 	struct proc_dir_entry *res=create_proc_entry(name,mode,base);
    179 	if (res) res->get_info=get_info;
    180 	return res;
    181 }
    182 
    183 static inline struct proc_dir_entry *proc_net_create(const char *name,
    184 	mode_t mode, get_info_t *get_info)
    185 {
    186 	return create_proc_info_entry(name,mode,proc_net,get_info);
    187 }
    188 
    189 static inline struct proc_dir_entry *proc_net_fops_create(const char *name,
    190 	mode_t mode, const struct file_operations *fops)
    191 {
    192 	struct proc_dir_entry *res = create_proc_entry(name, mode, proc_net);
    193 	if (res)
    194 		res->proc_fops = fops;
    195 	return res;
    196 }
    197 
    198 static inline void proc_net_remove(const char *name)
    199 {
    200 	remove_proc_entry(name,proc_net);
    201 }
    202 
    203 #else
    204 
    205 #define proc_root_driver NULL
    206 #define proc_net NULL
    207 #define proc_bus NULL
    208 
    209 #define proc_net_fops_create(name, mode, fops)  ({ (void)(mode), NULL; })
    210 #define proc_net_create(name, mode, info)	({ (void)(mode), NULL; })
    211 static inline void proc_net_remove(const char *name) {}
    212 
    213 static inline void proc_flush_task(struct task_struct *task) { }
    214 
    215 static inline struct proc_dir_entry *create_proc_entry(const char *name,
    216 	mode_t mode, struct proc_dir_entry *parent) { return NULL; }
    217 
    218 #define remove_proc_entry(name, parent) do {} while (0)
    219 
    220 static inline struct proc_dir_entry *proc_symlink(const char *name,
    221 		struct proc_dir_entry *parent,const char *dest) {return NULL;}
    222 static inline struct proc_dir_entry *proc_mkdir(const char *name,
    223 	struct proc_dir_entry *parent) {return NULL;}
    224 
    225 static inline struct proc_dir_entry *create_proc_read_entry(const char *name,
    226 	mode_t mode, struct proc_dir_entry *base,
    227 	read_proc_t *read_proc, void * data) { return NULL; }
    228 static inline struct proc_dir_entry *create_proc_info_entry(const char *name,
    229 	mode_t mode, struct proc_dir_entry *base, get_info_t *get_info)
    230 	{ return NULL; }
    231 
    232 struct tty_driver;
    233 static inline void proc_tty_register_driver(struct tty_driver *driver) {};
    234 static inline void proc_tty_unregister_driver(struct tty_driver *driver) {};
    235 
    236 extern struct proc_dir_entry proc_root;
    237 
    238 #endif /* CONFIG_PROC_FS */
    239 
    240 #if !defined(CONFIG_PROC_KCORE)
    241 static inline void kclist_add(struct kcore_list *new, void *addr, size_t size)
    242 {
    243 }
    244 #else
    245 extern void kclist_add(struct kcore_list *, void *, size_t);
    246 #endif
    247 
    248 struct proc_inode {
    249 	struct pid *pid;
    250 	int fd;
    251 	union {
    252 		int (*proc_get_link)(struct inode *, struct dentry **, struct vfsmount **);
    253 		int (*proc_read)(struct task_struct *task, char *page);
    254 	} op;
    255 	struct proc_dir_entry *pde;
    256 	struct inode vfs_inode;
    257 };
    258 
    259 static inline struct proc_inode *PROC_I(const struct inode *inode)
    260 {
    261 	return container_of(inode, struct proc_inode, vfs_inode);
    262 }
    263 
    264 static inline struct proc_dir_entry *PDE(const struct inode *inode)
    265 {
    266 	return PROC_I(inode)->pde;
    267 }
    268 
    269 struct proc_maps_private {
    270 	struct pid *pid;
    271 	struct task_struct *task;
    272 	struct vm_area_struct *tail_vma;
    273 };
    274 
    275 #endif /* _LINUX_PROC_FS_H */
    276