2005-04-16 15:20:36 -07:00
|
|
|
#ifndef _LINUX_PROC_FS_H
|
|
|
|
|
#define _LINUX_PROC_FS_H
|
|
|
|
|
|
|
|
|
|
#include <linux/slab.h>
|
|
|
|
|
#include <linux/fs.h>
|
2006-03-26 01:36:55 -08:00
|
|
|
#include <linux/spinlock.h>
|
2006-09-24 11:13:19 -04:00
|
|
|
#include <linux/magic.h>
|
2011-07-26 16:09:06 -07:00
|
|
|
#include <linux/atomic.h>
|
2013-04-12 01:50:06 +01:00
|
|
|
#include <linux/proc_ns.h>
|
2005-04-16 15:20:36 -07:00
|
|
|
|
2007-09-12 12:01:34 +02:00
|
|
|
struct net;
|
2007-07-15 23:39:00 -07:00
|
|
|
struct completion;
|
2008-06-12 15:21:31 -07:00
|
|
|
struct mm_struct;
|
|
|
|
|
|
2005-04-16 15:20:36 -07:00
|
|
|
/*
|
|
|
|
|
* The proc filesystem constants/structures
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Offset of the first process in the /proc root directory..
|
|
|
|
|
*/
|
|
|
|
|
#define FIRST_PROCESS_ENTRY 256
|
|
|
|
|
|
2008-02-04 22:29:03 -08:00
|
|
|
/* Worst case buffer size needed for holding an integer. */
|
|
|
|
|
#define PROC_NUMBUF 13
|
2005-04-16 15:20:36 -07:00
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* This is not completely implemented yet. The idea is to
|
|
|
|
|
* create an in-memory tree (like the actual /proc filesystem
|
|
|
|
|
* tree) of these proc_dir_entries, so that we can dynamically
|
|
|
|
|
* add new files to /proc.
|
|
|
|
|
*
|
|
|
|
|
* The "next" pointer creates a linked list of one /proc directory,
|
|
|
|
|
* while parent/subdir create the directory structure (every
|
|
|
|
|
* /proc file has a parent, but "subdir" is NULL for all
|
|
|
|
|
* non-directory entries).
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
struct proc_dir_entry {
|
|
|
|
|
unsigned int low_ino;
|
2011-07-24 03:36:29 -04:00
|
|
|
umode_t mode;
|
2005-04-16 15:20:36 -07:00
|
|
|
nlink_t nlink;
|
2012-02-09 08:48:21 -08:00
|
|
|
kuid_t uid;
|
|
|
|
|
kgid_t gid;
|
2006-03-26 01:37:29 -08:00
|
|
|
loff_t size;
|
2007-02-12 00:55:40 -08:00
|
|
|
const struct inode_operations *proc_iops;
|
|
|
|
|
const struct file_operations *proc_fops;
|
2005-04-16 15:20:36 -07:00
|
|
|
struct proc_dir_entry *next, *parent, *subdir;
|
|
|
|
|
void *data;
|
|
|
|
|
atomic_t count; /* use count */
|
2013-04-04 16:28:47 -04:00
|
|
|
atomic_t in_use; /* number of callers into module in progress; */
|
2013-04-03 19:07:30 -04:00
|
|
|
/* negative -> it's going away RSN */
|
2007-07-15 23:39:00 -07:00
|
|
|
struct completion *pde_unload_completion;
|
2008-07-25 01:48:29 -07:00
|
|
|
struct list_head pde_openers; /* who did ->open, but not ->release */
|
2011-07-27 21:47:03 +03:00
|
|
|
spinlock_t pde_unload_lock; /* proc_fops checks and pde_users bumps */
|
|
|
|
|
u8 namelen;
|
|
|
|
|
char name[];
|
2005-04-16 15:20:36 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_PROC_FS
|
|
|
|
|
|
|
|
|
|
extern void proc_root_init(void);
|
|
|
|
|
|
2006-06-26 00:25:48 -07:00
|
|
|
void proc_flush_task(struct task_struct *task);
|
2007-05-08 00:25:45 -07:00
|
|
|
|
2011-07-24 03:36:29 -04:00
|
|
|
struct proc_dir_entry *proc_create_data(const char *name, umode_t mode,
|
2008-02-08 04:18:37 -08:00
|
|
|
struct proc_dir_entry *parent,
|
2008-04-29 01:02:00 -07:00
|
|
|
const struct file_operations *proc_fops,
|
|
|
|
|
void *data);
|
2005-04-16 15:20:36 -07:00
|
|
|
extern void remove_proc_entry(const char *name, struct proc_dir_entry *parent);
|
2013-03-30 20:13:46 -04:00
|
|
|
extern int remove_proc_subtree(const char *name, struct proc_dir_entry *parent);
|
2005-04-16 15:20:36 -07:00
|
|
|
|
|
|
|
|
extern struct proc_dir_entry *proc_symlink(const char *,
|
|
|
|
|
struct proc_dir_entry *, const char *);
|
|
|
|
|
extern struct proc_dir_entry *proc_mkdir(const char *,struct proc_dir_entry *);
|
2013-04-12 02:48:30 +01:00
|
|
|
extern struct proc_dir_entry *proc_mkdir_data(const char *, umode_t,
|
|
|
|
|
struct proc_dir_entry *, void *);
|
2011-07-24 03:36:29 -04:00
|
|
|
extern struct proc_dir_entry *proc_mkdir_mode(const char *name, umode_t mode,
|
2005-04-16 15:20:36 -07:00
|
|
|
struct proc_dir_entry *parent);
|
|
|
|
|
|
2011-07-24 03:36:29 -04:00
|
|
|
static inline struct proc_dir_entry *proc_create(const char *name, umode_t mode,
|
2008-04-29 01:02:00 -07:00
|
|
|
struct proc_dir_entry *parent, const struct file_operations *proc_fops)
|
|
|
|
|
{
|
|
|
|
|
return proc_create_data(name, mode, parent, proc_fops, NULL);
|
|
|
|
|
}
|
2005-04-16 15:20:36 -07:00
|
|
|
|
2013-04-12 00:38:51 +01:00
|
|
|
extern void proc_set_size(struct proc_dir_entry *, loff_t);
|
|
|
|
|
extern void proc_set_user(struct proc_dir_entry *, kuid_t, kgid_t);
|
2005-04-16 15:20:36 -07:00
|
|
|
#else
|
|
|
|
|
|
2007-10-18 23:40:03 -07:00
|
|
|
static inline void proc_flush_task(struct task_struct *task)
|
|
|
|
|
{
|
|
|
|
|
}
|
2005-04-16 15:20:36 -07:00
|
|
|
|
2013-02-19 00:43:10 +00:00
|
|
|
#define proc_create(name, mode, parent, fops) ({ (void)(mode), NULL; })
|
|
|
|
|
|
2008-04-29 01:02:00 -07:00
|
|
|
static inline struct proc_dir_entry *proc_create_data(const char *name,
|
2011-07-24 03:36:29 -04:00
|
|
|
umode_t mode, struct proc_dir_entry *parent,
|
2008-04-29 01:02:00 -07:00
|
|
|
const struct file_operations *proc_fops, void *data)
|
|
|
|
|
{
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
2005-04-16 15:20:36 -07:00
|
|
|
#define remove_proc_entry(name, parent) do {} while (0)
|
2013-03-30 20:13:46 -04:00
|
|
|
#define remove_proc_subtree(name, parent) do {} while (0)
|
2005-04-16 15:20:36 -07:00
|
|
|
|
|
|
|
|
static inline struct proc_dir_entry *proc_symlink(const char *name,
|
|
|
|
|
struct proc_dir_entry *parent,const char *dest) {return NULL;}
|
|
|
|
|
static inline struct proc_dir_entry *proc_mkdir(const char *name,
|
|
|
|
|
struct proc_dir_entry *parent) {return NULL;}
|
2013-04-12 02:48:30 +01:00
|
|
|
static inline struct proc_dir_entry *proc_mkdir_data(const char *name,
|
|
|
|
|
umode_t mode, struct proc_dir_entry *parent, void *data) { return NULL; }
|
2011-05-17 15:44:12 -07:00
|
|
|
static inline struct proc_dir_entry *proc_mkdir_mode(const char *name,
|
2011-07-24 03:36:29 -04:00
|
|
|
umode_t mode, struct proc_dir_entry *parent) { return NULL; }
|
2013-04-12 00:38:51 +01:00
|
|
|
static inline void proc_set_size(struct proc_dir_entry *de, loff_t size) {}
|
|
|
|
|
static inline void proc_set_user(struct proc_dir_entry *de, kuid_t uid, kgid_t gid) {}
|
2005-04-16 15:20:36 -07:00
|
|
|
|
|
|
|
|
#endif /* CONFIG_PROC_FS */
|
|
|
|
|
|
2010-03-07 16:41:34 -08:00
|
|
|
|
2006-10-02 02:17:07 -07:00
|
|
|
union proc_op {
|
2012-01-10 15:11:20 -08:00
|
|
|
int (*proc_get_link)(struct dentry *, struct path *);
|
2006-10-02 02:17:07 -07:00
|
|
|
int (*proc_read)(struct task_struct *task, char *page);
|
2008-02-08 04:18:30 -08:00
|
|
|
int (*proc_show)(struct seq_file *m,
|
|
|
|
|
struct pid_namespace *ns, struct pid *pid,
|
|
|
|
|
struct task_struct *task);
|
2006-10-02 02:17:07 -07:00
|
|
|
};
|
|
|
|
|
|
2008-07-15 08:54:06 -04:00
|
|
|
struct ctl_table_header;
|
|
|
|
|
struct ctl_table;
|
|
|
|
|
|
2005-04-16 15:20:36 -07:00
|
|
|
struct proc_inode {
|
2006-06-26 00:25:56 -07:00
|
|
|
struct pid *pid;
|
2006-06-26 00:25:44 -07:00
|
|
|
int fd;
|
2006-10-02 02:17:07 -07:00
|
|
|
union proc_op op;
|
2005-04-16 15:20:36 -07:00
|
|
|
struct proc_dir_entry *pde;
|
2008-07-15 08:54:06 -04:00
|
|
|
struct ctl_table_header *sysctl;
|
|
|
|
|
struct ctl_table *sysctl_entry;
|
2013-04-12 01:50:06 +01:00
|
|
|
struct proc_ns ns;
|
2005-04-16 15:20:36 -07:00
|
|
|
struct inode vfs_inode;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static inline struct proc_inode *PROC_I(const struct inode *inode)
|
|
|
|
|
{
|
|
|
|
|
return container_of(inode, struct proc_inode, vfs_inode);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline struct proc_dir_entry *PDE(const struct inode *inode)
|
|
|
|
|
{
|
|
|
|
|
return PROC_I(inode)->pde;
|
|
|
|
|
}
|
|
|
|
|
|
2013-03-31 18:16:14 -04:00
|
|
|
static inline void *PDE_DATA(const struct inode *inode)
|
|
|
|
|
{
|
|
|
|
|
return PROC_I(inode)->pde->data;
|
|
|
|
|
}
|
|
|
|
|
|
2013-04-12 02:48:30 +01:00
|
|
|
static inline struct proc_dir_entry *proc_net_mkdir(
|
|
|
|
|
struct net *net, const char *name, struct proc_dir_entry *parent)
|
|
|
|
|
{
|
|
|
|
|
return proc_mkdir_data(name, 0, parent, net);
|
|
|
|
|
}
|
|
|
|
|
|
2005-04-16 15:20:36 -07:00
|
|
|
#endif /* _LINUX_PROC_FS_H */
|