1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * kernfs.h - pseudo filesystem decoupled from vfs locking
4*4882a593Smuzhiyun */
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun #ifndef __LINUX_KERNFS_H
7*4882a593Smuzhiyun #define __LINUX_KERNFS_H
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #include <linux/kernel.h>
10*4882a593Smuzhiyun #include <linux/err.h>
11*4882a593Smuzhiyun #include <linux/list.h>
12*4882a593Smuzhiyun #include <linux/mutex.h>
13*4882a593Smuzhiyun #include <linux/idr.h>
14*4882a593Smuzhiyun #include <linux/lockdep.h>
15*4882a593Smuzhiyun #include <linux/rbtree.h>
16*4882a593Smuzhiyun #include <linux/atomic.h>
17*4882a593Smuzhiyun #include <linux/uidgid.h>
18*4882a593Smuzhiyun #include <linux/wait.h>
19*4882a593Smuzhiyun #include <linux/android_kabi.h>
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun struct file;
22*4882a593Smuzhiyun struct dentry;
23*4882a593Smuzhiyun struct iattr;
24*4882a593Smuzhiyun struct seq_file;
25*4882a593Smuzhiyun struct vm_area_struct;
26*4882a593Smuzhiyun struct super_block;
27*4882a593Smuzhiyun struct file_system_type;
28*4882a593Smuzhiyun struct poll_table_struct;
29*4882a593Smuzhiyun struct fs_context;
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun struct kernfs_fs_context;
32*4882a593Smuzhiyun struct kernfs_open_node;
33*4882a593Smuzhiyun struct kernfs_iattrs;
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun enum kernfs_node_type {
36*4882a593Smuzhiyun KERNFS_DIR = 0x0001,
37*4882a593Smuzhiyun KERNFS_FILE = 0x0002,
38*4882a593Smuzhiyun KERNFS_LINK = 0x0004,
39*4882a593Smuzhiyun };
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun #define KERNFS_TYPE_MASK 0x000f
42*4882a593Smuzhiyun #define KERNFS_FLAG_MASK ~KERNFS_TYPE_MASK
43*4882a593Smuzhiyun #define KERNFS_MAX_USER_XATTRS 128
44*4882a593Smuzhiyun #define KERNFS_USER_XATTR_SIZE_LIMIT (128 << 10)
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun enum kernfs_node_flag {
47*4882a593Smuzhiyun KERNFS_ACTIVATED = 0x0010,
48*4882a593Smuzhiyun KERNFS_NS = 0x0020,
49*4882a593Smuzhiyun KERNFS_HAS_SEQ_SHOW = 0x0040,
50*4882a593Smuzhiyun KERNFS_HAS_MMAP = 0x0080,
51*4882a593Smuzhiyun KERNFS_LOCKDEP = 0x0100,
52*4882a593Smuzhiyun KERNFS_SUICIDAL = 0x0400,
53*4882a593Smuzhiyun KERNFS_SUICIDED = 0x0800,
54*4882a593Smuzhiyun KERNFS_EMPTY_DIR = 0x1000,
55*4882a593Smuzhiyun KERNFS_HAS_RELEASE = 0x2000,
56*4882a593Smuzhiyun };
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun /* @flags for kernfs_create_root() */
59*4882a593Smuzhiyun enum kernfs_root_flag {
60*4882a593Smuzhiyun /*
61*4882a593Smuzhiyun * kernfs_nodes are created in the deactivated state and invisible.
62*4882a593Smuzhiyun * They require explicit kernfs_activate() to become visible. This
63*4882a593Smuzhiyun * can be used to make related nodes become visible atomically
64*4882a593Smuzhiyun * after all nodes are created successfully.
65*4882a593Smuzhiyun */
66*4882a593Smuzhiyun KERNFS_ROOT_CREATE_DEACTIVATED = 0x0001,
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun /*
69*4882a593Smuzhiyun * For regular files, if the opener has CAP_DAC_OVERRIDE, open(2)
70*4882a593Smuzhiyun * succeeds regardless of the RW permissions. sysfs had an extra
71*4882a593Smuzhiyun * layer of enforcement where open(2) fails with -EACCES regardless
72*4882a593Smuzhiyun * of CAP_DAC_OVERRIDE if the permission doesn't have the
73*4882a593Smuzhiyun * respective read or write access at all (none of S_IRUGO or
74*4882a593Smuzhiyun * S_IWUGO) or the respective operation isn't implemented. The
75*4882a593Smuzhiyun * following flag enables that behavior.
76*4882a593Smuzhiyun */
77*4882a593Smuzhiyun KERNFS_ROOT_EXTRA_OPEN_PERM_CHECK = 0x0002,
78*4882a593Smuzhiyun
79*4882a593Smuzhiyun /*
80*4882a593Smuzhiyun * The filesystem supports exportfs operation, so userspace can use
81*4882a593Smuzhiyun * fhandle to access nodes of the fs.
82*4882a593Smuzhiyun */
83*4882a593Smuzhiyun KERNFS_ROOT_SUPPORT_EXPORTOP = 0x0004,
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun /*
86*4882a593Smuzhiyun * Support user xattrs to be written to nodes rooted at this root.
87*4882a593Smuzhiyun */
88*4882a593Smuzhiyun KERNFS_ROOT_SUPPORT_USER_XATTR = 0x0008,
89*4882a593Smuzhiyun };
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun /* type-specific structures for kernfs_node union members */
92*4882a593Smuzhiyun struct kernfs_elem_dir {
93*4882a593Smuzhiyun unsigned long subdirs;
94*4882a593Smuzhiyun /* children rbtree starts here and goes through kn->rb */
95*4882a593Smuzhiyun struct rb_root children;
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun /*
98*4882a593Smuzhiyun * The kernfs hierarchy this directory belongs to. This fits
99*4882a593Smuzhiyun * better directly in kernfs_node but is here to save space.
100*4882a593Smuzhiyun */
101*4882a593Smuzhiyun struct kernfs_root *root;
102*4882a593Smuzhiyun };
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun struct kernfs_elem_symlink {
105*4882a593Smuzhiyun struct kernfs_node *target_kn;
106*4882a593Smuzhiyun };
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun struct kernfs_elem_attr {
109*4882a593Smuzhiyun const struct kernfs_ops *ops;
110*4882a593Smuzhiyun struct kernfs_open_node *open;
111*4882a593Smuzhiyun loff_t size;
112*4882a593Smuzhiyun struct kernfs_node *notify_next; /* for kernfs_notify() */
113*4882a593Smuzhiyun };
114*4882a593Smuzhiyun
115*4882a593Smuzhiyun /*
116*4882a593Smuzhiyun * kernfs_node - the building block of kernfs hierarchy. Each and every
117*4882a593Smuzhiyun * kernfs node is represented by single kernfs_node. Most fields are
118*4882a593Smuzhiyun * private to kernfs and shouldn't be accessed directly by kernfs users.
119*4882a593Smuzhiyun *
120*4882a593Smuzhiyun * As long as s_count reference is held, the kernfs_node itself is
121*4882a593Smuzhiyun * accessible. Dereferencing elem or any other outer entity requires
122*4882a593Smuzhiyun * active reference.
123*4882a593Smuzhiyun */
124*4882a593Smuzhiyun struct kernfs_node {
125*4882a593Smuzhiyun atomic_t count;
126*4882a593Smuzhiyun atomic_t active;
127*4882a593Smuzhiyun #ifdef CONFIG_DEBUG_LOCK_ALLOC
128*4882a593Smuzhiyun struct lockdep_map dep_map;
129*4882a593Smuzhiyun #endif
130*4882a593Smuzhiyun /*
131*4882a593Smuzhiyun * Use kernfs_get_parent() and kernfs_name/path() instead of
132*4882a593Smuzhiyun * accessing the following two fields directly. If the node is
133*4882a593Smuzhiyun * never moved to a different parent, it is safe to access the
134*4882a593Smuzhiyun * parent directly.
135*4882a593Smuzhiyun */
136*4882a593Smuzhiyun struct kernfs_node *parent;
137*4882a593Smuzhiyun const char *name;
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun struct rb_node rb;
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun const void *ns; /* namespace tag */
142*4882a593Smuzhiyun unsigned int hash; /* ns + name hash */
143*4882a593Smuzhiyun union {
144*4882a593Smuzhiyun struct kernfs_elem_dir dir;
145*4882a593Smuzhiyun struct kernfs_elem_symlink symlink;
146*4882a593Smuzhiyun struct kernfs_elem_attr attr;
147*4882a593Smuzhiyun };
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun void *priv;
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun /*
152*4882a593Smuzhiyun * 64bit unique ID. On 64bit ino setups, id is the ino. On 32bit,
153*4882a593Smuzhiyun * the low 32bits are ino and upper generation.
154*4882a593Smuzhiyun */
155*4882a593Smuzhiyun u64 id;
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun unsigned short flags;
158*4882a593Smuzhiyun umode_t mode;
159*4882a593Smuzhiyun struct kernfs_iattrs *iattr;
160*4882a593Smuzhiyun
161*4882a593Smuzhiyun ANDROID_KABI_RESERVE(1);
162*4882a593Smuzhiyun };
163*4882a593Smuzhiyun
164*4882a593Smuzhiyun /*
165*4882a593Smuzhiyun * kernfs_syscall_ops may be specified on kernfs_create_root() to support
166*4882a593Smuzhiyun * syscalls. These optional callbacks are invoked on the matching syscalls
167*4882a593Smuzhiyun * and can perform any kernfs operations which don't necessarily have to be
168*4882a593Smuzhiyun * the exact operation requested. An active reference is held for each
169*4882a593Smuzhiyun * kernfs_node parameter.
170*4882a593Smuzhiyun */
171*4882a593Smuzhiyun struct kernfs_syscall_ops {
172*4882a593Smuzhiyun int (*show_options)(struct seq_file *sf, struct kernfs_root *root);
173*4882a593Smuzhiyun
174*4882a593Smuzhiyun int (*mkdir)(struct kernfs_node *parent, const char *name,
175*4882a593Smuzhiyun umode_t mode);
176*4882a593Smuzhiyun int (*rmdir)(struct kernfs_node *kn);
177*4882a593Smuzhiyun int (*rename)(struct kernfs_node *kn, struct kernfs_node *new_parent,
178*4882a593Smuzhiyun const char *new_name);
179*4882a593Smuzhiyun int (*show_path)(struct seq_file *sf, struct kernfs_node *kn,
180*4882a593Smuzhiyun struct kernfs_root *root);
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun ANDROID_KABI_RESERVE(1);
183*4882a593Smuzhiyun ANDROID_KABI_RESERVE(2);
184*4882a593Smuzhiyun ANDROID_KABI_RESERVE(3);
185*4882a593Smuzhiyun ANDROID_KABI_RESERVE(4);
186*4882a593Smuzhiyun };
187*4882a593Smuzhiyun
188*4882a593Smuzhiyun struct kernfs_root {
189*4882a593Smuzhiyun /* published fields */
190*4882a593Smuzhiyun struct kernfs_node *kn;
191*4882a593Smuzhiyun unsigned int flags; /* KERNFS_ROOT_* flags */
192*4882a593Smuzhiyun
193*4882a593Smuzhiyun /* private fields, do not use outside kernfs proper */
194*4882a593Smuzhiyun struct idr ino_idr;
195*4882a593Smuzhiyun u32 last_id_lowbits;
196*4882a593Smuzhiyun u32 id_highbits;
197*4882a593Smuzhiyun struct kernfs_syscall_ops *syscall_ops;
198*4882a593Smuzhiyun
199*4882a593Smuzhiyun /* list of kernfs_super_info of this root, protected by kernfs_mutex */
200*4882a593Smuzhiyun struct list_head supers;
201*4882a593Smuzhiyun
202*4882a593Smuzhiyun wait_queue_head_t deactivate_waitq;
203*4882a593Smuzhiyun
204*4882a593Smuzhiyun ANDROID_KABI_RESERVE(1);
205*4882a593Smuzhiyun };
206*4882a593Smuzhiyun
207*4882a593Smuzhiyun struct kernfs_open_file {
208*4882a593Smuzhiyun /* published fields */
209*4882a593Smuzhiyun struct kernfs_node *kn;
210*4882a593Smuzhiyun struct file *file;
211*4882a593Smuzhiyun struct seq_file *seq_file;
212*4882a593Smuzhiyun void *priv;
213*4882a593Smuzhiyun
214*4882a593Smuzhiyun /* private fields, do not use outside kernfs proper */
215*4882a593Smuzhiyun struct mutex mutex;
216*4882a593Smuzhiyun struct mutex prealloc_mutex;
217*4882a593Smuzhiyun int event;
218*4882a593Smuzhiyun struct list_head list;
219*4882a593Smuzhiyun char *prealloc_buf;
220*4882a593Smuzhiyun
221*4882a593Smuzhiyun size_t atomic_write_len;
222*4882a593Smuzhiyun bool mmapped:1;
223*4882a593Smuzhiyun bool released:1;
224*4882a593Smuzhiyun const struct vm_operations_struct *vm_ops;
225*4882a593Smuzhiyun
226*4882a593Smuzhiyun ANDROID_KABI_RESERVE(1);
227*4882a593Smuzhiyun };
228*4882a593Smuzhiyun
229*4882a593Smuzhiyun struct kernfs_ops {
230*4882a593Smuzhiyun /*
231*4882a593Smuzhiyun * Optional open/release methods. Both are called with
232*4882a593Smuzhiyun * @of->seq_file populated.
233*4882a593Smuzhiyun */
234*4882a593Smuzhiyun int (*open)(struct kernfs_open_file *of);
235*4882a593Smuzhiyun void (*release)(struct kernfs_open_file *of);
236*4882a593Smuzhiyun
237*4882a593Smuzhiyun /*
238*4882a593Smuzhiyun * Read is handled by either seq_file or raw_read().
239*4882a593Smuzhiyun *
240*4882a593Smuzhiyun * If seq_show() is present, seq_file path is active. Other seq
241*4882a593Smuzhiyun * operations are optional and if not implemented, the behavior is
242*4882a593Smuzhiyun * equivalent to single_open(). @sf->private points to the
243*4882a593Smuzhiyun * associated kernfs_open_file.
244*4882a593Smuzhiyun *
245*4882a593Smuzhiyun * read() is bounced through kernel buffer and a read larger than
246*4882a593Smuzhiyun * PAGE_SIZE results in partial operation of PAGE_SIZE.
247*4882a593Smuzhiyun */
248*4882a593Smuzhiyun int (*seq_show)(struct seq_file *sf, void *v);
249*4882a593Smuzhiyun
250*4882a593Smuzhiyun void *(*seq_start)(struct seq_file *sf, loff_t *ppos);
251*4882a593Smuzhiyun void *(*seq_next)(struct seq_file *sf, void *v, loff_t *ppos);
252*4882a593Smuzhiyun void (*seq_stop)(struct seq_file *sf, void *v);
253*4882a593Smuzhiyun
254*4882a593Smuzhiyun ssize_t (*read)(struct kernfs_open_file *of, char *buf, size_t bytes,
255*4882a593Smuzhiyun loff_t off);
256*4882a593Smuzhiyun
257*4882a593Smuzhiyun /*
258*4882a593Smuzhiyun * write() is bounced through kernel buffer. If atomic_write_len
259*4882a593Smuzhiyun * is not set, a write larger than PAGE_SIZE results in partial
260*4882a593Smuzhiyun * operations of PAGE_SIZE chunks. If atomic_write_len is set,
261*4882a593Smuzhiyun * writes upto the specified size are executed atomically but
262*4882a593Smuzhiyun * larger ones are rejected with -E2BIG.
263*4882a593Smuzhiyun */
264*4882a593Smuzhiyun size_t atomic_write_len;
265*4882a593Smuzhiyun /*
266*4882a593Smuzhiyun * "prealloc" causes a buffer to be allocated at open for
267*4882a593Smuzhiyun * all read/write requests. As ->seq_show uses seq_read()
268*4882a593Smuzhiyun * which does its own allocation, it is incompatible with
269*4882a593Smuzhiyun * ->prealloc. Provide ->read and ->write with ->prealloc.
270*4882a593Smuzhiyun */
271*4882a593Smuzhiyun bool prealloc;
272*4882a593Smuzhiyun ssize_t (*write)(struct kernfs_open_file *of, char *buf, size_t bytes,
273*4882a593Smuzhiyun loff_t off);
274*4882a593Smuzhiyun
275*4882a593Smuzhiyun __poll_t (*poll)(struct kernfs_open_file *of,
276*4882a593Smuzhiyun struct poll_table_struct *pt);
277*4882a593Smuzhiyun
278*4882a593Smuzhiyun int (*mmap)(struct kernfs_open_file *of, struct vm_area_struct *vma);
279*4882a593Smuzhiyun
280*4882a593Smuzhiyun #ifdef CONFIG_DEBUG_LOCK_ALLOC
281*4882a593Smuzhiyun struct lock_class_key lockdep_key;
282*4882a593Smuzhiyun #endif
283*4882a593Smuzhiyun
284*4882a593Smuzhiyun ANDROID_KABI_RESERVE(1);
285*4882a593Smuzhiyun ANDROID_KABI_RESERVE(2);
286*4882a593Smuzhiyun };
287*4882a593Smuzhiyun
288*4882a593Smuzhiyun /*
289*4882a593Smuzhiyun * The kernfs superblock creation/mount parameter context.
290*4882a593Smuzhiyun */
291*4882a593Smuzhiyun struct kernfs_fs_context {
292*4882a593Smuzhiyun struct kernfs_root *root; /* Root of the hierarchy being mounted */
293*4882a593Smuzhiyun void *ns_tag; /* Namespace tag of the mount (or NULL) */
294*4882a593Smuzhiyun unsigned long magic; /* File system specific magic number */
295*4882a593Smuzhiyun
296*4882a593Smuzhiyun /* The following are set/used by kernfs_mount() */
297*4882a593Smuzhiyun bool new_sb_created; /* Set to T if we allocated a new sb */
298*4882a593Smuzhiyun };
299*4882a593Smuzhiyun
300*4882a593Smuzhiyun #ifdef CONFIG_KERNFS
301*4882a593Smuzhiyun
kernfs_type(struct kernfs_node * kn)302*4882a593Smuzhiyun static inline enum kernfs_node_type kernfs_type(struct kernfs_node *kn)
303*4882a593Smuzhiyun {
304*4882a593Smuzhiyun return kn->flags & KERNFS_TYPE_MASK;
305*4882a593Smuzhiyun }
306*4882a593Smuzhiyun
kernfs_id_ino(u64 id)307*4882a593Smuzhiyun static inline ino_t kernfs_id_ino(u64 id)
308*4882a593Smuzhiyun {
309*4882a593Smuzhiyun /* id is ino if ino_t is 64bit; otherwise, low 32bits */
310*4882a593Smuzhiyun if (sizeof(ino_t) >= sizeof(u64))
311*4882a593Smuzhiyun return id;
312*4882a593Smuzhiyun else
313*4882a593Smuzhiyun return (u32)id;
314*4882a593Smuzhiyun }
315*4882a593Smuzhiyun
kernfs_id_gen(u64 id)316*4882a593Smuzhiyun static inline u32 kernfs_id_gen(u64 id)
317*4882a593Smuzhiyun {
318*4882a593Smuzhiyun /* gen is fixed at 1 if ino_t is 64bit; otherwise, high 32bits */
319*4882a593Smuzhiyun if (sizeof(ino_t) >= sizeof(u64))
320*4882a593Smuzhiyun return 1;
321*4882a593Smuzhiyun else
322*4882a593Smuzhiyun return id >> 32;
323*4882a593Smuzhiyun }
324*4882a593Smuzhiyun
kernfs_ino(struct kernfs_node * kn)325*4882a593Smuzhiyun static inline ino_t kernfs_ino(struct kernfs_node *kn)
326*4882a593Smuzhiyun {
327*4882a593Smuzhiyun return kernfs_id_ino(kn->id);
328*4882a593Smuzhiyun }
329*4882a593Smuzhiyun
kernfs_gen(struct kernfs_node * kn)330*4882a593Smuzhiyun static inline ino_t kernfs_gen(struct kernfs_node *kn)
331*4882a593Smuzhiyun {
332*4882a593Smuzhiyun return kernfs_id_gen(kn->id);
333*4882a593Smuzhiyun }
334*4882a593Smuzhiyun
335*4882a593Smuzhiyun /**
336*4882a593Smuzhiyun * kernfs_enable_ns - enable namespace under a directory
337*4882a593Smuzhiyun * @kn: directory of interest, should be empty
338*4882a593Smuzhiyun *
339*4882a593Smuzhiyun * This is to be called right after @kn is created to enable namespace
340*4882a593Smuzhiyun * under it. All children of @kn must have non-NULL namespace tags and
341*4882a593Smuzhiyun * only the ones which match the super_block's tag will be visible.
342*4882a593Smuzhiyun */
kernfs_enable_ns(struct kernfs_node * kn)343*4882a593Smuzhiyun static inline void kernfs_enable_ns(struct kernfs_node *kn)
344*4882a593Smuzhiyun {
345*4882a593Smuzhiyun WARN_ON_ONCE(kernfs_type(kn) != KERNFS_DIR);
346*4882a593Smuzhiyun WARN_ON_ONCE(!RB_EMPTY_ROOT(&kn->dir.children));
347*4882a593Smuzhiyun kn->flags |= KERNFS_NS;
348*4882a593Smuzhiyun }
349*4882a593Smuzhiyun
350*4882a593Smuzhiyun /**
351*4882a593Smuzhiyun * kernfs_ns_enabled - test whether namespace is enabled
352*4882a593Smuzhiyun * @kn: the node to test
353*4882a593Smuzhiyun *
354*4882a593Smuzhiyun * Test whether namespace filtering is enabled for the children of @ns.
355*4882a593Smuzhiyun */
kernfs_ns_enabled(struct kernfs_node * kn)356*4882a593Smuzhiyun static inline bool kernfs_ns_enabled(struct kernfs_node *kn)
357*4882a593Smuzhiyun {
358*4882a593Smuzhiyun return kn->flags & KERNFS_NS;
359*4882a593Smuzhiyun }
360*4882a593Smuzhiyun
361*4882a593Smuzhiyun int kernfs_name(struct kernfs_node *kn, char *buf, size_t buflen);
362*4882a593Smuzhiyun int kernfs_path_from_node(struct kernfs_node *root_kn, struct kernfs_node *kn,
363*4882a593Smuzhiyun char *buf, size_t buflen);
364*4882a593Smuzhiyun void pr_cont_kernfs_name(struct kernfs_node *kn);
365*4882a593Smuzhiyun void pr_cont_kernfs_path(struct kernfs_node *kn);
366*4882a593Smuzhiyun struct kernfs_node *kernfs_get_parent(struct kernfs_node *kn);
367*4882a593Smuzhiyun struct kernfs_node *kernfs_find_and_get_ns(struct kernfs_node *parent,
368*4882a593Smuzhiyun const char *name, const void *ns);
369*4882a593Smuzhiyun struct kernfs_node *kernfs_walk_and_get_ns(struct kernfs_node *parent,
370*4882a593Smuzhiyun const char *path, const void *ns);
371*4882a593Smuzhiyun void kernfs_get(struct kernfs_node *kn);
372*4882a593Smuzhiyun void kernfs_put(struct kernfs_node *kn);
373*4882a593Smuzhiyun
374*4882a593Smuzhiyun struct kernfs_node *kernfs_node_from_dentry(struct dentry *dentry);
375*4882a593Smuzhiyun struct kernfs_root *kernfs_root_from_sb(struct super_block *sb);
376*4882a593Smuzhiyun struct inode *kernfs_get_inode(struct super_block *sb, struct kernfs_node *kn);
377*4882a593Smuzhiyun
378*4882a593Smuzhiyun struct dentry *kernfs_node_dentry(struct kernfs_node *kn,
379*4882a593Smuzhiyun struct super_block *sb);
380*4882a593Smuzhiyun struct kernfs_root *kernfs_create_root(struct kernfs_syscall_ops *scops,
381*4882a593Smuzhiyun unsigned int flags, void *priv);
382*4882a593Smuzhiyun void kernfs_destroy_root(struct kernfs_root *root);
383*4882a593Smuzhiyun
384*4882a593Smuzhiyun struct kernfs_node *kernfs_create_dir_ns(struct kernfs_node *parent,
385*4882a593Smuzhiyun const char *name, umode_t mode,
386*4882a593Smuzhiyun kuid_t uid, kgid_t gid,
387*4882a593Smuzhiyun void *priv, const void *ns);
388*4882a593Smuzhiyun struct kernfs_node *kernfs_create_empty_dir(struct kernfs_node *parent,
389*4882a593Smuzhiyun const char *name);
390*4882a593Smuzhiyun struct kernfs_node *__kernfs_create_file(struct kernfs_node *parent,
391*4882a593Smuzhiyun const char *name, umode_t mode,
392*4882a593Smuzhiyun kuid_t uid, kgid_t gid,
393*4882a593Smuzhiyun loff_t size,
394*4882a593Smuzhiyun const struct kernfs_ops *ops,
395*4882a593Smuzhiyun void *priv, const void *ns,
396*4882a593Smuzhiyun struct lock_class_key *key);
397*4882a593Smuzhiyun struct kernfs_node *kernfs_create_link(struct kernfs_node *parent,
398*4882a593Smuzhiyun const char *name,
399*4882a593Smuzhiyun struct kernfs_node *target);
400*4882a593Smuzhiyun void kernfs_activate(struct kernfs_node *kn);
401*4882a593Smuzhiyun void kernfs_remove(struct kernfs_node *kn);
402*4882a593Smuzhiyun void kernfs_break_active_protection(struct kernfs_node *kn);
403*4882a593Smuzhiyun void kernfs_unbreak_active_protection(struct kernfs_node *kn);
404*4882a593Smuzhiyun bool kernfs_remove_self(struct kernfs_node *kn);
405*4882a593Smuzhiyun int kernfs_remove_by_name_ns(struct kernfs_node *parent, const char *name,
406*4882a593Smuzhiyun const void *ns);
407*4882a593Smuzhiyun int kernfs_rename_ns(struct kernfs_node *kn, struct kernfs_node *new_parent,
408*4882a593Smuzhiyun const char *new_name, const void *new_ns);
409*4882a593Smuzhiyun int kernfs_setattr(struct kernfs_node *kn, const struct iattr *iattr);
410*4882a593Smuzhiyun __poll_t kernfs_generic_poll(struct kernfs_open_file *of,
411*4882a593Smuzhiyun struct poll_table_struct *pt);
412*4882a593Smuzhiyun void kernfs_notify(struct kernfs_node *kn);
413*4882a593Smuzhiyun
414*4882a593Smuzhiyun int kernfs_xattr_get(struct kernfs_node *kn, const char *name,
415*4882a593Smuzhiyun void *value, size_t size);
416*4882a593Smuzhiyun int kernfs_xattr_set(struct kernfs_node *kn, const char *name,
417*4882a593Smuzhiyun const void *value, size_t size, int flags);
418*4882a593Smuzhiyun
419*4882a593Smuzhiyun const void *kernfs_super_ns(struct super_block *sb);
420*4882a593Smuzhiyun int kernfs_get_tree(struct fs_context *fc);
421*4882a593Smuzhiyun void kernfs_free_fs_context(struct fs_context *fc);
422*4882a593Smuzhiyun void kernfs_kill_sb(struct super_block *sb);
423*4882a593Smuzhiyun
424*4882a593Smuzhiyun void kernfs_init(void);
425*4882a593Smuzhiyun
426*4882a593Smuzhiyun struct kernfs_node *kernfs_find_and_get_node_by_id(struct kernfs_root *root,
427*4882a593Smuzhiyun u64 id);
428*4882a593Smuzhiyun #else /* CONFIG_KERNFS */
429*4882a593Smuzhiyun
kernfs_type(struct kernfs_node * kn)430*4882a593Smuzhiyun static inline enum kernfs_node_type kernfs_type(struct kernfs_node *kn)
431*4882a593Smuzhiyun { return 0; } /* whatever */
432*4882a593Smuzhiyun
kernfs_enable_ns(struct kernfs_node * kn)433*4882a593Smuzhiyun static inline void kernfs_enable_ns(struct kernfs_node *kn) { }
434*4882a593Smuzhiyun
kernfs_ns_enabled(struct kernfs_node * kn)435*4882a593Smuzhiyun static inline bool kernfs_ns_enabled(struct kernfs_node *kn)
436*4882a593Smuzhiyun { return false; }
437*4882a593Smuzhiyun
kernfs_name(struct kernfs_node * kn,char * buf,size_t buflen)438*4882a593Smuzhiyun static inline int kernfs_name(struct kernfs_node *kn, char *buf, size_t buflen)
439*4882a593Smuzhiyun { return -ENOSYS; }
440*4882a593Smuzhiyun
kernfs_path_from_node(struct kernfs_node * root_kn,struct kernfs_node * kn,char * buf,size_t buflen)441*4882a593Smuzhiyun static inline int kernfs_path_from_node(struct kernfs_node *root_kn,
442*4882a593Smuzhiyun struct kernfs_node *kn,
443*4882a593Smuzhiyun char *buf, size_t buflen)
444*4882a593Smuzhiyun { return -ENOSYS; }
445*4882a593Smuzhiyun
pr_cont_kernfs_name(struct kernfs_node * kn)446*4882a593Smuzhiyun static inline void pr_cont_kernfs_name(struct kernfs_node *kn) { }
pr_cont_kernfs_path(struct kernfs_node * kn)447*4882a593Smuzhiyun static inline void pr_cont_kernfs_path(struct kernfs_node *kn) { }
448*4882a593Smuzhiyun
kernfs_get_parent(struct kernfs_node * kn)449*4882a593Smuzhiyun static inline struct kernfs_node *kernfs_get_parent(struct kernfs_node *kn)
450*4882a593Smuzhiyun { return NULL; }
451*4882a593Smuzhiyun
452*4882a593Smuzhiyun static inline struct kernfs_node *
kernfs_find_and_get_ns(struct kernfs_node * parent,const char * name,const void * ns)453*4882a593Smuzhiyun kernfs_find_and_get_ns(struct kernfs_node *parent, const char *name,
454*4882a593Smuzhiyun const void *ns)
455*4882a593Smuzhiyun { return NULL; }
456*4882a593Smuzhiyun static inline struct kernfs_node *
kernfs_walk_and_get_ns(struct kernfs_node * parent,const char * path,const void * ns)457*4882a593Smuzhiyun kernfs_walk_and_get_ns(struct kernfs_node *parent, const char *path,
458*4882a593Smuzhiyun const void *ns)
459*4882a593Smuzhiyun { return NULL; }
460*4882a593Smuzhiyun
kernfs_get(struct kernfs_node * kn)461*4882a593Smuzhiyun static inline void kernfs_get(struct kernfs_node *kn) { }
kernfs_put(struct kernfs_node * kn)462*4882a593Smuzhiyun static inline void kernfs_put(struct kernfs_node *kn) { }
463*4882a593Smuzhiyun
kernfs_node_from_dentry(struct dentry * dentry)464*4882a593Smuzhiyun static inline struct kernfs_node *kernfs_node_from_dentry(struct dentry *dentry)
465*4882a593Smuzhiyun { return NULL; }
466*4882a593Smuzhiyun
kernfs_root_from_sb(struct super_block * sb)467*4882a593Smuzhiyun static inline struct kernfs_root *kernfs_root_from_sb(struct super_block *sb)
468*4882a593Smuzhiyun { return NULL; }
469*4882a593Smuzhiyun
470*4882a593Smuzhiyun static inline struct inode *
kernfs_get_inode(struct super_block * sb,struct kernfs_node * kn)471*4882a593Smuzhiyun kernfs_get_inode(struct super_block *sb, struct kernfs_node *kn)
472*4882a593Smuzhiyun { return NULL; }
473*4882a593Smuzhiyun
474*4882a593Smuzhiyun static inline struct kernfs_root *
kernfs_create_root(struct kernfs_syscall_ops * scops,unsigned int flags,void * priv)475*4882a593Smuzhiyun kernfs_create_root(struct kernfs_syscall_ops *scops, unsigned int flags,
476*4882a593Smuzhiyun void *priv)
477*4882a593Smuzhiyun { return ERR_PTR(-ENOSYS); }
478*4882a593Smuzhiyun
kernfs_destroy_root(struct kernfs_root * root)479*4882a593Smuzhiyun static inline void kernfs_destroy_root(struct kernfs_root *root) { }
480*4882a593Smuzhiyun
481*4882a593Smuzhiyun static inline struct kernfs_node *
kernfs_create_dir_ns(struct kernfs_node * parent,const char * name,umode_t mode,kuid_t uid,kgid_t gid,void * priv,const void * ns)482*4882a593Smuzhiyun kernfs_create_dir_ns(struct kernfs_node *parent, const char *name,
483*4882a593Smuzhiyun umode_t mode, kuid_t uid, kgid_t gid,
484*4882a593Smuzhiyun void *priv, const void *ns)
485*4882a593Smuzhiyun { return ERR_PTR(-ENOSYS); }
486*4882a593Smuzhiyun
487*4882a593Smuzhiyun static inline struct kernfs_node *
__kernfs_create_file(struct kernfs_node * parent,const char * name,umode_t mode,kuid_t uid,kgid_t gid,loff_t size,const struct kernfs_ops * ops,void * priv,const void * ns,struct lock_class_key * key)488*4882a593Smuzhiyun __kernfs_create_file(struct kernfs_node *parent, const char *name,
489*4882a593Smuzhiyun umode_t mode, kuid_t uid, kgid_t gid,
490*4882a593Smuzhiyun loff_t size, const struct kernfs_ops *ops,
491*4882a593Smuzhiyun void *priv, const void *ns, struct lock_class_key *key)
492*4882a593Smuzhiyun { return ERR_PTR(-ENOSYS); }
493*4882a593Smuzhiyun
494*4882a593Smuzhiyun static inline struct kernfs_node *
kernfs_create_link(struct kernfs_node * parent,const char * name,struct kernfs_node * target)495*4882a593Smuzhiyun kernfs_create_link(struct kernfs_node *parent, const char *name,
496*4882a593Smuzhiyun struct kernfs_node *target)
497*4882a593Smuzhiyun { return ERR_PTR(-ENOSYS); }
498*4882a593Smuzhiyun
kernfs_activate(struct kernfs_node * kn)499*4882a593Smuzhiyun static inline void kernfs_activate(struct kernfs_node *kn) { }
500*4882a593Smuzhiyun
kernfs_remove(struct kernfs_node * kn)501*4882a593Smuzhiyun static inline void kernfs_remove(struct kernfs_node *kn) { }
502*4882a593Smuzhiyun
kernfs_remove_self(struct kernfs_node * kn)503*4882a593Smuzhiyun static inline bool kernfs_remove_self(struct kernfs_node *kn)
504*4882a593Smuzhiyun { return false; }
505*4882a593Smuzhiyun
kernfs_remove_by_name_ns(struct kernfs_node * kn,const char * name,const void * ns)506*4882a593Smuzhiyun static inline int kernfs_remove_by_name_ns(struct kernfs_node *kn,
507*4882a593Smuzhiyun const char *name, const void *ns)
508*4882a593Smuzhiyun { return -ENOSYS; }
509*4882a593Smuzhiyun
kernfs_rename_ns(struct kernfs_node * kn,struct kernfs_node * new_parent,const char * new_name,const void * new_ns)510*4882a593Smuzhiyun static inline int kernfs_rename_ns(struct kernfs_node *kn,
511*4882a593Smuzhiyun struct kernfs_node *new_parent,
512*4882a593Smuzhiyun const char *new_name, const void *new_ns)
513*4882a593Smuzhiyun { return -ENOSYS; }
514*4882a593Smuzhiyun
kernfs_setattr(struct kernfs_node * kn,const struct iattr * iattr)515*4882a593Smuzhiyun static inline int kernfs_setattr(struct kernfs_node *kn,
516*4882a593Smuzhiyun const struct iattr *iattr)
517*4882a593Smuzhiyun { return -ENOSYS; }
518*4882a593Smuzhiyun
kernfs_notify(struct kernfs_node * kn)519*4882a593Smuzhiyun static inline void kernfs_notify(struct kernfs_node *kn) { }
520*4882a593Smuzhiyun
kernfs_xattr_get(struct kernfs_node * kn,const char * name,void * value,size_t size)521*4882a593Smuzhiyun static inline int kernfs_xattr_get(struct kernfs_node *kn, const char *name,
522*4882a593Smuzhiyun void *value, size_t size)
523*4882a593Smuzhiyun { return -ENOSYS; }
524*4882a593Smuzhiyun
kernfs_xattr_set(struct kernfs_node * kn,const char * name,const void * value,size_t size,int flags)525*4882a593Smuzhiyun static inline int kernfs_xattr_set(struct kernfs_node *kn, const char *name,
526*4882a593Smuzhiyun const void *value, size_t size, int flags)
527*4882a593Smuzhiyun { return -ENOSYS; }
528*4882a593Smuzhiyun
kernfs_super_ns(struct super_block * sb)529*4882a593Smuzhiyun static inline const void *kernfs_super_ns(struct super_block *sb)
530*4882a593Smuzhiyun { return NULL; }
531*4882a593Smuzhiyun
kernfs_get_tree(struct fs_context * fc)532*4882a593Smuzhiyun static inline int kernfs_get_tree(struct fs_context *fc)
533*4882a593Smuzhiyun { return -ENOSYS; }
534*4882a593Smuzhiyun
kernfs_free_fs_context(struct fs_context * fc)535*4882a593Smuzhiyun static inline void kernfs_free_fs_context(struct fs_context *fc) { }
536*4882a593Smuzhiyun
kernfs_kill_sb(struct super_block * sb)537*4882a593Smuzhiyun static inline void kernfs_kill_sb(struct super_block *sb) { }
538*4882a593Smuzhiyun
kernfs_init(void)539*4882a593Smuzhiyun static inline void kernfs_init(void) { }
540*4882a593Smuzhiyun
541*4882a593Smuzhiyun #endif /* CONFIG_KERNFS */
542*4882a593Smuzhiyun
543*4882a593Smuzhiyun /**
544*4882a593Smuzhiyun * kernfs_path - build full path of a given node
545*4882a593Smuzhiyun * @kn: kernfs_node of interest
546*4882a593Smuzhiyun * @buf: buffer to copy @kn's name into
547*4882a593Smuzhiyun * @buflen: size of @buf
548*4882a593Smuzhiyun *
549*4882a593Smuzhiyun * If @kn is NULL result will be "(null)".
550*4882a593Smuzhiyun *
551*4882a593Smuzhiyun * Returns the length of the full path. If the full length is equal to or
552*4882a593Smuzhiyun * greater than @buflen, @buf contains the truncated path with the trailing
553*4882a593Smuzhiyun * '\0'. On error, -errno is returned.
554*4882a593Smuzhiyun */
kernfs_path(struct kernfs_node * kn,char * buf,size_t buflen)555*4882a593Smuzhiyun static inline int kernfs_path(struct kernfs_node *kn, char *buf, size_t buflen)
556*4882a593Smuzhiyun {
557*4882a593Smuzhiyun return kernfs_path_from_node(kn, NULL, buf, buflen);
558*4882a593Smuzhiyun }
559*4882a593Smuzhiyun
560*4882a593Smuzhiyun static inline struct kernfs_node *
kernfs_find_and_get(struct kernfs_node * kn,const char * name)561*4882a593Smuzhiyun kernfs_find_and_get(struct kernfs_node *kn, const char *name)
562*4882a593Smuzhiyun {
563*4882a593Smuzhiyun return kernfs_find_and_get_ns(kn, name, NULL);
564*4882a593Smuzhiyun }
565*4882a593Smuzhiyun
566*4882a593Smuzhiyun static inline struct kernfs_node *
kernfs_walk_and_get(struct kernfs_node * kn,const char * path)567*4882a593Smuzhiyun kernfs_walk_and_get(struct kernfs_node *kn, const char *path)
568*4882a593Smuzhiyun {
569*4882a593Smuzhiyun return kernfs_walk_and_get_ns(kn, path, NULL);
570*4882a593Smuzhiyun }
571*4882a593Smuzhiyun
572*4882a593Smuzhiyun static inline struct kernfs_node *
kernfs_create_dir(struct kernfs_node * parent,const char * name,umode_t mode,void * priv)573*4882a593Smuzhiyun kernfs_create_dir(struct kernfs_node *parent, const char *name, umode_t mode,
574*4882a593Smuzhiyun void *priv)
575*4882a593Smuzhiyun {
576*4882a593Smuzhiyun return kernfs_create_dir_ns(parent, name, mode,
577*4882a593Smuzhiyun GLOBAL_ROOT_UID, GLOBAL_ROOT_GID,
578*4882a593Smuzhiyun priv, NULL);
579*4882a593Smuzhiyun }
580*4882a593Smuzhiyun
581*4882a593Smuzhiyun static inline struct kernfs_node *
kernfs_create_file_ns(struct kernfs_node * parent,const char * name,umode_t mode,kuid_t uid,kgid_t gid,loff_t size,const struct kernfs_ops * ops,void * priv,const void * ns)582*4882a593Smuzhiyun kernfs_create_file_ns(struct kernfs_node *parent, const char *name,
583*4882a593Smuzhiyun umode_t mode, kuid_t uid, kgid_t gid,
584*4882a593Smuzhiyun loff_t size, const struct kernfs_ops *ops,
585*4882a593Smuzhiyun void *priv, const void *ns)
586*4882a593Smuzhiyun {
587*4882a593Smuzhiyun struct lock_class_key *key = NULL;
588*4882a593Smuzhiyun
589*4882a593Smuzhiyun #ifdef CONFIG_DEBUG_LOCK_ALLOC
590*4882a593Smuzhiyun key = (struct lock_class_key *)&ops->lockdep_key;
591*4882a593Smuzhiyun #endif
592*4882a593Smuzhiyun return __kernfs_create_file(parent, name, mode, uid, gid,
593*4882a593Smuzhiyun size, ops, priv, ns, key);
594*4882a593Smuzhiyun }
595*4882a593Smuzhiyun
596*4882a593Smuzhiyun static inline struct kernfs_node *
kernfs_create_file(struct kernfs_node * parent,const char * name,umode_t mode,loff_t size,const struct kernfs_ops * ops,void * priv)597*4882a593Smuzhiyun kernfs_create_file(struct kernfs_node *parent, const char *name, umode_t mode,
598*4882a593Smuzhiyun loff_t size, const struct kernfs_ops *ops, void *priv)
599*4882a593Smuzhiyun {
600*4882a593Smuzhiyun return kernfs_create_file_ns(parent, name, mode,
601*4882a593Smuzhiyun GLOBAL_ROOT_UID, GLOBAL_ROOT_GID,
602*4882a593Smuzhiyun size, ops, priv, NULL);
603*4882a593Smuzhiyun }
604*4882a593Smuzhiyun
kernfs_remove_by_name(struct kernfs_node * parent,const char * name)605*4882a593Smuzhiyun static inline int kernfs_remove_by_name(struct kernfs_node *parent,
606*4882a593Smuzhiyun const char *name)
607*4882a593Smuzhiyun {
608*4882a593Smuzhiyun return kernfs_remove_by_name_ns(parent, name, NULL);
609*4882a593Smuzhiyun }
610*4882a593Smuzhiyun
kernfs_rename(struct kernfs_node * kn,struct kernfs_node * new_parent,const char * new_name)611*4882a593Smuzhiyun static inline int kernfs_rename(struct kernfs_node *kn,
612*4882a593Smuzhiyun struct kernfs_node *new_parent,
613*4882a593Smuzhiyun const char *new_name)
614*4882a593Smuzhiyun {
615*4882a593Smuzhiyun return kernfs_rename_ns(kn, new_parent, new_name, NULL);
616*4882a593Smuzhiyun }
617*4882a593Smuzhiyun
618*4882a593Smuzhiyun #endif /* __LINUX_KERNFS_H */
619