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