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