xref: /OK3568_Linux_fs/kernel/include/linux/kernfs.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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