diff options
Diffstat (limited to '')
-rw-r--r-- | include/linux/file.h | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/include/linux/file.h b/include/linux/file.h new file mode 100644 index 000000000..225982792 --- /dev/null +++ b/include/linux/file.h @@ -0,0 +1,118 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Wrapper functions for accessing the file_struct fd array. + */ + +#ifndef __LINUX_FILE_H +#define __LINUX_FILE_H + +#include <linux/compiler.h> +#include <linux/types.h> +#include <linux/posix_types.h> +#include <linux/errno.h> + +struct file; + +extern void fput(struct file *); +extern void fput_many(struct file *, unsigned int); + +struct file_operations; +struct task_struct; +struct vfsmount; +struct dentry; +struct inode; +struct path; +extern struct file *alloc_file_pseudo(struct inode *, struct vfsmount *, + const char *, int flags, const struct file_operations *); +extern struct file *alloc_file_clone(struct file *, int flags, + const struct file_operations *); + +static inline void fput_light(struct file *file, int fput_needed) +{ + if (fput_needed) + fput(file); +} + +struct fd { + struct file *file; + unsigned int flags; +}; +#define FDPUT_FPUT 1 +#define FDPUT_POS_UNLOCK 2 + +static inline void fdput(struct fd fd) +{ + if (fd.flags & FDPUT_FPUT) + fput(fd.file); +} + +extern struct file *fget(unsigned int fd); +extern struct file *fget_many(unsigned int fd, unsigned int refs); +extern struct file *fget_raw(unsigned int fd); +extern struct file *fget_task(struct task_struct *task, unsigned int fd); +extern unsigned long __fdget(unsigned int fd); +extern unsigned long __fdget_raw(unsigned int fd); +extern unsigned long __fdget_pos(unsigned int fd); +extern void __f_unlock_pos(struct file *); + +static inline struct fd __to_fd(unsigned long v) +{ + return (struct fd){(struct file *)(v & ~3),v & 3}; +} + +static inline struct fd fdget(unsigned int fd) +{ + return __to_fd(__fdget(fd)); +} + +static inline struct fd fdget_raw(unsigned int fd) +{ + return __to_fd(__fdget_raw(fd)); +} + +static inline struct fd fdget_pos(int fd) +{ + return __to_fd(__fdget_pos(fd)); +} + +static inline void fdput_pos(struct fd f) +{ + if (f.flags & FDPUT_POS_UNLOCK) + __f_unlock_pos(f.file); + fdput(f); +} + +extern int f_dupfd(unsigned int from, struct file *file, unsigned flags); +extern int replace_fd(unsigned fd, struct file *file, unsigned flags); +extern void set_close_on_exec(unsigned int fd, int flag); +extern bool get_close_on_exec(unsigned int fd); +extern int __get_unused_fd_flags(unsigned flags, unsigned long nofile); +extern int get_unused_fd_flags(unsigned flags); +extern void put_unused_fd(unsigned int fd); + +extern void fd_install(unsigned int fd, struct file *file); + +extern int __receive_fd(int fd, struct file *file, int __user *ufd, + unsigned int o_flags); +static inline int receive_fd_user(struct file *file, int __user *ufd, + unsigned int o_flags) +{ + if (ufd == NULL) + return -EFAULT; + return __receive_fd(-1, file, ufd, o_flags); +} +static inline int receive_fd(struct file *file, unsigned int o_flags) +{ + return __receive_fd(-1, file, NULL, o_flags); +} +static inline int receive_fd_replace(int fd, struct file *file, unsigned int o_flags) +{ + return __receive_fd(fd, file, NULL, o_flags); +} + +extern void flush_delayed_fput(void); +extern void __fput_sync(struct file *); + +extern unsigned int sysctl_nr_open_min, sysctl_nr_open_max; + +#endif /* __LINUX_FILE_H */ |