Line data Source code
1 : /*
2 : * descriptor table internals; you almost certainly want file.h instead.
3 : */
4 :
5 : #ifndef __LINUX_FDTABLE_H
6 : #define __LINUX_FDTABLE_H
7 :
8 : #include <linux/posix_types.h>
9 : #include <linux/compiler.h>
10 : #include <linux/spinlock.h>
11 : #include <linux/rcupdate.h>
12 : #include <linux/types.h>
13 : #include <linux/init.h>
14 :
15 : #include <asm/atomic.h>
16 :
17 : /*
18 : * The default fd array needs to be at least BITS_PER_LONG,
19 : * as this is the granularity returned by copy_fdset().
20 : */
21 : #define NR_OPEN_DEFAULT BITS_PER_LONG
22 :
23 : /*
24 : * The embedded_fd_set is a small fd_set,
25 : * suitable for most tasks (which open <= BITS_PER_LONG files)
26 : */
27 : struct embedded_fd_set {
28 : unsigned long fds_bits[1];
29 : };
30 1 :
31 : struct fdtable {
32 : unsigned int max_fds;
33 : struct file ** fd; /* current fd array */
34 : fd_set *close_on_exec;
35 : fd_set *open_fds;
36 : struct rcu_head rcu;
37 : struct fdtable *next;
38 : };
39 1 :
40 : /*
41 : * Open file table structure
42 : */
43 : struct files_struct {
44 : /*
45 : * read mostly part
46 : */
47 : atomic_t count;
48 : struct fdtable *fdt;
49 : struct fdtable fdtab;
50 : /*
51 : * written part on a separate cache line in SMP
52 : */
53 : spinlock_t file_lock ____cacheline_aligned_in_smp;
54 : int next_fd;
55 : struct embedded_fd_set close_on_exec_init;
56 : struct embedded_fd_set open_fds_init;
57 : struct file * fd_array[NR_OPEN_DEFAULT];
58 : };
59 :
60 : #define files_fdtable(files) (rcu_dereference((files)->fdt))
61 :
62 : struct file_operations;
63 : struct vfsmount;
64 : struct dentry;
65 :
66 : extern int expand_files(struct files_struct *, int nr);
67 : extern void free_fdtable_rcu(struct rcu_head *rcu);
68 : extern void __init files_defer_init(void);
69 :
70 : static inline void free_fdtable(struct fdtable *fdt)
71 : {
72 : call_rcu(&fdt->rcu, free_fdtable_rcu);
73 : }
74 :
75 : static inline struct file * fcheck_files(struct files_struct *files, unsigned int fd)
76 : {
77 : struct file * file = NULL;
78 : struct fdtable *fdt = files_fdtable(files);
79 :
80 : if (fd < fdt->max_fds)
81 : file = rcu_dereference(fdt->fd[fd]);
82 : return file;
83 : }
84 :
85 : /*
86 : * Check whether the specified fd has an open file.
87 : */
88 : #define fcheck(fd) fcheck_files(current->files, fd)
89 :
90 : struct task_struct;
91 :
92 : struct files_struct *get_files_struct(struct task_struct *);
93 : void put_files_struct(struct files_struct *fs);
94 : void reset_files_struct(struct files_struct *);
95 : int unshare_files(struct files_struct **);
96 : struct files_struct *dup_fd(struct files_struct *, int *);
97 :
98 : extern struct kmem_cache *files_cachep;
99 :
100 : #endif /* __LINUX_FDTABLE_H */
|