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