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 lsm_flags;
103 enum fs_context_purpose purpose:8;
104 enum fs_context_phase phase:8;
105 bool need_free:1;
106 bool global:1;
107};
108
109struct fs_context_operations {
110 void (*free)(struct fs_context *fc);
111 int (*dup)(struct fs_context *fc, struct fs_context *src_fc);
112 int (*parse_param)(struct fs_context *fc, struct fs_parameter *param);
113 int (*parse_monolithic)(struct fs_context *fc, void *data);
114 int (*get_tree)(struct fs_context *fc);
115 int (*reconfigure)(struct fs_context *fc);
116};
117
118
119
120
121extern struct fs_context *fs_context_for_mount(struct file_system_type *fs_type,
122 unsigned int sb_flags);
123extern struct fs_context *fs_context_for_reconfigure(struct dentry *dentry,
124 unsigned int sb_flags,
125 unsigned int sb_flags_mask);
126extern struct fs_context *fs_context_for_submount(struct file_system_type *fs_type,
127 struct dentry *reference);
128
129extern struct fs_context *vfs_dup_fs_context(struct fs_context *fc);
130extern int vfs_parse_fs_param(struct fs_context *fc, struct fs_parameter *param);
131extern int vfs_parse_fs_string(struct fs_context *fc, const char *key,
132 const char *value, size_t v_size);
133extern int generic_parse_monolithic(struct fs_context *fc, void *data);
134extern int vfs_get_tree(struct fs_context *fc);
135extern void put_fs_context(struct fs_context *fc);
136
137
138
139
140enum vfs_get_super_keying {
141 vfs_get_single_super,
142 vfs_get_keyed_super,
143 vfs_get_independent_super,
144};
145extern int vfs_get_super(struct fs_context *fc,
146 enum vfs_get_super_keying keying,
147 int (*fill_super)(struct super_block *sb,
148 struct fs_context *fc));
149
150extern const struct file_operations fscontext_fops;
151
152
153
154
155
156struct fc_log {
157 refcount_t usage;
158 u8 head;
159 u8 tail;
160 u8 need_free;
161 struct module *owner;
162 char *buffer[8];
163};
164
165extern __attribute__((format(printf, 2, 3)))
166void logfc(struct fs_context *fc, const char *fmt, ...);
167
168
169
170
171
172
173
174
175
176#define infof(fc, fmt, ...) ({ logfc(fc, "i "fmt, ## __VA_ARGS__); })
177
178
179
180
181
182
183
184
185
186#define warnf(fc, fmt, ...) ({ logfc(fc, "w "fmt, ## __VA_ARGS__); })
187
188
189
190
191
192
193
194
195
196#define errorf(fc, fmt, ...) ({ logfc(fc, "e "fmt, ## __VA_ARGS__); })
197
198
199
200
201
202
203
204
205
206#define invalf(fc, fmt, ...) ({ errorf(fc, fmt, ## __VA_ARGS__); -EINVAL; })
207
208#endif
209