]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - include/linux/fdtable.h
dmaengine: imx-sdma: fix size check for sdma script_number
[mirror_ubuntu-bionic-kernel.git] / include / linux / fdtable.h
CommitLineData
b2441318 1/* SPDX-License-Identifier: GPL-2.0 */
9f3acc31
AV
2/*
3 * descriptor table internals; you almost certainly want file.h instead.
4 */
5
6#ifndef __LINUX_FDTABLE_H
7#define __LINUX_FDTABLE_H
8
9f3acc31
AV
9#include <linux/posix_types.h>
10#include <linux/compiler.h>
11#include <linux/spinlock.h>
12#include <linux/rcupdate.h>
b45f5dd7 13#include <linux/nospec.h>
9f3acc31 14#include <linux/types.h>
21e54459 15#include <linux/init.h>
2c666df8 16#include <linux/fs.h>
21e54459 17
60063497 18#include <linux/atomic.h>
9f3acc31
AV
19
20/*
21 * The default fd array needs to be at least BITS_PER_LONG,
22 * as this is the granularity returned by copy_fdset().
23 */
24#define NR_OPEN_DEFAULT BITS_PER_LONG
25
9f3acc31
AV
26struct fdtable {
27 unsigned int max_fds;
4d2deb40 28 struct file __rcu **fd; /* current fd array */
1fd36adc
DH
29 unsigned long *close_on_exec;
30 unsigned long *open_fds;
f3f86e33 31 unsigned long *full_fds_bits;
9f3acc31 32 struct rcu_head rcu;
9f3acc31
AV
33};
34
9b80a184 35static inline bool close_on_exec(unsigned int fd, const struct fdtable *fdt)
1dce27c5 36{
1fd36adc 37 return test_bit(fd, fdt->close_on_exec);
1dce27c5
DH
38}
39
9b80a184 40static inline bool fd_is_open(unsigned int fd, const struct fdtable *fdt)
1dce27c5 41{
1fd36adc 42 return test_bit(fd, fdt->open_fds);
1dce27c5
DH
43}
44
9f3acc31
AV
45/*
46 * Open file table structure
47 */
48struct files_struct {
49 /*
50 * read mostly part
51 */
52 atomic_t count;
8a81252b
ED
53 bool resize_in_progress;
54 wait_queue_head_t resize_wait;
55
4d2deb40 56 struct fdtable __rcu *fdt;
9f3acc31
AV
57 struct fdtable fdtab;
58 /*
59 * written part on a separate cache line in SMP
60 */
61 spinlock_t file_lock ____cacheline_aligned_in_smp;
9b80a184 62 unsigned int next_fd;
1fd36adc
DH
63 unsigned long close_on_exec_init[1];
64 unsigned long open_fds_init[1];
f3f86e33 65 unsigned long full_fds_bits_init[1];
4d2deb40 66 struct file __rcu * fd_array[NR_OPEN_DEFAULT];
9f3acc31
AV
67};
68
9f3acc31
AV
69struct file_operations;
70struct vfsmount;
71struct dentry;
72
a8d4b834
ON
73#define rcu_dereference_check_fdtable(files, fdtfd) \
74 rcu_dereference_check((fdtfd), lockdep_is_held(&(files)->file_lock))
75
76#define files_fdtable(files) \
77 rcu_dereference_check_fdtable((files), (files)->fdt)
78
79/*
80 * The caller must ensure that fd table isn't shared or hold rcu or file lock
81 */
82static inline struct file *__fcheck_files(struct files_struct *files, unsigned int fd)
9f3acc31 83{
a8d4b834 84 struct fdtable *fdt = rcu_dereference_raw(files->fdt);
9f3acc31 85
b45f5dd7
DW
86 if (fd < fdt->max_fds) {
87 fd = array_index_nospec(fd, fdt->max_fds);
a8d4b834 88 return rcu_dereference_raw(fdt->fd[fd]);
b45f5dd7 89 }
a8d4b834
ON
90 return NULL;
91}
92
93static inline struct file *fcheck_files(struct files_struct *files, unsigned int fd)
94{
f78f5b90
PM
95 RCU_LOCKDEP_WARN(!rcu_read_lock_held() &&
96 !lockdep_is_held(&files->file_lock),
a8d4b834
ON
97 "suspicious rcu_dereference_check() usage");
98 return __fcheck_files(files, fd);
9f3acc31
AV
99}
100
101/*
102 * Check whether the specified fd has an open file.
103 */
104#define fcheck(fd) fcheck_files(current->files, fd)
105
106struct task_struct;
107
108struct files_struct *get_files_struct(struct task_struct *);
109void put_files_struct(struct files_struct *fs);
110void reset_files_struct(struct files_struct *);
111int unshare_files(struct files_struct **);
0766f788 112struct files_struct *dup_fd(struct files_struct *, int *) __latent_entropy;
6a6d27de 113void do_close_on_exec(struct files_struct *);
c3c073f8
AV
114int iterate_fd(struct files_struct *, unsigned,
115 int (*)(const void *, struct file *, unsigned),
116 const void *);
9f3acc31 117
dcfadfa4
AV
118extern int __alloc_fd(struct files_struct *files,
119 unsigned start, unsigned end, unsigned flags);
f869e8a7
AV
120extern void __fd_install(struct files_struct *files,
121 unsigned int fd, struct file *file);
483ce1d4
AV
122extern int __close_fd(struct files_struct *files,
123 unsigned int fd);
dcfadfa4 124
9f3acc31
AV
125extern struct kmem_cache *files_cachep;
126
127#endif /* __LINUX_FDTABLE_H */