1
2
3
4
5
6
7#ifndef __LINUX_KERNFS_H
8#define __LINUX_KERNFS_H
9
10#include <linux/kernel.h>
11#include <linux/err.h>
12#include <linux/list.h>
13#include <linux/mutex.h>
14#include <linux/idr.h>
15#include <linux/lockdep.h>
16#include <linux/rbtree.h>
17#include <linux/atomic.h>
18#include <linux/wait.h>
19
20struct file;
21struct dentry;
22struct iattr;
23struct seq_file;
24struct vm_area_struct;
25struct super_block;
26struct file_system_type;
27
28struct kernfs_open_node;
29struct kernfs_iattrs;
30
31enum kernfs_node_type {
32 KERNFS_DIR = 0x0001,
33 KERNFS_FILE = 0x0002,
34 KERNFS_LINK = 0x0004,
35};
36
37#define KERNFS_TYPE_MASK 0x000f
38#define KERNFS_FLAG_MASK ~KERNFS_TYPE_MASK
39
40enum kernfs_node_flag {
41 KERNFS_ACTIVATED = 0x0010,
42 KERNFS_NS = 0x0020,
43 KERNFS_HAS_SEQ_SHOW = 0x0040,
44 KERNFS_HAS_MMAP = 0x0080,
45 KERNFS_LOCKDEP = 0x0100,
46 KERNFS_SUICIDAL = 0x0400,
47 KERNFS_SUICIDED = 0x0800,
48 KERNFS_EMPTY_DIR = 0x1000,
49 KERNFS_HAS_RELEASE = 0x2000,
50};
51
52
53enum kernfs_root_flag {
54
55
56
57
58
59
60 KERNFS_ROOT_CREATE_DEACTIVATED = 0x0001,
61
62
63
64
65
66
67
68
69
70
71 KERNFS_ROOT_EXTRA_OPEN_PERM_CHECK = 0x0002,
72
73
74
75
76
77 KERNFS_ROOT_SUPPORT_EXPORTOP = 0x0004,
78};
79
80
81struct kernfs_elem_dir {
82 unsigned long subdirs;
83
84 struct rb_root children;
85
86
87
88
89
90 struct kernfs_root *root;
91};
92
93struct kernfs_elem_symlink {
94 struct kernfs_node *target_kn;
95};
96
97struct kernfs_elem_attr {
98 const struct kernfs_ops *ops;
99 struct kernfs_open_node *open;
100 loff_t size;
101 struct kernfs_node *notify_next;
102};
103
104
105union kernfs_node_id {
106 struct {
107
108
109
110
111
112
113 u32 ino;
114 u32 generation;
115 };
116 u64 id;
117};
118
119
120
121
122
123
124
125
126
127
128struct kernfs_node {
129 atomic_t count;
130 atomic_t active;
131#ifdef CONFIG_DEBUG_LOCK_ALLOC
132 struct lockdep_map dep_map;
133#endif
134
135
136
137
138
139
140 struct kernfs_node *parent;
141 const char *name;
142
143 struct rb_node rb;
144
145 const void *ns;
146 unsigned int hash;
147 union {
148 struct kernfs_elem_dir dir;
149 struct kernfs_elem_symlink symlink;
150 struct kernfs_elem_attr attr;
151 };
152
153 void *priv;
154
155 union kernfs_node_id id;
156 unsigned short flags;
157 umode_t mode;
158 struct kernfs_iattrs *iattr;
159};
160
161
162
163
164
165
166
167
168struct kernfs_syscall_ops {
169 int (*remount_fs)(struct kernfs_root *root, int *flags, char *data);
170 int (*show_options)(struct seq_file *sf, struct kernfs_root *root);
171
172 int (*mkdir)(struct kernfs_node *parent, const char *name,
173 umode_t mode);
174 int (*rmdir)(struct kernfs_node *kn);
175 int (*rename)(struct kernfs_node *kn, struct kernfs_node *new_parent,
176 const char *new_name);
177 int (*show_path)(struct seq_file *sf, struct kernfs_node *kn,
178 struct kernfs_root *root);
179};
180
181struct kernfs_root {
182
183 struct kernfs_node *kn;
184 unsigned int flags;
185
186
187 struct idr ino_idr;
188 u32 next_generation;
189 struct kernfs_syscall_ops *syscall_ops;
190
191
192 struct list_head supers;
193
194 wait_queue_head_t deactivate_waitq;
195};
196
197struct kernfs_open_file {
198
199 struct kernfs_node *kn;
200 struct file *file;
201 struct seq_file *seq_file;
202 void *priv;
203
204
205 struct mutex mutex;
206 struct mutex prealloc_mutex;
207 int event;
208 struct list_head list;
209 char *prealloc_buf;
210
211 size_t atomic_write_len;
212 bool mmapped:1;
213 bool released:1;
214 const struct vm_operations_struct *vm_ops;
215};
216
217struct kernfs_ops {
218
219
220
221
222 int (*open)(struct kernfs_open_file *of);
223 void (*release)(struct kernfs_open_file *of);
224
225
226
227
228
229
230
231
232
233
234
235
236 int (*seq_show)(struct seq_file *sf, void *v);
237
238 void *(*seq_start)(struct seq_file *sf, loff_t *ppos);
239 void *(*seq_next)(struct seq_file *sf, void *v, loff_t *ppos);
240 void (*seq_stop)(struct seq_file *sf, void *v);
241
242 ssize_t (*read)(struct kernfs_open_file *of, char *buf, size_t bytes,
243 loff_t off);
244
245
246
247
248
249
250
251
252 size_t atomic_write_len;
253
254
255
256
257
258
259 bool prealloc;
260 ssize_t (*write)(struct kernfs_open_file *of, char *buf, size_t bytes,
261 loff_t off);
262
263 int (*mmap)(struct kernfs_open_file *of, struct vm_area_struct *vma);
264
265#ifdef CONFIG_DEBUG_LOCK_ALLOC
266 struct lock_class_key lockdep_key;
267#endif
268};
269
270#ifdef CONFIG_KERNFS
271
272static inline enum kernfs_node_type kernfs_type(struct kernfs_node *kn)
273{
274 return kn->flags & KERNFS_TYPE_MASK;
275}
276
277
278
279
280
281
282
283
284
285static inline void kernfs_enable_ns(struct kernfs_node *kn)
286{
287 WARN_ON_ONCE(kernfs_type(kn) != KERNFS_DIR);
288 WARN_ON_ONCE(!RB_EMPTY_ROOT(&kn->dir.children));
289 kn->flags |= KERNFS_NS;
290}
291
292
293
294
295
296
297
298static inline bool kernfs_ns_enabled(struct kernfs_node *kn)
299{
300 return kn->flags & KERNFS_NS;
301}
302
303int kernfs_name(struct kernfs_node *kn, char *buf, size_t buflen);
304int kernfs_path_from_node(struct kernfs_node *root_kn, struct kernfs_node *kn,
305 char *buf, size_t buflen);
306void pr_cont_kernfs_name(struct kernfs_node *kn);
307void pr_cont_kernfs_path(struct kernfs_node *kn);
308struct kernfs_node *kernfs_get_parent(struct kernfs_node *kn);
309struct kernfs_node *kernfs_find_and_get_ns(struct kernfs_node *parent,
310 const char *name, const void *ns);
311struct kernfs_node *kernfs_walk_and_get_ns(struct kernfs_node *parent,
312 const char *path, const void *ns);
313void kernfs_get(struct kernfs_node *kn);
314void kernfs_put(struct kernfs_node *kn);
315
316struct kernfs_node *kernfs_node_from_dentry(struct dentry *dentry);
317struct kernfs_root *kernfs_root_from_sb(struct super_block *sb);
318struct inode *kernfs_get_inode(struct super_block *sb, struct kernfs_node *kn);
319
320struct dentry *kernfs_node_dentry(struct kernfs_node *kn,
321 struct super_block *sb);
322struct kernfs_root *kernfs_create_root(struct kernfs_syscall_ops *scops,
323 unsigned int flags, void *priv);
324void kernfs_destroy_root(struct kernfs_root *root);
325
326struct kernfs_node *kernfs_create_dir_ns(struct kernfs_node *parent,
327 const char *name, umode_t mode,
328 void *priv, const void *ns);
329struct kernfs_node *kernfs_create_empty_dir(struct kernfs_node *parent,
330 const char *name);
331struct kernfs_node *__kernfs_create_file(struct kernfs_node *parent,
332 const char *name,
333 umode_t mode, loff_t size,
334 const struct kernfs_ops *ops,
335 void *priv, const void *ns,
336 struct lock_class_key *key);
337struct kernfs_node *kernfs_create_link(struct kernfs_node *parent,
338 const char *name,
339 struct kernfs_node *target);
340void kernfs_activate(struct kernfs_node *kn);
341void kernfs_remove(struct kernfs_node *kn);
342void kernfs_break_active_protection(struct kernfs_node *kn);
343void kernfs_unbreak_active_protection(struct kernfs_node *kn);
344bool kernfs_remove_self(struct kernfs_node *kn);
345int kernfs_remove_by_name_ns(struct kernfs_node *parent, const char *name,
346 const void *ns);
347int kernfs_rename_ns(struct kernfs_node *kn, struct kernfs_node *new_parent,
348 const char *new_name, const void *new_ns);
349int kernfs_setattr(struct kernfs_node *kn, const struct iattr *iattr);
350void kernfs_notify(struct kernfs_node *kn);
351
352const void *kernfs_super_ns(struct super_block *sb);
353struct dentry *kernfs_mount_ns(struct file_system_type *fs_type, int flags,
354 struct kernfs_root *root, unsigned long magic,
355 bool *new_sb_created, const void *ns);
356void kernfs_kill_sb(struct super_block *sb);
357struct super_block *kernfs_pin_sb(struct kernfs_root *root, const void *ns);
358
359void kernfs_init(void);
360
361struct kernfs_node *kernfs_get_node_by_id(struct kernfs_root *root,
362 const union kernfs_node_id *id);
363#else
364
365static inline enum kernfs_node_type kernfs_type(struct kernfs_node *kn)
366{ return 0; }
367
368static inline void kernfs_enable_ns(struct kernfs_node *kn) { }
369
370static inline bool kernfs_ns_enabled(struct kernfs_node *kn)
371{ return false; }
372
373static inline int kernfs_name(struct kernfs_node *kn, char *buf, size_t buflen)
374{ return -ENOSYS; }
375
376static inline int kernfs_path_from_node(struct kernfs_node *root_kn,
377 struct kernfs_node *kn,
378 char *buf, size_t buflen)
379{ return -ENOSYS; }
380
381static inline void pr_cont_kernfs_name(struct kernfs_node *kn) { }
382static inline void pr_cont_kernfs_path(struct kernfs_node *kn) { }
383
384static inline struct kernfs_node *kernfs_get_parent(struct kernfs_node *kn)
385{ return NULL; }
386
387static inline struct kernfs_node *
388kernfs_find_and_get_ns(struct kernfs_node *parent, const char *name,
389 const void *ns)
390{ return NULL; }
391static inline struct kernfs_node *
392kernfs_walk_and_get_ns(struct kernfs_node *parent, const char *path,
393 const void *ns)
394{ return NULL; }
395
396static inline void kernfs_get(struct kernfs_node *kn) { }
397static inline void kernfs_put(struct kernfs_node *kn) { }
398
399static inline struct kernfs_node *kernfs_node_from_dentry(struct dentry *dentry)
400{ return NULL; }
401
402static inline struct kernfs_root *kernfs_root_from_sb(struct super_block *sb)
403{ return NULL; }
404
405static inline struct inode *
406kernfs_get_inode(struct super_block *sb, struct kernfs_node *kn)
407{ return NULL; }
408
409static inline struct kernfs_root *
410kernfs_create_root(struct kernfs_syscall_ops *scops, unsigned int flags,
411 void *priv)
412{ return ERR_PTR(-ENOSYS); }
413
414static inline void kernfs_destroy_root(struct kernfs_root *root) { }
415
416static inline struct kernfs_node *
417kernfs_create_dir_ns(struct kernfs_node *parent, const char *name,
418 umode_t mode, void *priv, const void *ns)
419{ return ERR_PTR(-ENOSYS); }
420
421static inline struct kernfs_node *
422__kernfs_create_file(struct kernfs_node *parent, const char *name,
423 umode_t mode, loff_t size, const struct kernfs_ops *ops,
424 void *priv, const void *ns, struct lock_class_key *key)
425{ return ERR_PTR(-ENOSYS); }
426
427static inline struct kernfs_node *
428kernfs_create_link(struct kernfs_node *parent, const char *name,
429 struct kernfs_node *target)
430{ return ERR_PTR(-ENOSYS); }
431
432static inline void kernfs_activate(struct kernfs_node *kn) { }
433
434static inline void kernfs_remove(struct kernfs_node *kn) { }
435
436static inline bool kernfs_remove_self(struct kernfs_node *kn)
437{ return false; }
438
439static inline int kernfs_remove_by_name_ns(struct kernfs_node *kn,
440 const char *name, const void *ns)
441{ return -ENOSYS; }
442
443static inline int kernfs_rename_ns(struct kernfs_node *kn,
444 struct kernfs_node *new_parent,
445 const char *new_name, const void *new_ns)
446{ return -ENOSYS; }
447
448static inline int kernfs_setattr(struct kernfs_node *kn,
449 const struct iattr *iattr)
450{ return -ENOSYS; }
451
452static inline void kernfs_notify(struct kernfs_node *kn) { }
453
454static inline const void *kernfs_super_ns(struct super_block *sb)
455{ return NULL; }
456
457static inline struct dentry *
458kernfs_mount_ns(struct file_system_type *fs_type, int flags,
459 struct kernfs_root *root, unsigned long magic,
460 bool *new_sb_created, const void *ns)
461{ return ERR_PTR(-ENOSYS); }
462
463static inline void kernfs_kill_sb(struct super_block *sb) { }
464
465static inline void kernfs_init(void) { }
466
467#endif
468
469
470
471
472
473
474
475
476
477
478
479
480static inline int kernfs_path(struct kernfs_node *kn, char *buf, size_t buflen)
481{
482 return kernfs_path_from_node(kn, NULL, buf, buflen);
483}
484
485static inline struct kernfs_node *
486kernfs_find_and_get(struct kernfs_node *kn, const char *name)
487{
488 return kernfs_find_and_get_ns(kn, name, NULL);
489}
490
491static inline struct kernfs_node *
492kernfs_walk_and_get(struct kernfs_node *kn, const char *path)
493{
494 return kernfs_walk_and_get_ns(kn, path, NULL);
495}
496
497static inline struct kernfs_node *
498kernfs_create_dir(struct kernfs_node *parent, const char *name, umode_t mode,
499 void *priv)
500{
501 return kernfs_create_dir_ns(parent, name, mode, priv, NULL);
502}
503
504static inline struct kernfs_node *
505kernfs_create_file_ns(struct kernfs_node *parent, const char *name,
506 umode_t mode, loff_t size, const struct kernfs_ops *ops,
507 void *priv, const void *ns)
508{
509 struct lock_class_key *key = NULL;
510
511#ifdef CONFIG_DEBUG_LOCK_ALLOC
512 key = (struct lock_class_key *)&ops->lockdep_key;
513#endif
514 return __kernfs_create_file(parent, name, mode, size, ops, priv, ns,
515 key);
516}
517
518static inline struct kernfs_node *
519kernfs_create_file(struct kernfs_node *parent, const char *name, umode_t mode,
520 loff_t size, const struct kernfs_ops *ops, void *priv)
521{
522 return kernfs_create_file_ns(parent, name, mode, size, ops, priv, NULL);
523}
524
525static inline int kernfs_remove_by_name(struct kernfs_node *parent,
526 const char *name)
527{
528 return kernfs_remove_by_name_ns(parent, name, NULL);
529}
530
531static inline int kernfs_rename(struct kernfs_node *kn,
532 struct kernfs_node *new_parent,
533 const char *new_name)
534{
535 return kernfs_rename_ns(kn, new_parent, new_name, NULL);
536}
537
538static inline struct dentry *
539kernfs_mount(struct file_system_type *fs_type, int flags,
540 struct kernfs_root *root, unsigned long magic,
541 bool *new_sb_created)
542{
543 return kernfs_mount_ns(fs_type, flags, root,
544 magic, new_sb_created, NULL);
545}
546
547#endif
548