home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / linux / proc_fs.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  8.0 KB  |  272 lines

  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. struct dentry *proc_pid_lookup(struct inode *dir, struct dentry * dentry, struct nameidata *);
  103. struct dentry *proc_pid_unhash(struct task_struct *p);
  104. void proc_pid_flush(struct dentry *proc_dentry);
  105. int proc_pid_readdir(struct file * filp, void * dirent, filldir_t filldir);
  106. unsigned long task_vsize(struct mm_struct *);
  107. int task_statm(struct mm_struct *, int *, int *, int *, int *);
  108. char *task_mem(struct mm_struct *, char *);
  109.  
  110. extern struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode,
  111.                         struct proc_dir_entry *parent);
  112. extern void remove_proc_entry(const char *name, struct proc_dir_entry *parent);
  113.  
  114. extern struct vfsmount *proc_mnt;
  115. extern int proc_fill_super(struct super_block *,void *,int);
  116. extern struct inode *proc_get_inode(struct super_block *, unsigned int, struct proc_dir_entry *);
  117.  
  118. extern int proc_match(int, const char *,struct proc_dir_entry *);
  119.  
  120. /*
  121.  * These are generic /proc routines that use the internal
  122.  * "struct proc_dir_entry" tree to traverse the filesystem.
  123.  *
  124.  * The /proc root directory has extended versions to take care
  125.  * of the /proc/<pid> subdirectories.
  126.  */
  127. extern int proc_readdir(struct file *, void *, filldir_t);
  128. extern struct dentry *proc_lookup(struct inode *, struct dentry *, struct nameidata *);
  129.  
  130. extern const struct file_operations proc_kcore_operations;
  131. extern const struct file_operations proc_kmsg_operations;
  132. extern const struct file_operations ppc_htab_operations;
  133.  
  134. /*
  135.  * proc_tty.c
  136.  */
  137. struct tty_driver;
  138. extern void proc_tty_init(void);
  139. extern void proc_tty_register_driver(struct tty_driver *driver);
  140. extern void proc_tty_unregister_driver(struct tty_driver *driver);
  141.  
  142. /*
  143.  * proc_devtree.c
  144.  */
  145. #ifdef CONFIG_PROC_DEVICETREE
  146. struct device_node;
  147. struct property;
  148. extern void proc_device_tree_init(void);
  149. extern void proc_device_tree_add_node(struct device_node *, struct proc_dir_entry *);
  150. extern void proc_device_tree_add_prop(struct proc_dir_entry *pde, struct property *prop);
  151. extern void proc_device_tree_remove_prop(struct proc_dir_entry *pde,
  152.                      struct property *prop);
  153. extern void proc_device_tree_update_prop(struct proc_dir_entry *pde,
  154.                      struct property *newprop,
  155.                      struct property *oldprop);
  156. #endif /* CONFIG_PROC_DEVICETREE */
  157.  
  158. extern struct proc_dir_entry *proc_symlink(const char *,
  159.         struct proc_dir_entry *, const char *);
  160. extern struct proc_dir_entry *proc_mkdir(const char *,struct proc_dir_entry *);
  161. extern struct proc_dir_entry *proc_mkdir_mode(const char *name, mode_t mode,
  162.             struct proc_dir_entry *parent);
  163.  
  164. static inline struct proc_dir_entry *create_proc_read_entry(const char *name,
  165.     mode_t mode, struct proc_dir_entry *base, 
  166.     read_proc_t *read_proc, void * data)
  167. {
  168.     struct proc_dir_entry *res=create_proc_entry(name,mode,base);
  169.     if (res) {
  170.         res->read_proc=read_proc;
  171.         res->data=data;
  172.     }
  173.     return res;
  174. }
  175.  
  176. static inline struct proc_dir_entry *create_proc_info_entry(const char *name,
  177.     mode_t mode, struct proc_dir_entry *base, get_info_t *get_info)
  178. {
  179.     struct proc_dir_entry *res=create_proc_entry(name,mode,base);
  180.     if (res) res->get_info=get_info;
  181.     return res;
  182. }
  183.  
  184. static inline struct proc_dir_entry *proc_net_create(const char *name,
  185.     mode_t mode, get_info_t *get_info)
  186. {
  187.     return create_proc_info_entry(name,mode,proc_net,get_info);
  188. }
  189.  
  190. static inline struct proc_dir_entry *proc_net_fops_create(const char *name,
  191.     mode_t mode, const struct file_operations *fops)
  192. {
  193.     struct proc_dir_entry *res = create_proc_entry(name, mode, proc_net);
  194.     if (res)
  195.         res->proc_fops = fops;
  196.     return res;
  197. }
  198.  
  199. static inline void proc_net_remove(const char *name)
  200. {
  201.     remove_proc_entry(name,proc_net);
  202. }
  203.  
  204. #else
  205.  
  206. #define proc_root_driver NULL
  207. #define proc_net NULL
  208. #define proc_bus NULL
  209.  
  210. #define proc_net_fops_create(name, mode, fops)  ({ (void)(mode), NULL; })
  211. #define proc_net_create(name, mode, info)    ({ (void)(mode), NULL; })
  212. static inline void proc_net_remove(const char *name) {}
  213.  
  214. static inline struct dentry *proc_pid_unhash(struct task_struct *p) { return NULL; }
  215. static inline void proc_pid_flush(struct dentry *proc_dentry) { }
  216.  
  217. static inline struct proc_dir_entry *create_proc_entry(const char *name,
  218.     mode_t mode, struct proc_dir_entry *parent) { return NULL; }
  219.  
  220. #define remove_proc_entry(name, parent) do {} while (0)
  221.  
  222. static inline struct proc_dir_entry *proc_symlink(const char *name,
  223.         struct proc_dir_entry *parent,const char *dest) {return NULL;}
  224. static inline struct proc_dir_entry *proc_mkdir(const char *name,
  225.     struct proc_dir_entry *parent) {return NULL;}
  226.  
  227. static inline struct proc_dir_entry *create_proc_read_entry(const char *name,
  228.     mode_t mode, struct proc_dir_entry *base, 
  229.     read_proc_t *read_proc, void * data) { return NULL; }
  230. static inline struct proc_dir_entry *create_proc_info_entry(const char *name,
  231.     mode_t mode, struct proc_dir_entry *base, get_info_t *get_info)
  232.     { return NULL; }
  233.  
  234. struct tty_driver;
  235. static inline void proc_tty_register_driver(struct tty_driver *driver) {};
  236. static inline void proc_tty_unregister_driver(struct tty_driver *driver) {};
  237.  
  238. extern struct proc_dir_entry proc_root;
  239.  
  240. #endif /* CONFIG_PROC_FS */
  241.  
  242. #if !defined(CONFIG_PROC_KCORE)
  243. static inline void kclist_add(struct kcore_list *new, void *addr, size_t size)
  244. {
  245. }
  246. #else
  247. extern void kclist_add(struct kcore_list *, void *, size_t);
  248. #endif
  249.  
  250. struct proc_inode {
  251.     struct task_struct *task;
  252.     int type;
  253.     union {
  254.         int (*proc_get_link)(struct inode *, struct dentry **, struct vfsmount **);
  255.         int (*proc_read)(struct task_struct *task, char *page);
  256.     } op;
  257.     struct proc_dir_entry *pde;
  258.     struct inode vfs_inode;
  259. };
  260.  
  261. static inline struct proc_inode *PROC_I(const struct inode *inode)
  262. {
  263.     return container_of(inode, struct proc_inode, vfs_inode);
  264. }
  265.  
  266. static inline struct proc_dir_entry *PDE(const struct inode *inode)
  267. {
  268.     return PROC_I(inode)->pde;
  269. }
  270.  
  271. #endif /* _LINUX_PROC_FS_H */
  272.