Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  1 /*
  2  * Wrapper functions for accessing the file_struct fd array.
  3  */
  4 
  5 #ifndef __LINUX_FILE_H
  6 #define __LINUX_FILE_H
  7 
  8 #include <asm/atomic.h>
  9 #include <linux/posix_types.h>
 10 #include <linux/compiler.h>
 11 #include <linux/spinlock.h>
 12 #include <linux/rcupdate.h>
 13 #include <linux/types.h>
 14 
 15 /*
 16  * The default fd array needs to be at least BITS_PER_LONG,
 17  * as this is the granularity returned by copy_fdset().
 18  */
 19 #define NR_OPEN_DEFAULT BITS_PER_LONG
 20 
 21 /*
 22  * The embedded_fd_set is a small fd_set,
 23  * suitable for most tasks (which open <= BITS_PER_LONG files)
 24  */
 25 struct embedded_fd_set {
 26         unsigned long fds_bits[1];
 27 };
 28 
 29 struct fdtable {
 30         unsigned int max_fds;
 31         struct file ** fd;      /* current fd array */
 32         fd_set *close_on_exec;
 33         fd_set *open_fds;
 34         struct rcu_head rcu;
 35         struct fdtable *next;
 36 };
 37 
 38 /*
 39  * Open file table structure
 40  */
 41 struct files_struct {
 42   /*
 43    * read mostly part
 44    */
 45         atomic_t count;
 46         struct fdtable *fdt;
 47         struct fdtable fdtab;
 48   /*
 49    * written part on a separate cache line in SMP
 50    */
 51         spinlock_t file_lock ____cacheline_aligned_in_smp;
 52         int next_fd;
 53         struct embedded_fd_set close_on_exec_init;
 54         struct embedded_fd_set open_fds_init;
 55         struct file * fd_array[NR_OPEN_DEFAULT];
 56 };
 57 
 58 #define files_fdtable(files) (rcu_dereference((files)->fdt))
 59 
 60 extern struct kmem_cache *filp_cachep;
 61 
 62 extern void __fput(struct file *);
 63 extern void fput(struct file *);
 64 
 65 struct file_operations;
 66 struct vfsmount;
 67 struct dentry;
 68 extern int init_file(struct file *, struct vfsmount *mnt,
 69                 struct dentry *dentry, mode_t mode,
 70                 const struct file_operations *fop);
 71 extern struct file *alloc_file(struct vfsmount *, struct dentry *dentry,
 72                 mode_t mode, const struct file_operations *fop);
 73 
 74 static inline void fput_light(struct file *file, int fput_needed)
 75 {
 76         if (unlikely(fput_needed))
 77                 fput(file);
 78 }
 79 
 80 extern struct file *fget(unsigned int fd);
 81 extern struct file *fget_light(unsigned int fd, int *fput_needed);
 82 extern void set_close_on_exec(unsigned int fd, int flag);
 83 extern void put_filp(struct file *);
 84 extern int get_unused_fd(void);
 85 extern int get_unused_fd_flags(int flags);
 86 extern void put_unused_fd(unsigned int fd);
 87 struct kmem_cache;
 88 
 89 extern int expand_files(struct files_struct *, int nr);
 90 extern void free_fdtable_rcu(struct rcu_head *rcu);
 91 extern void __init files_defer_init(void);
 92 
 93 static inline void free_fdtable(struct fdtable *fdt)
 94 {
 95         call_rcu(&fdt->rcu, free_fdtable_rcu);
 96 }
 97 
 98 static inline struct file * fcheck_files(struct files_struct *files, unsigned int fd)
 99 {
100         struct file * file = NULL;
101         struct fdtable *fdt = files_fdtable(files);
102 
103         if (fd < fdt->max_fds)
104                 file = rcu_dereference(fdt->fd[fd]);
105         return file;
106 }
107 
108 /*
109  * Check whether the specified fd has an open file.
110  */
111 #define fcheck(fd)      fcheck_files(current->files, fd)
112 
113 extern void fd_install(unsigned int fd, struct file *file);
114 
115 struct task_struct;
116 
117 struct files_struct *get_files_struct(struct task_struct *);
118 void put_files_struct(struct files_struct *fs);
119 void reset_files_struct(struct task_struct *, struct files_struct *);
120 
121 extern struct kmem_cache *files_cachep;
122 
123 #endif /* __LINUX_FILE_H */
124 
  This page was automatically generated by the LXR engine.