xref: /linux/include/linux/fs_struct.h (revision afdf0fb340948a8c0f581ed1dc42828af89b80b6)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _LINUX_FS_STRUCT_H
3 #define _LINUX_FS_STRUCT_H
4 
5 #include <linux/sched.h>
6 #include <linux/path.h>
7 #include <linux/spinlock.h>
8 #include <linux/seqlock.h>
9 
10 struct fs_struct {
11 	int users;
12 	seqlock_t seq;
13 	int umask;
14 	int in_exec;
15 	struct path root, pwd;
16 } __randomize_layout;
17 
18 extern struct kmem_cache *fs_cachep;
19 
20 extern void exit_fs(struct task_struct *);
21 extern void set_fs_root(struct fs_struct *, const struct path *);
22 extern void set_fs_pwd(struct fs_struct *, const struct path *);
23 extern struct fs_struct *copy_fs_struct(struct fs_struct *);
24 extern void free_fs_struct(struct fs_struct *);
25 extern int unshare_fs_struct(void);
26 
get_fs_root(struct fs_struct * fs,struct path * root)27 static inline void get_fs_root(struct fs_struct *fs, struct path *root)
28 {
29 	read_seqlock_excl(&fs->seq);
30 	*root = fs->root;
31 	path_get(root);
32 	read_sequnlock_excl(&fs->seq);
33 }
34 
get_fs_pwd(struct fs_struct * fs,struct path * pwd)35 static inline void get_fs_pwd(struct fs_struct *fs, struct path *pwd)
36 {
37 	read_seqlock_excl(&fs->seq);
38 	*pwd = fs->pwd;
39 	path_get(pwd);
40 	read_sequnlock_excl(&fs->seq);
41 }
42 
43 extern bool current_chrooted(void);
44 
current_umask(void)45 static inline int current_umask(void)
46 {
47 	return current->fs->umask;
48 }
49 
50 #endif /* _LINUX_FS_STRUCT_H */
51