diff options
Diffstat (limited to 'include/linux')
-rw-r--r-- | include/linux/fdtable.h | 99 | ||||
-rw-r--r-- | include/linux/file.h | 86 | ||||
-rw-r--r-- | include/linux/init_task.h | 2 |
3 files changed, 102 insertions, 85 deletions
diff --git a/include/linux/fdtable.h b/include/linux/fdtable.h new file mode 100644 index 000000000000..a118f3c0b240 --- /dev/null +++ b/include/linux/fdtable.h | |||
@@ -0,0 +1,99 @@ | |||
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 <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 | 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 | |||
97 | extern struct kmem_cache *files_cachep; | ||
98 | |||
99 | #endif /* __LINUX_FDTABLE_H */ | ||
diff --git a/include/linux/file.h b/include/linux/file.h index 69baf5a4f0a5..27c64bdc68c9 100644 --- a/include/linux/file.h +++ b/include/linux/file.h | |||
@@ -5,59 +5,11 @@ | |||
5 | #ifndef __LINUX_FILE_H | 5 | #ifndef __LINUX_FILE_H |
6 | #define __LINUX_FILE_H | 6 | #define __LINUX_FILE_H |
7 | 7 | ||
8 | #include <asm/atomic.h> | ||
9 | #include <linux/posix_types.h> | ||
10 | #include <linux/compiler.h> | 8 | #include <linux/compiler.h> |
11 | #include <linux/spinlock.h> | ||
12 | #include <linux/rcupdate.h> | ||
13 | #include <linux/types.h> | 9 | #include <linux/types.h> |
10 | #include <linux/posix_types.h> | ||
14 | 11 | ||
15 | /* | 12 | struct file; |
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 | 13 | ||
62 | extern void __fput(struct file *); | 14 | extern void __fput(struct file *); |
63 | extern void fput(struct file *); | 15 | extern void fput(struct file *); |
@@ -85,41 +37,7 @@ extern void put_filp(struct file *); | |||
85 | extern int get_unused_fd(void); | 37 | extern int get_unused_fd(void); |
86 | extern int get_unused_fd_flags(int flags); | 38 | extern int get_unused_fd_flags(int flags); |
87 | extern void put_unused_fd(unsigned int fd); | 39 | extern void put_unused_fd(unsigned int fd); |
88 | struct kmem_cache; | ||
89 | |||
90 | extern int expand_files(struct files_struct *, int nr); | ||
91 | extern void free_fdtable_rcu(struct rcu_head *rcu); | ||
92 | extern void __init files_defer_init(void); | ||
93 | |||
94 | static inline void free_fdtable(struct fdtable *fdt) | ||
95 | { | ||
96 | call_rcu(&fdt->rcu, free_fdtable_rcu); | ||
97 | } | ||
98 | |||
99 | static inline struct file * fcheck_files(struct files_struct *files, unsigned int fd) | ||
100 | { | ||
101 | struct file * file = NULL; | ||
102 | struct fdtable *fdt = files_fdtable(files); | ||
103 | |||
104 | if (fd < fdt->max_fds) | ||
105 | file = rcu_dereference(fdt->fd[fd]); | ||
106 | return file; | ||
107 | } | ||
108 | |||
109 | /* | ||
110 | * Check whether the specified fd has an open file. | ||
111 | */ | ||
112 | #define fcheck(fd) fcheck_files(current->files, fd) | ||
113 | 40 | ||
114 | extern void fd_install(unsigned int fd, struct file *file); | 41 | extern void fd_install(unsigned int fd, struct file *file); |
115 | 42 | ||
116 | struct task_struct; | ||
117 | |||
118 | struct files_struct *get_files_struct(struct task_struct *); | ||
119 | void put_files_struct(struct files_struct *fs); | ||
120 | void reset_files_struct(struct files_struct *); | ||
121 | int unshare_files(struct files_struct **); | ||
122 | |||
123 | extern struct kmem_cache *files_cachep; | ||
124 | |||
125 | #endif /* __LINUX_FILE_H */ | 43 | #endif /* __LINUX_FILE_H */ |
diff --git a/include/linux/init_task.h b/include/linux/init_task.h index bf6b8a61f8db..b24c2875aa05 100644 --- a/include/linux/init_task.h +++ b/include/linux/init_task.h | |||
@@ -1,7 +1,7 @@ | |||
1 | #ifndef _LINUX__INIT_TASK_H | 1 | #ifndef _LINUX__INIT_TASK_H |
2 | #define _LINUX__INIT_TASK_H | 2 | #define _LINUX__INIT_TASK_H |
3 | 3 | ||
4 | #include <linux/file.h> | 4 | #include <linux/fdtable.h> |
5 | #include <linux/rcupdate.h> | 5 | #include <linux/rcupdate.h> |
6 | #include <linux/irqflags.h> | 6 | #include <linux/irqflags.h> |
7 | #include <linux/utsname.h> | 7 | #include <linux/utsname.h> |