1
2
3
4
5
6
7
8 #ifndef _LINUX_FS_CONTEXT_H
9 #define _LINUX_FS_CONTEXT_H
10
11 #include <linux/kernel.h>
12 #include <linux/refcount.h>
13 #include <linux/errno.h>
14 #include <linux/security.h>
15 #include <linux/mutex.h>
16
17 struct cred;
18 struct dentry;
19 struct file_operations;
20 struct file_system_type;
21 struct mnt_namespace;
22 struct net;
23 struct pid_namespace;
24 struct super_block;
25 struct user_namespace;
26 struct vfsmount;
27 struct path;
28
29 enum fs_context_purpose {
30 FS_CONTEXT_FOR_MOUNT,
31 FS_CONTEXT_FOR_SUBMOUNT,
32 FS_CONTEXT_FOR_RECONFIGURE,
33 };
34
35
36
37
38 enum fs_context_phase {
39 FS_CONTEXT_CREATE_PARAMS,
40 FS_CONTEXT_CREATING,
41 FS_CONTEXT_AWAITING_MOUNT,
42 FS_CONTEXT_AWAITING_RECONF,
43 FS_CONTEXT_RECONF_PARAMS,
44 FS_CONTEXT_RECONFIGURING,
45 FS_CONTEXT_FAILED,
46 };
47
48
49
50
51 enum fs_value_type {
52 fs_value_is_undefined,
53 fs_value_is_flag,
54 fs_value_is_string,
55 fs_value_is_blob,
56 fs_value_is_filename,
57 fs_value_is_filename_empty,
58 fs_value_is_file,
59 };
60
61
62
63
64 struct fs_parameter {
65 const char *key;
66 enum fs_value_type type:8;
67 union {
68 char *string;
69 void *blob;
70 struct filename *name;
71 struct file *file;
72 };
73 size_t size;
74 int dirfd;
75 };
76
77
78
79
80
81
82
83
84
85
86 struct fs_context {
87 const struct fs_context_operations *ops;
88 struct mutex uapi_mutex;
89 struct file_system_type *fs_type;
90 void *fs_private;
91 void *sget_key;
92 struct dentry *root;
93 struct user_namespace *user_ns;
94 struct net *net_ns;
95 const struct cred *cred;
96 struct fc_log *log;
97 const char *source;
98 void *security;
99 void *s_fs_info;
100 unsigned int sb_flags;
101 unsigned int sb_flags_mask;
102 unsigned int s_iflags;
103 unsigned int lsm_flags;
104 enum fs_context_purpose purpose:8;
105 enum fs_context_phase phase:8;
106 bool need_free:1;
107 bool global:1;
108 };
109
110 struct fs_context_operations {
111 void (*free)(struct fs_context *fc);
112 int (*dup)(struct fs_context *fc, struct fs_context *src_fc);
113 int (*parse_param)(struct fs_context *fc, struct fs_parameter *param);
114 int (*parse_monolithic)(struct fs_context *fc, void *data);
115 int (*get_tree)(struct fs_context *fc);
116 int (*reconfigure)(struct fs_context *fc);
117 };
118
119
120
121
122 extern struct fs_context *fs_context_for_mount(struct file_system_type *fs_type,
123 unsigned int sb_flags);
124 extern struct fs_context *fs_context_for_reconfigure(struct dentry *dentry,
125 unsigned int sb_flags,
126 unsigned int sb_flags_mask);
127 extern struct fs_context *fs_context_for_submount(struct file_system_type *fs_type,
128 struct dentry *reference);
129
130 extern struct fs_context *vfs_dup_fs_context(struct fs_context *fc);
131 extern int vfs_parse_fs_param(struct fs_context *fc, struct fs_parameter *param);
132 extern int vfs_parse_fs_string(struct fs_context *fc, const char *key,
133 const char *value, size_t v_size);
134 extern int generic_parse_monolithic(struct fs_context *fc, void *data);
135 extern int vfs_get_tree(struct fs_context *fc);
136 extern void put_fs_context(struct fs_context *fc);
137
138
139
140
141 enum vfs_get_super_keying {
142 vfs_get_single_super,
143 vfs_get_single_reconf_super,
144 vfs_get_keyed_super,
145 vfs_get_independent_super,
146 };
147 extern int vfs_get_super(struct fs_context *fc,
148 enum vfs_get_super_keying keying,
149 int (*fill_super)(struct super_block *sb,
150 struct fs_context *fc));
151
152 extern int get_tree_nodev(struct fs_context *fc,
153 int (*fill_super)(struct super_block *sb,
154 struct fs_context *fc));
155 extern int get_tree_single(struct fs_context *fc,
156 int (*fill_super)(struct super_block *sb,
157 struct fs_context *fc));
158 extern int get_tree_single_reconf(struct fs_context *fc,
159 int (*fill_super)(struct super_block *sb,
160 struct fs_context *fc));
161 extern int get_tree_keyed(struct fs_context *fc,
162 int (*fill_super)(struct super_block *sb,
163 struct fs_context *fc),
164 void *key);
165
166 extern int get_tree_bdev(struct fs_context *fc,
167 int (*fill_super)(struct super_block *sb,
168 struct fs_context *fc));
169
170 extern const struct file_operations fscontext_fops;
171
172
173
174
175
176 struct fc_log {
177 refcount_t usage;
178 u8 head;
179 u8 tail;
180 u8 need_free;
181 struct module *owner;
182 char *buffer[8];
183 };
184
185 extern __attribute__((format(printf, 2, 3)))
186 void logfc(struct fs_context *fc, const char *fmt, ...);
187
188
189
190
191
192
193
194
195
196 #define infof(fc, fmt, ...) ({ logfc(fc, "i "fmt, ## __VA_ARGS__); })
197
198
199
200
201
202
203
204
205
206 #define warnf(fc, fmt, ...) ({ logfc(fc, "w "fmt, ## __VA_ARGS__); })
207
208
209
210
211
212
213
214
215
216 #define errorf(fc, fmt, ...) ({ logfc(fc, "e "fmt, ## __VA_ARGS__); })
217
218
219
220
221
222
223
224
225
226 #define invalf(fc, fmt, ...) ({ errorf(fc, fmt, ## __VA_ARGS__); -EINVAL; })
227
228 #endif