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_filename_empty,
58 fs_value_is_file,
59};
60
61
62
63
64struct 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
86struct 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 struct dentry *root;
92 struct user_namespace *user_ns;
93 struct net *net_ns;
94 const struct cred *cred;
95 struct fc_log *log;
96 const char *source;
97 const char *subtype;
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
110struct 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
122extern struct fs_context *fs_context_for_mount(struct file_system_type *fs_type,
123 unsigned int sb_flags);
124extern struct fs_context *fs_context_for_reconfigure(struct dentry *dentry,
125 unsigned int sb_flags,
126 unsigned int sb_flags_mask);
127extern struct fs_context *fs_context_for_submount(struct file_system_type *fs_type,
128 struct dentry *reference);
129
130extern struct fs_context *vfs_dup_fs_context(struct fs_context *fc);
131extern int vfs_parse_fs_param(struct fs_context *fc, struct fs_parameter *param);
132extern int vfs_parse_fs_string(struct fs_context *fc, const char *key,
133 const char *value, size_t v_size);
134extern int generic_parse_monolithic(struct fs_context *fc, void *data);
135extern int vfs_get_tree(struct fs_context *fc);
136extern void put_fs_context(struct fs_context *fc);
137
138
139
140
141enum vfs_get_super_keying {
142 vfs_get_single_super,
143 vfs_get_keyed_super,
144 vfs_get_independent_super,
145};
146extern int vfs_get_super(struct fs_context *fc,
147 enum vfs_get_super_keying keying,
148 int (*fill_super)(struct super_block *sb,
149 struct fs_context *fc));
150extern int get_tree_nodev(struct fs_context *fc,
151 int (*fill_super)(struct super_block *sb,
152 struct fs_context *fc));
153extern int get_tree_single(struct fs_context *fc,
154 int (*fill_super)(struct super_block *sb,
155 struct fs_context *fc));
156
157extern const struct file_operations fscontext_fops;
158
159
160
161
162
163struct fc_log {
164 refcount_t usage;
165 u8 head;
166 u8 tail;
167 u8 need_free;
168 struct module *owner;
169 char *buffer[8];
170};
171
172extern __attribute__((format(printf, 2, 3)))
173void logfc(struct fs_context *fc, const char *fmt, ...);
174
175
176
177
178
179
180
181
182
183#define infof(fc, fmt, ...) ({ logfc(fc, "i "fmt, ## __VA_ARGS__); })
184
185
186
187
188
189
190
191
192
193#define warnf(fc, fmt, ...) ({ logfc(fc, "w "fmt, ## __VA_ARGS__); })
194
195
196
197
198
199
200
201
202
203#define errorf(fc, fmt, ...) ({ logfc(fc, "e "fmt, ## __VA_ARGS__); })
204
205
206
207
208
209
210
211
212
213#define invalf(fc, fmt, ...) ({ errorf(fc, fmt, ## __VA_ARGS__); -EINVAL; })
214
215#endif
216