Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 */ 2 : : /* 3 : : * Wrapper functions for accessing the file_struct fd array. 4 : : */ 5 : : 6 : : #ifndef __LINUX_FILE_H 7 : : #define __LINUX_FILE_H 8 : : 9 : : #include <linux/compiler.h> 10 : : #include <linux/types.h> 11 : : #include <linux/posix_types.h> 12 : : 13 : : struct file; 14 : : 15 : : extern void fput(struct file *); 16 : : extern void fput_many(struct file *, unsigned int); 17 : : 18 : : struct file_operations; 19 : : struct vfsmount; 20 : : struct dentry; 21 : : struct inode; 22 : : struct path; 23 : : extern struct file *alloc_file_pseudo(struct inode *, struct vfsmount *, 24 : : const char *, int flags, const struct file_operations *); 25 : : extern struct file *alloc_file_clone(struct file *, int flags, 26 : : const struct file_operations *); 27 : : 28 : : static inline void fput_light(struct file *file, int fput_needed) 29 : : { 30 : 3 : if (fput_needed) 31 : 3 : fput(file); 32 : : } 33 : : 34 : : struct fd { 35 : : struct file *file; 36 : : unsigned int flags; 37 : : }; 38 : : #define FDPUT_FPUT 1 39 : : #define FDPUT_POS_UNLOCK 2 40 : : 41 : : static inline void fdput(struct fd fd) 42 : : { 43 : 3 : if (fd.flags & FDPUT_FPUT) 44 : 3 : fput(fd.file); 45 : : } 46 : : 47 : : extern struct file *fget(unsigned int fd); 48 : : extern struct file *fget_many(unsigned int fd, unsigned int refs); 49 : : extern struct file *fget_raw(unsigned int fd); 50 : : extern unsigned long __fdget(unsigned int fd); 51 : : extern unsigned long __fdget_raw(unsigned int fd); 52 : : extern unsigned long __fdget_pos(unsigned int fd); 53 : : extern void __f_unlock_pos(struct file *); 54 : : 55 : : static inline struct fd __to_fd(unsigned long v) 56 : : { 57 : 3 : return (struct fd){(struct file *)(v & ~3),v & 3}; 58 : : } 59 : : 60 : : static inline struct fd fdget(unsigned int fd) 61 : : { 62 : 3 : return __to_fd(__fdget(fd)); 63 : : } 64 : : 65 : : static inline struct fd fdget_raw(unsigned int fd) 66 : : { 67 : 3 : return __to_fd(__fdget_raw(fd)); 68 : : } 69 : : 70 : : static inline struct fd fdget_pos(int fd) 71 : : { 72 : 3 : return __to_fd(__fdget_pos(fd)); 73 : : } 74 : : 75 : 3 : static inline void fdput_pos(struct fd f) 76 : : { 77 : 3 : if (f.flags & FDPUT_POS_UNLOCK) 78 : 3 : __f_unlock_pos(f.file); 79 : : fdput(f); 80 : 3 : } 81 : : 82 : : extern int f_dupfd(unsigned int from, struct file *file, unsigned flags); 83 : : extern int replace_fd(unsigned fd, struct file *file, unsigned flags); 84 : : extern void set_close_on_exec(unsigned int fd, int flag); 85 : : extern bool get_close_on_exec(unsigned int fd); 86 : : extern int get_unused_fd_flags(unsigned flags); 87 : : extern void put_unused_fd(unsigned int fd); 88 : : 89 : : extern void fd_install(unsigned int fd, struct file *file); 90 : : 91 : : extern void flush_delayed_fput(void); 92 : : extern void __fput_sync(struct file *); 93 : : 94 : : #endif /* __LINUX_FILE_H */