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 task_struct;
20 : : struct vfsmount;
21 : : struct dentry;
22 : : struct inode;
23 : : struct path;
24 : : extern struct file *alloc_file_pseudo(struct inode *, struct vfsmount *,
25 : : const char *, int flags, const struct file_operations *);
26 : : extern struct file *alloc_file_clone(struct file *, int flags,
27 : : const struct file_operations *);
28 : :
29 : 129347 : static inline void fput_light(struct file *file, int fput_needed)
30 : : {
31 [ - - + + : 129347 : if (fput_needed)
- - + + -
+ + + + +
+ + + + -
- - - - +
- + - + ]
32 : 7624 : fput(file);
33 : : }
34 : :
35 : : struct fd {
36 : : struct file *file;
37 : : unsigned int flags;
38 : : };
39 : : #define FDPUT_FPUT 1
40 : : #define FDPUT_POS_UNLOCK 2
41 : :
42 : 2193187 : static inline void fdput(struct fd fd)
43 : : {
44 [ + + + + : 2183883 : if (fd.flags & FDPUT_FPUT)
+ + - + -
+ - - - -
- - - - -
+ - - ]
45 : 6177 : fput(fd.file);
46 : : }
47 : :
48 : : extern struct file *fget(unsigned int fd);
49 : : extern struct file *fget_many(unsigned int fd, unsigned int refs);
50 : : extern struct file *fget_raw(unsigned int fd);
51 : : extern struct file *fget_task(struct task_struct *task, unsigned int fd);
52 : : extern unsigned long __fdget(unsigned int fd);
53 : : extern unsigned long __fdget_raw(unsigned int fd);
54 : : extern unsigned long __fdget_pos(unsigned int fd);
55 : : extern void __f_unlock_pos(struct file *);
56 : :
57 : 2891927 : static inline struct fd __to_fd(unsigned long v)
58 : : {
59 [ + + + + : 2891927 : return (struct fd){(struct file *)(v & ~3),v & 3};
+ + + - -
+ - - - -
- - - - -
- - - + -
- - + - -
- + - + -
- - + - ]
60 : : }
61 : :
62 : 459715 : static inline struct fd fdget(unsigned int fd)
63 : : {
64 : 459715 : return __to_fd(__fdget(fd));
65 : : }
66 : :
67 : 1871191 : static inline struct fd fdget_raw(unsigned int fd)
68 : : {
69 : 1871191 : return __to_fd(__fdget_raw(fd));
70 : : }
71 : :
72 : 561021 : static inline struct fd fdget_pos(int fd)
73 : : {
74 : 561021 : return __to_fd(__fdget_pos(fd));
75 : : }
76 : :
77 : : static inline void fdput_pos(struct fd f)
78 : : {
79 : : if (f.flags & FDPUT_POS_UNLOCK)
80 : : __f_unlock_pos(f.file);
81 : : fdput(f);
82 : : }
83 : :
84 : : extern int f_dupfd(unsigned int from, struct file *file, unsigned flags);
85 : : extern int replace_fd(unsigned fd, struct file *file, unsigned flags);
86 : : extern void set_close_on_exec(unsigned int fd, int flag);
87 : : extern bool get_close_on_exec(unsigned int fd);
88 : : extern int __get_unused_fd_flags(unsigned flags, unsigned long nofile);
89 : : extern int get_unused_fd_flags(unsigned flags);
90 : : extern void put_unused_fd(unsigned int fd);
91 : :
92 : : extern void fd_install(unsigned int fd, struct file *file);
93 : :
94 : : extern void flush_delayed_fput(void);
95 : : extern void __fput_sync(struct file *);
96 : :
97 : : #endif /* __LINUX_FILE_H */
|