aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/fdtable.h99
-rw-r--r--include/linux/file.h86
-rw-r--r--include/linux/init_task.h2
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 */
25struct embedded_fd_set {
26 unsigned long fds_bits[1];
27};
28
29struct 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 */
41struct 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
60extern struct kmem_cache *filp_cachep;
61
62struct file_operations;
63struct vfsmount;
64struct dentry;
65
66extern int expand_files(struct files_struct *, int nr);
67extern void free_fdtable_rcu(struct rcu_head *rcu);
68extern void __init files_defer_init(void);
69
70static inline void free_fdtable(struct fdtable *fdt)
71{
72 call_rcu(&fdt->rcu, free_fdtable_rcu);
73}
74
75static 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
90struct task_struct;
91
92struct files_struct *get_files_struct(struct task_struct *);
93void put_files_struct(struct files_struct *fs);
94void reset_files_struct(struct files_struct *);
95int unshare_files(struct files_struct **);
96
97extern 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/* 12struct 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 */
25struct embedded_fd_set {
26 unsigned long fds_bits[1];
27};
28
29struct 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 */
41struct 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
60extern struct kmem_cache *filp_cachep;
61 13
62extern void __fput(struct file *); 14extern void __fput(struct file *);
63extern void fput(struct file *); 15extern void fput(struct file *);
@@ -85,41 +37,7 @@ extern void put_filp(struct file *);
85extern int get_unused_fd(void); 37extern int get_unused_fd(void);
86extern int get_unused_fd_flags(int flags); 38extern int get_unused_fd_flags(int flags);
87extern void put_unused_fd(unsigned int fd); 39extern void put_unused_fd(unsigned int fd);
88struct kmem_cache;
89
90extern int expand_files(struct files_struct *, int nr);
91extern void free_fdtable_rcu(struct rcu_head *rcu);
92extern void __init files_defer_init(void);
93
94static inline void free_fdtable(struct fdtable *fdt)
95{
96 call_rcu(&fdt->rcu, free_fdtable_rcu);
97}
98
99static 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
114extern void fd_install(unsigned int fd, struct file *file); 41extern void fd_install(unsigned int fd, struct file *file);
115 42
116struct task_struct;
117
118struct files_struct *get_files_struct(struct task_struct *);
119void put_files_struct(struct files_struct *fs);
120void reset_files_struct(struct files_struct *);
121int unshare_files(struct files_struct **);
122
123extern 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>