1 /* SPDX-License-Identifier: GPL-2.0 */
3 * descriptor table internals; you almost certainly want file.h instead.
6 #ifndef __LINUX_FDTABLE_H
7 #define __LINUX_FDTABLE_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/nospec.h>
14 #include <linux/types.h>
15 #include <linux/init.h>
18 #include <linux/atomic.h>
21 * The default fd array needs to be at least BITS_PER_LONG,
22 * as this is the granularity returned by copy_fdset().
24 #define NR_OPEN_DEFAULT BITS_PER_LONG
25 #define NR_OPEN_MAX ~0U
29 struct file __rcu
**fd
; /* current fd array */
30 unsigned long *close_on_exec
;
31 unsigned long *open_fds
;
32 unsigned long *full_fds_bits
;
36 static inline bool close_on_exec(unsigned int fd
, const struct fdtable
*fdt
)
38 return test_bit(fd
, fdt
->close_on_exec
);
41 static inline bool fd_is_open(unsigned int fd
, const struct fdtable
*fdt
)
43 return test_bit(fd
, fdt
->open_fds
);
47 * Open file table structure
54 bool resize_in_progress
;
55 wait_queue_head_t resize_wait
;
57 struct fdtable __rcu
*fdt
;
60 * written part on a separate cache line in SMP
62 spinlock_t file_lock ____cacheline_aligned_in_smp
;
64 unsigned long close_on_exec_init
[1];
65 unsigned long open_fds_init
[1];
66 unsigned long full_fds_bits_init
[1];
67 struct file __rcu
* fd_array
[NR_OPEN_DEFAULT
];
70 struct file_operations
;
74 #define rcu_dereference_check_fdtable(files, fdtfd) \
75 rcu_dereference_check((fdtfd), lockdep_is_held(&(files)->file_lock))
77 #define files_fdtable(files) \
78 rcu_dereference_check_fdtable((files), (files)->fdt)
81 * The caller must ensure that fd table isn't shared or hold rcu or file lock
83 static inline struct file
*files_lookup_fd_raw(struct files_struct
*files
, unsigned int fd
)
85 struct fdtable
*fdt
= rcu_dereference_raw(files
->fdt
);
87 if (fd
< fdt
->max_fds
) {
88 fd
= array_index_nospec(fd
, fdt
->max_fds
);
89 return rcu_dereference_raw(fdt
->fd
[fd
]);
94 static inline struct file
*files_lookup_fd_locked(struct files_struct
*files
, unsigned int fd
)
96 RCU_LOCKDEP_WARN(!lockdep_is_held(&files
->file_lock
),
97 "suspicious rcu_dereference_check() usage");
98 return files_lookup_fd_raw(files
, fd
);
101 static inline struct file
*files_lookup_fd_rcu(struct files_struct
*files
, unsigned int fd
)
103 RCU_LOCKDEP_WARN(!rcu_read_lock_held(),
104 "suspicious rcu_dereference_check() usage");
105 return files_lookup_fd_raw(files
, fd
);
108 static inline struct file
*lookup_fd_rcu(unsigned int fd
)
110 return files_lookup_fd_rcu(current
->files
, fd
);
113 struct file
*task_lookup_fd_rcu(struct task_struct
*task
, unsigned int fd
);
114 struct file
*task_lookup_next_fd_rcu(struct task_struct
*task
, unsigned int *fd
);
118 void put_files_struct(struct files_struct
*fs
);
119 int unshare_files(void);
120 struct files_struct
*dup_fd(struct files_struct
*, unsigned, int *) __latent_entropy
;
121 void do_close_on_exec(struct files_struct
*);
122 int iterate_fd(struct files_struct
*, unsigned,
123 int (*)(const void *, struct file
*, unsigned),
126 extern int close_fd(unsigned int fd
);
127 extern int __close_range(unsigned int fd
, unsigned int max_fd
, unsigned int flags
);
128 extern int close_fd_get_file(unsigned int fd
, struct file
**res
);
129 extern int unshare_fd(unsigned long unshare_flags
, unsigned int max_fds
,
130 struct files_struct
**new_fdp
);
132 extern struct kmem_cache
*files_cachep
;
134 #endif /* __LINUX_FDTABLE_H */