cregit-Linux how code gets into the kernel

Release 4.15 include/linux/fdtable.h

Directory: include/linux
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * descriptor table internals; you almost certainly want file.h instead.
 */

#ifndef __LINUX_FDTABLE_H

#define __LINUX_FDTABLE_H

#include <linux/posix_types.h>
#include <linux/compiler.h>
#include <linux/spinlock.h>
#include <linux/rcupdate.h>
#include <linux/types.h>
#include <linux/init.h>
#include <linux/fs.h>

#include <linux/atomic.h>

/*
 * The default fd array needs to be at least BITS_PER_LONG,
 * as this is the granularity returned by copy_fdset().
 */

#define NR_OPEN_DEFAULT BITS_PER_LONG


struct fdtable {
	
unsigned int max_fds;
	
struct file __rcu **fd;      /* current fd array */
	
unsigned long *close_on_exec;
	
unsigned long *open_fds;
	
unsigned long *full_fds_bits;
	
struct rcu_head rcu;
};


static inline bool close_on_exec(unsigned int fd, const struct fdtable *fdt) { return test_bit(fd, fdt->close_on_exec); }

Contributors

PersonTokensPropCommitsCommitProp
David Howells2696.30%266.67%
Alexey Dobriyan13.70%133.33%
Total27100.00%3100.00%


static inline bool fd_is_open(unsigned int fd, const struct fdtable *fdt) { return test_bit(fd, fdt->open_fds); }

Contributors

PersonTokensPropCommitsCommitProp
David Howells2696.30%266.67%
Alexey Dobriyan13.70%133.33%
Total27100.00%3100.00%

/* * Open file table structure */ struct files_struct { /* * read mostly part */ atomic_t count; bool resize_in_progress; wait_queue_head_t resize_wait; struct fdtable __rcu *fdt; struct fdtable fdtab; /* * written part on a separate cache line in SMP */ spinlock_t file_lock ____cacheline_aligned_in_smp; unsigned int next_fd; unsigned long close_on_exec_init[1]; unsigned long open_fds_init[1]; unsigned long full_fds_bits_init[1]; struct file __rcu * fd_array[NR_OPEN_DEFAULT]; }; struct file_operations; struct vfsmount; struct dentry; #define rcu_dereference_check_fdtable(files, fdtfd) \ rcu_dereference_check((fdtfd), lockdep_is_held(&(files)->file_lock)) #define files_fdtable(files) \ rcu_dereference_check_fdtable((files), (files)->fdt) /* * The caller must ensure that fd table isn't shared or hold rcu or file lock */
static inline struct file *__fcheck_files(struct files_struct *files, unsigned int fd) { struct fdtable *fdt = rcu_dereference_raw(files->fdt); if (fd < fdt->max_fds) return rcu_dereference_raw(fdt->fd[fd]); return NULL; }

Contributors

PersonTokensPropCommitsCommitProp
Al Viro4280.77%150.00%
Oleg Nesterov1019.23%150.00%
Total52100.00%2100.00%


static inline struct file *fcheck_files(struct files_struct *files, unsigned int fd) { RCU_LOCKDEP_WARN(!rcu_read_lock_held() && !lockdep_is_held(&files->file_lock), "suspicious rcu_dereference_check() usage"); return __fcheck_files(files, fd); }

Contributors

PersonTokensPropCommitsCommitProp
Oleg Nesterov3784.09%133.33%
Paul E. McKenney49.09%133.33%
Al Viro36.82%133.33%
Total44100.00%3100.00%

/* * Check whether the specified fd has an open file. */ #define fcheck(fd) fcheck_files(current->files, fd) struct task_struct; struct files_struct *get_files_struct(struct task_struct *); void put_files_struct(struct files_struct *fs); void reset_files_struct(struct files_struct *); int unshare_files(struct files_struct **); struct files_struct *dup_fd(struct files_struct *, int *) __latent_entropy; void do_close_on_exec(struct files_struct *); int iterate_fd(struct files_struct *, unsigned, int (*)(const void *, struct file *, unsigned), const void *); extern int __alloc_fd(struct files_struct *files, unsigned start, unsigned end, unsigned flags); extern void __fd_install(struct files_struct *files, unsigned int fd, struct file *file); extern int __close_fd(struct files_struct *files, unsigned int fd); extern struct kmem_cache *files_cachep; #endif /* __LINUX_FDTABLE_H */

Overall Contributors

PersonTokensPropCommitsCommitProp
Al Viro29862.61%735.00%
David Howells6613.87%210.00%
Oleg Nesterov6613.87%15.00%
Linus Torvalds122.52%15.00%
Emese Revfy81.68%15.00%
Paul E. McKenney71.47%210.00%
Eric Dumazet61.26%15.00%
Ingo Molnar51.05%15.00%
Arnd Bergmann30.63%15.00%
Alexey Dobriyan30.63%15.00%
Greg Kroah-Hartman10.21%15.00%
Arun Sharma10.21%15.00%
Total476100.00%20100.00%
Directory: include/linux
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.