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 [ # # + + : 6605014 : if (fput_needed)
+ - + + +
+ + + + +
+ + + + #
# + + + +
+ + + + +
+ + + ]
31 : 2373316 : 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 [ + + + + : 138594996 : if (fd.flags & FDPUT_FPUT)
+ + + + +
+ # # # #
- + + + +
+ # # ]
44 : 18208986 : 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 : 145273012 : return (struct fd){(struct file *)(v & ~3),v & 3};
58 : : }
59 : :
60 : : static inline struct fd fdget(unsigned int fd)
61 : : {
62 : 25098086 : return __to_fd(__fdget(fd));
63 : : }
64 : :
65 : : static inline struct fd fdget_raw(unsigned int fd)
66 : : {
67 : 46579592 : return __to_fd(__fdget_raw(fd));
68 : : }
69 : :
70 : : static inline struct fd fdget_pos(int fd)
71 : : {
72 : 73594046 : return __to_fd(__fdget_pos(fd));
73 : : }
74 : :
75 : 73584804 : static inline void fdput_pos(struct fd f)
76 : : {
77 [ + + ]: 73584804 : if (f.flags & FDPUT_POS_UNLOCK)
78 : 5846474 : __f_unlock_pos(f.file);
79 : : fdput(f);
80 : 73581154 : }
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 */
|