Commit 9f3acc3140444a900ab280de942291959f0f615d
1 parent
a2dcb44c3c
Exists in
master
and in
4 other branches
[PATCH] split linux/file.h
Initial splitoff of the low-level stuff; taken to fdtable.h Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Showing 22 changed files with 121 additions and 86 deletions Side-by-side Diff
- arch/mips/kernel/kspd.c
- arch/powerpc/platforms/cell/spufs/coredump.c
- drivers/char/tty_audit.c
- drivers/char/tty_io.c
- fs/compat.c
- fs/dnotify.c
- fs/exec.c
- fs/fcntl.c
- fs/file.c
- fs/file_table.c
- fs/locks.c
- fs/open.c
- fs/proc/array.c
- fs/proc/base.c
- fs/select.c
- include/linux/fdtable.h
- include/linux/file.h
- include/linux/init_task.h
- kernel/exit.c
- kernel/fork.c
- kernel/kmod.c
- security/selinux/hooks.c
arch/mips/kernel/kspd.c
arch/powerpc/platforms/cell/spufs/coredump.c
drivers/char/tty_audit.c
drivers/char/tty_io.c
fs/compat.c
fs/dnotify.c
fs/exec.c
fs/fcntl.c
fs/file.c
fs/file_table.c
fs/locks.c
fs/open.c
fs/proc/array.c
fs/proc/base.c
fs/select.c
include/linux/fdtable.h
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 */ |
include/linux/file.h
... | ... | @@ -5,60 +5,12 @@ |
5 | 5 | #ifndef __LINUX_FILE_H |
6 | 6 | #define __LINUX_FILE_H |
7 | 7 | |
8 | -#include <asm/atomic.h> | |
9 | -#include <linux/posix_types.h> | |
10 | 8 | #include <linux/compiler.h> |
11 | -#include <linux/spinlock.h> | |
12 | -#include <linux/rcupdate.h> | |
13 | 9 | #include <linux/types.h> |
10 | +#include <linux/posix_types.h> | |
14 | 11 | |
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 | |
12 | +struct file; | |
20 | 13 | |
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 | 14 | extern void __fput(struct file *); |
63 | 15 | extern void fput(struct file *); |
64 | 16 | extern void drop_file_write_access(struct file *file); |
65 | 17 | |
66 | 18 | |
... | ... | @@ -85,42 +37,8 @@ |
85 | 37 | extern int get_unused_fd(void); |
86 | 38 | extern int get_unused_fd_flags(int flags); |
87 | 39 | extern void put_unused_fd(unsigned int fd); |
88 | -struct kmem_cache; | |
89 | 40 | |
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 | - | |
114 | 41 | extern void fd_install(unsigned int fd, struct file *file); |
115 | - | |
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 | 42 | |
125 | 43 | #endif /* __LINUX_FILE_H */ |
include/linux/init_task.h
kernel/exit.c
kernel/fork.c
kernel/kmod.c
security/selinux/hooks.c