cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

fdtable.h (3651B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      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
      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>
     16#include <linux/fs.h>
     17
     18#include <linux/atomic.h>
     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#define NR_OPEN_MAX ~0U
     26
     27struct fdtable {
     28	unsigned int max_fds;
     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;
     33	struct rcu_head rcu;
     34};
     35
     36static inline bool close_on_exec(unsigned int fd, const struct fdtable *fdt)
     37{
     38	return test_bit(fd, fdt->close_on_exec);
     39}
     40
     41static inline bool fd_is_open(unsigned int fd, const struct fdtable *fdt)
     42{
     43	return test_bit(fd, fdt->open_fds);
     44}
     45
     46/*
     47 * Open file table structure
     48 */
     49struct files_struct {
     50  /*
     51   * read mostly part
     52   */
     53	atomic_t count;
     54	bool resize_in_progress;
     55	wait_queue_head_t resize_wait;
     56
     57	struct fdtable __rcu *fdt;
     58	struct fdtable fdtab;
     59  /*
     60   * written part on a separate cache line in SMP
     61   */
     62	spinlock_t file_lock ____cacheline_aligned_in_smp;
     63	unsigned int next_fd;
     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];
     68};
     69
     70struct file_operations;
     71struct vfsmount;
     72struct dentry;
     73
     74#define rcu_dereference_check_fdtable(files, fdtfd) \
     75	rcu_dereference_check((fdtfd), lockdep_is_held(&(files)->file_lock))
     76
     77#define files_fdtable(files) \
     78	rcu_dereference_check_fdtable((files), (files)->fdt)
     79
     80/*
     81 * The caller must ensure that fd table isn't shared or hold rcu or file lock
     82 */
     83static inline struct file *files_lookup_fd_raw(struct files_struct *files, unsigned int fd)
     84{
     85	struct fdtable *fdt = rcu_dereference_raw(files->fdt);
     86
     87	if (fd < fdt->max_fds) {
     88		fd = array_index_nospec(fd, fdt->max_fds);
     89		return rcu_dereference_raw(fdt->fd[fd]);
     90	}
     91	return NULL;
     92}
     93
     94static inline struct file *files_lookup_fd_locked(struct files_struct *files, unsigned int fd)
     95{
     96	RCU_LOCKDEP_WARN(!lockdep_is_held(&files->file_lock),
     97			   "suspicious rcu_dereference_check() usage");
     98	return files_lookup_fd_raw(files, fd);
     99}
    100
    101static inline struct file *files_lookup_fd_rcu(struct files_struct *files, unsigned int fd)
    102{
    103	RCU_LOCKDEP_WARN(!rcu_read_lock_held(),
    104			   "suspicious rcu_dereference_check() usage");
    105	return files_lookup_fd_raw(files, fd);
    106}
    107
    108static inline struct file *lookup_fd_rcu(unsigned int fd)
    109{
    110	return files_lookup_fd_rcu(current->files, fd);
    111}
    112
    113struct file *task_lookup_fd_rcu(struct task_struct *task, unsigned int fd);
    114struct file *task_lookup_next_fd_rcu(struct task_struct *task, unsigned int *fd);
    115
    116struct task_struct;
    117
    118void put_files_struct(struct files_struct *fs);
    119int unshare_files(void);
    120struct files_struct *dup_fd(struct files_struct *, unsigned, int *) __latent_entropy;
    121void do_close_on_exec(struct files_struct *);
    122int iterate_fd(struct files_struct *, unsigned,
    123		int (*)(const void *, struct file *, unsigned),
    124		const void *);
    125
    126extern int close_fd(unsigned int fd);
    127extern int __close_range(unsigned int fd, unsigned int max_fd, unsigned int flags);
    128extern struct file *close_fd_get_file(unsigned int fd);
    129extern int unshare_fd(unsigned long unshare_flags, unsigned int max_fds,
    130		      struct files_struct **new_fdp);
    131
    132extern struct kmem_cache *files_cachep;
    133
    134#endif /* __LINUX_FDTABLE_H */