1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Wrapper functions for accessing the file_struct fd array.
3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __LINUX_FILE_H
6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __LINUX_FILE_H
7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/atomic.h>
9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/posix_types.h>
10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/compiler.h>
11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/spinlock.h>
12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/rcupdate.h>
13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/types.h>
14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The default fd array needs to be at least BITS_PER_LONG,
17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * as this is the granularity returned by copy_fdset().
18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NR_OPEN_DEFAULT BITS_PER_LONG
20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The embedded_fd_set is a small fd_set,
23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * suitable for most tasks (which open <= BITS_PER_LONG files)
24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct embedded_fd_set {
26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned long fds_bits[1];
27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * More than this number of fds: we use a separately allocated fd_set
31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define EMBEDDED_FD_SET_SIZE (BITS_PER_BYTE * sizeof(struct embedded_fd_set))
33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct fdtable {
35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned int max_fds;
36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int max_fdset;
37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct file ** fd;      /* current fd array */
38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	fd_set *close_on_exec;
39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	fd_set *open_fds;
40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct rcu_head rcu;
41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct files_struct *free_files;
42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct fdtable *next;
43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Open file table structure
47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct files_struct {
49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru  /*
50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru   * read mostly part
51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru   */
52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	atomic_t count;
53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct fdtable *fdt;
54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct fdtable fdtab;
55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru  /*
56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru   * written part on a separate cache line in SMP
57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru   */
58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	spinlock_t file_lock ____cacheline_aligned_in_smp;
59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int next_fd;
60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct embedded_fd_set close_on_exec_init;
61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct embedded_fd_set open_fds_init;
62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct file * fd_array[NR_OPEN_DEFAULT];
63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define files_fdtable(files) (rcu_dereference((files)->fdt))
66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void FASTCALL(__fput(struct file *));
68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void FASTCALL(fput(struct file *));
69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void fput_light(struct file *file, int fput_needed)
71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	if (unlikely(fput_needed))
73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		fput(file);
74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct file * FASTCALL(fget(unsigned int fd));
77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct file * FASTCALL(fget_light(unsigned int fd, int *fput_needed));
78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void FASTCALL(set_close_on_exec(unsigned int fd, int flag));
79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void put_filp(struct file *);
80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int get_unused_fd(void);
81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void FASTCALL(put_unused_fd(unsigned int fd));
82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct kmem_cache;
83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct file ** alloc_fd_array(int);
85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void free_fd_array(struct file **, int);
86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern fd_set *alloc_fdset(int);
88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void free_fdset(fd_set *, int);
89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int expand_files(struct files_struct *, int nr);
91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void free_fdtable(struct fdtable *fdt);
92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __init files_defer_init(void);
93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline struct file * fcheck_files(struct files_struct *files, unsigned int fd)
95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct file * file = NULL;
97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct fdtable *fdt = files_fdtable(files);
98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	if (fd < fdt->max_fds)
100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		file = rcu_dereference(fdt->fd[fd]);
101c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return file;
102c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
103c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
104c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
105c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Check whether the specified fd has an open file.
106c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
107c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define fcheck(fd)	fcheck_files(current->files, fd)
108c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
109c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void FASTCALL(fd_install(unsigned int fd, struct file * file));
110c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
111c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct task_struct;
112c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
113c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct files_struct *get_files_struct(struct task_struct *);
114c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid FASTCALL(put_files_struct(struct files_struct *fs));
115c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
116c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* __LINUX_FILE_H */
117