2 * kernfs.h - pseudo filesystem decoupled from vfs locking
4 * This file is released under the GPLv2.
7 #ifndef __LINUX_KERNFS_H
8 #define __LINUX_KERNFS_H
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>
24 struct vm_area_struct
;
26 struct file_system_type
;
28 struct kernfs_open_node
;
31 enum kernfs_node_type
{
37 #define KERNFS_TYPE_MASK 0x000f
38 #define KERNFS_FLAG_MASK ~KERNFS_TYPE_MASK
40 enum kernfs_node_flag
{
42 KERNFS_HAS_SEQ_SHOW
= 0x0040,
43 KERNFS_HAS_MMAP
= 0x0080,
44 KERNFS_LOCKDEP
= 0x0100,
45 KERNFS_STATIC_NAME
= 0x0200,
46 KERNFS_SUICIDAL
= 0x0400,
47 KERNFS_SUICIDED
= 0x0800,
50 /* type-specific structures for kernfs_node union members */
51 struct kernfs_elem_dir
{
52 unsigned long subdirs
;
53 /* children rbtree starts here and goes through kn->rb */
54 struct rb_root children
;
57 * The kernfs hierarchy this directory belongs to. This fits
58 * better directly in kernfs_node but is here to save space.
60 struct kernfs_root
*root
;
63 struct kernfs_elem_symlink
{
64 struct kernfs_node
*target_kn
;
67 struct kernfs_elem_attr
{
68 const struct kernfs_ops
*ops
;
69 struct kernfs_open_node
*open
;
74 * kernfs_node - the building block of kernfs hierarchy. Each and every
75 * kernfs node is represented by single kernfs_node. Most fields are
76 * private to kernfs and shouldn't be accessed directly by kernfs users.
78 * As long as s_count reference is held, the kernfs_node itself is
79 * accessible. Dereferencing elem or any other outer entity requires
85 #ifdef CONFIG_DEBUG_LOCK_ALLOC
86 struct lockdep_map dep_map
;
88 /* the following two fields are published */
89 struct kernfs_node
*parent
;
94 const void *ns
; /* namespace tag */
95 unsigned int hash
; /* ns + name hash */
97 struct kernfs_elem_dir dir
;
98 struct kernfs_elem_symlink symlink
;
99 struct kernfs_elem_attr attr
;
104 unsigned short flags
;
107 struct kernfs_iattrs
*iattr
;
111 * kernfs_dir_ops may be specified on kernfs_create_root() to support
112 * directory manipulation syscalls. These optional callbacks are invoked
113 * on the matching syscalls and can perform any kernfs operations which
114 * don't necessarily have to be the exact operation requested. An active
115 * reference is held for each kernfs_node parameter.
117 struct kernfs_dir_ops
{
118 int (*mkdir
)(struct kernfs_node
*parent
, const char *name
,
120 int (*rmdir
)(struct kernfs_node
*kn
);
121 int (*rename
)(struct kernfs_node
*kn
, struct kernfs_node
*new_parent
,
122 const char *new_name
);
126 /* published fields */
127 struct kernfs_node
*kn
;
129 /* private fields, do not use outside kernfs proper */
131 struct kernfs_dir_ops
*dir_ops
;
132 wait_queue_head_t deactivate_waitq
;
135 struct kernfs_open_file
{
136 /* published fields */
137 struct kernfs_node
*kn
;
140 /* private fields, do not use outside kernfs proper */
143 struct list_head list
;
146 const struct vm_operations_struct
*vm_ops
;
151 * Read is handled by either seq_file or raw_read().
153 * If seq_show() is present, seq_file path is active. Other seq
154 * operations are optional and if not implemented, the behavior is
155 * equivalent to single_open(). @sf->private points to the
156 * associated kernfs_open_file.
158 * read() is bounced through kernel buffer and a read larger than
159 * PAGE_SIZE results in partial operation of PAGE_SIZE.
161 int (*seq_show
)(struct seq_file
*sf
, void *v
);
163 void *(*seq_start
)(struct seq_file
*sf
, loff_t
*ppos
);
164 void *(*seq_next
)(struct seq_file
*sf
, void *v
, loff_t
*ppos
);
165 void (*seq_stop
)(struct seq_file
*sf
, void *v
);
167 ssize_t (*read
)(struct kernfs_open_file
*of
, char *buf
, size_t bytes
,
171 * write() is bounced through kernel buffer and a write larger than
172 * PAGE_SIZE results in partial operation of PAGE_SIZE.
174 ssize_t (*write
)(struct kernfs_open_file
*of
, char *buf
, size_t bytes
,
177 int (*mmap
)(struct kernfs_open_file
*of
, struct vm_area_struct
*vma
);
179 #ifdef CONFIG_DEBUG_LOCK_ALLOC
180 struct lock_class_key lockdep_key
;
186 static inline enum kernfs_node_type
kernfs_type(struct kernfs_node
*kn
)
188 return kn
->flags
& KERNFS_TYPE_MASK
;
192 * kernfs_enable_ns - enable namespace under a directory
193 * @kn: directory of interest, should be empty
195 * This is to be called right after @kn is created to enable namespace
196 * under it. All children of @kn must have non-NULL namespace tags and
197 * only the ones which match the super_block's tag will be visible.
199 static inline void kernfs_enable_ns(struct kernfs_node
*kn
)
201 WARN_ON_ONCE(kernfs_type(kn
) != KERNFS_DIR
);
202 WARN_ON_ONCE(!RB_EMPTY_ROOT(&kn
->dir
.children
));
203 kn
->flags
|= KERNFS_NS
;
207 * kernfs_ns_enabled - test whether namespace is enabled
208 * @kn: the node to test
210 * Test whether namespace filtering is enabled for the children of @ns.
212 static inline bool kernfs_ns_enabled(struct kernfs_node
*kn
)
214 return kn
->flags
& KERNFS_NS
;
217 struct kernfs_node
*kernfs_find_and_get_ns(struct kernfs_node
*parent
,
218 const char *name
, const void *ns
);
219 void kernfs_get(struct kernfs_node
*kn
);
220 void kernfs_put(struct kernfs_node
*kn
);
222 struct kernfs_root
*kernfs_create_root(struct kernfs_dir_ops
*kdops
,
224 void kernfs_destroy_root(struct kernfs_root
*root
);
226 struct kernfs_node
*kernfs_create_dir_ns(struct kernfs_node
*parent
,
227 const char *name
, umode_t mode
,
228 void *priv
, const void *ns
);
229 struct kernfs_node
*__kernfs_create_file(struct kernfs_node
*parent
,
231 umode_t mode
, loff_t size
,
232 const struct kernfs_ops
*ops
,
233 void *priv
, const void *ns
,
235 struct lock_class_key
*key
);
236 struct kernfs_node
*kernfs_create_link(struct kernfs_node
*parent
,
238 struct kernfs_node
*target
);
239 void kernfs_remove(struct kernfs_node
*kn
);
240 void kernfs_break_active_protection(struct kernfs_node
*kn
);
241 void kernfs_unbreak_active_protection(struct kernfs_node
*kn
);
242 bool kernfs_remove_self(struct kernfs_node
*kn
);
243 int kernfs_remove_by_name_ns(struct kernfs_node
*parent
, const char *name
,
245 int kernfs_rename_ns(struct kernfs_node
*kn
, struct kernfs_node
*new_parent
,
246 const char *new_name
, const void *new_ns
);
247 int kernfs_setattr(struct kernfs_node
*kn
, const struct iattr
*iattr
);
248 void kernfs_notify(struct kernfs_node
*kn
);
250 const void *kernfs_super_ns(struct super_block
*sb
);
251 struct dentry
*kernfs_mount_ns(struct file_system_type
*fs_type
, int flags
,
252 struct kernfs_root
*root
, const void *ns
);
253 void kernfs_kill_sb(struct super_block
*sb
);
255 void kernfs_init(void);
257 #else /* CONFIG_SYSFS */
259 static inline enum kernfs_node_type
kernfs_type(struct kernfs_node
*kn
)
260 { return 0; } /* whatever */
262 static inline void kernfs_enable_ns(struct kernfs_node
*kn
) { }
264 static inline bool kernfs_ns_enabled(struct kernfs_node
*kn
)
267 static inline struct kernfs_node
*
268 kernfs_find_and_get_ns(struct kernfs_node
*parent
, const char *name
,
272 static inline void kernfs_get(struct kernfs_node
*kn
) { }
273 static inline void kernfs_put(struct kernfs_node
*kn
) { }
275 static inline struct kernfs_root
*
276 kernfs_create_root(struct kernfs_dir_ops
*kdops
, void *priv
)
277 { return ERR_PTR(-ENOSYS
); }
279 static inline void kernfs_destroy_root(struct kernfs_root
*root
) { }
281 static inline struct kernfs_node
*
282 kernfs_create_dir_ns(struct kernfs_node
*parent
, const char *name
,
283 umode_t mode
, void *priv
, const void *ns
)
284 { return ERR_PTR(-ENOSYS
); }
286 static inline struct kernfs_node
*
287 __kernfs_create_file(struct kernfs_node
*parent
, const char *name
,
288 umode_t mode
, loff_t size
, const struct kernfs_ops
*ops
,
289 void *priv
, const void *ns
, bool name_is_static
,
290 struct lock_class_key
*key
)
291 { return ERR_PTR(-ENOSYS
); }
293 static inline struct kernfs_node
*
294 kernfs_create_link(struct kernfs_node
*parent
, const char *name
,
295 struct kernfs_node
*target
)
296 { return ERR_PTR(-ENOSYS
); }
298 static inline void kernfs_remove(struct kernfs_node
*kn
) { }
300 static inline bool kernfs_remove_self(struct kernfs_node
*kn
)
303 static inline int kernfs_remove_by_name_ns(struct kernfs_node
*kn
,
304 const char *name
, const void *ns
)
307 static inline int kernfs_rename_ns(struct kernfs_node
*kn
,
308 struct kernfs_node
*new_parent
,
309 const char *new_name
, const void *new_ns
)
312 static inline int kernfs_setattr(struct kernfs_node
*kn
,
313 const struct iattr
*iattr
)
316 static inline void kernfs_notify(struct kernfs_node
*kn
) { }
318 static inline const void *kernfs_super_ns(struct super_block
*sb
)
321 static inline struct dentry
*
322 kernfs_mount_ns(struct file_system_type
*fs_type
, int flags
,
323 struct kernfs_root
*root
, const void *ns
)
324 { return ERR_PTR(-ENOSYS
); }
326 static inline void kernfs_kill_sb(struct super_block
*sb
) { }
328 static inline void kernfs_init(void) { }
330 #endif /* CONFIG_SYSFS */
332 static inline struct kernfs_node
*
333 kernfs_find_and_get(struct kernfs_node
*kn
, const char *name
)
335 return kernfs_find_and_get_ns(kn
, name
, NULL
);
338 static inline struct kernfs_node
*
339 kernfs_create_dir(struct kernfs_node
*parent
, const char *name
, umode_t mode
,
342 return kernfs_create_dir_ns(parent
, name
, mode
, priv
, NULL
);
345 static inline struct kernfs_node
*
346 kernfs_create_file_ns(struct kernfs_node
*parent
, const char *name
,
347 umode_t mode
, loff_t size
, const struct kernfs_ops
*ops
,
348 void *priv
, const void *ns
)
350 struct lock_class_key
*key
= NULL
;
352 #ifdef CONFIG_DEBUG_LOCK_ALLOC
353 key
= (struct lock_class_key
*)&ops
->lockdep_key
;
355 return __kernfs_create_file(parent
, name
, mode
, size
, ops
, priv
, ns
,
359 static inline struct kernfs_node
*
360 kernfs_create_file(struct kernfs_node
*parent
, const char *name
, umode_t mode
,
361 loff_t size
, const struct kernfs_ops
*ops
, void *priv
)
363 return kernfs_create_file_ns(parent
, name
, mode
, size
, ops
, priv
, NULL
);
366 static inline int kernfs_remove_by_name(struct kernfs_node
*parent
,
369 return kernfs_remove_by_name_ns(parent
, name
, NULL
);
372 static inline struct dentry
*
373 kernfs_mount(struct file_system_type
*fs_type
, int flags
,
374 struct kernfs_root
*root
)
376 return kernfs_mount_ns(fs_type
, flags
, root
, NULL
);
379 #endif /* __LINUX_KERNFS_H */