xref: /netbsd/sys/miscfs/kernfs/kernfs.h (revision 3c14d572)
1*3c14d572Sjdolecek /*	$NetBSD: kernfs.h,v 1.44 2020/04/07 08:14:42 jdolecek Exp $	*/
2cf92afd6Scgd 
3fa8ba8a3Scgd /*
4cde1d475Smycroft  * Copyright (c) 1992, 1993
5cde1d475Smycroft  *	The Regents of the University of California.  All rights reserved.
6fa8ba8a3Scgd  *
787693669Scgd  * This code is derived from software donated to Berkeley by
8fa8ba8a3Scgd  * Jan-Simon Pendry.
9fa8ba8a3Scgd  *
10320661fcScgd  * Redistribution and use in source and binary forms, with or without
11320661fcScgd  * modification, are permitted provided that the following conditions
12320661fcScgd  * are met:
13320661fcScgd  * 1. Redistributions of source code must retain the above copyright
14320661fcScgd  *    notice, this list of conditions and the following disclaimer.
15320661fcScgd  * 2. Redistributions in binary form must reproduce the above copyright
16320661fcScgd  *    notice, this list of conditions and the following disclaimer in the
17320661fcScgd  *    documentation and/or other materials provided with the distribution.
18aad01611Sagc  * 3. Neither the name of the University nor the names of its contributors
19320661fcScgd  *    may be used to endorse or promote products derived from this software
20320661fcScgd  *    without specific prior written permission.
21fa8ba8a3Scgd  *
22320661fcScgd  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23320661fcScgd  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24320661fcScgd  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25320661fcScgd  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26320661fcScgd  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27320661fcScgd  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28320661fcScgd  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29320661fcScgd  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30320661fcScgd  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31320661fcScgd  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32320661fcScgd  * SUCH DAMAGE.
33fa8ba8a3Scgd  *
34e5bc90f4Sfvdl  *	@(#)kernfs.h	8.6 (Berkeley) 3/29/95
35fa8ba8a3Scgd  */
36fa8ba8a3Scgd 
37cde1d475Smycroft #define	_PATH_KERNFS	"/kern"		/* Default mountpoint */
38cde1d475Smycroft 
396efcd1b6Sbriggs #ifdef _KERNEL
408ca90bd4Sitojun #include <sys/queue.h>
4110c7b7cbSapb #include <sys/tree.h>
428189cd82Shannken #include <sys/mutex.h>
43fa8ba8a3Scgd 
448ca90bd4Sitojun /*
458ca90bd4Sitojun  * The different types of node in a kernfs filesystem
468ca90bd4Sitojun  */
478ca90bd4Sitojun typedef enum {
48566d30beSdarcy 	KFSkern,		/* the filesystem itself (.) */
49566d30beSdarcy 	KFSroot,		/* the filesystem root (..) */
50566d30beSdarcy 	KFSnull,		/* none aplicable */
511813308fSthorpej 	KFStime,		/* time */
521813308fSthorpej 	KFSboottime,		/* boottime */
53566d30beSdarcy 	KFSint,			/* integer */
54566d30beSdarcy 	KFSstring,		/* string */
55566d30beSdarcy 	KFShostname,		/* hostname */
56566d30beSdarcy 	KFSavenrun,		/* loadavg */
57566d30beSdarcy 	KFSdevice,		/* device file (rootdev/rrootdev) */
58566d30beSdarcy 	KFSmsgbuf,		/* msgbuf */
5965569a4dScl 	KFSsubdir,		/* directory */
6065569a4dScl 	KFSlasttype,		/* last used type */
6165569a4dScl 	KFSmaxtype = (1<<6) - 1	/* last possible type */
628ca90bd4Sitojun } kfstype;
638ca90bd4Sitojun 
648ca90bd4Sitojun /*
6565569a4dScl  * Control data for the kern file system.
668ca90bd4Sitojun  */
67420dea1eSpk struct kern_target {
68420dea1eSpk 	u_char		kt_type;
69420dea1eSpk 	u_char		kt_namlen;
70b221909eSthorpej 	const char	*kt_name;
71420dea1eSpk 	void		*kt_data;
728ca90bd4Sitojun 	kfstype		kt_tag;
73420dea1eSpk 	u_char		kt_vtype;
74420dea1eSpk 	mode_t		kt_mode;
75420dea1eSpk };
76420dea1eSpk 
7765569a4dScl struct dyn_kern_target {
7865569a4dScl 	struct kern_target		dkt_kt;
7965569a4dScl 	SIMPLEQ_ENTRY(dyn_kern_target)	dkt_queue;
8065569a4dScl };
8165569a4dScl 
8265569a4dScl struct kernfs_subdir {
8365569a4dScl 	SIMPLEQ_HEAD(,dyn_kern_target)	ks_entries;
8465569a4dScl 	unsigned int			ks_nentries;
8565569a4dScl 	unsigned int			ks_dirs;
8665569a4dScl 	const struct kern_target	*ks_parent;
8765569a4dScl };
8865569a4dScl 
89fa8ba8a3Scgd struct kernfs_node {
908ca90bd4Sitojun 	LIST_ENTRY(kernfs_node) kfs_hash; /* hash chain */
918ca90bd4Sitojun 	TAILQ_ENTRY(kernfs_node) kfs_list; /* flat list */
9294d1925cSalc 	struct vnode	*kfs_vnode;	/* vnode associated with this kernfs_node */
9394d1925cSalc 	kfstype		kfs_type;	/* type of kernfs node */
948ca90bd4Sitojun 	mode_t		kfs_mode;	/* mode bits for stat() */
958ca90bd4Sitojun 	long		kfs_fileno;	/* unique file id */
968ca90bd4Sitojun 	const struct kern_target *kfs_kt;
9724cd5ab8Shannken 	void		*kfs_v;		/* dynamic node private data */
988ca90bd4Sitojun 	long		kfs_cookie;	/* fileno cookie */
99fa8ba8a3Scgd };
100fa8ba8a3Scgd 
1018ca90bd4Sitojun struct kernfs_mount {
1028ca90bd4Sitojun 	TAILQ_HEAD(, kernfs_node) nodelist;
1038ca90bd4Sitojun 	long fileno_cookie;
1048ca90bd4Sitojun };
1058ca90bd4Sitojun 
1068ca90bd4Sitojun #define UIO_MX	32
1078ca90bd4Sitojun 
1088ca90bd4Sitojun #define KERNFS_FILENO(kt, typ, cookie) \
10965569a4dScl 	((kt >= &kern_targets[0] && kt < &kern_targets[static_nkern_targets]) \
11065569a4dScl 	    ? 2 + ((kt) - &kern_targets[0]) \
11181d3c206Scl 	      : (((cookie + 1) << 6) | (typ)))
11265569a4dScl #define KERNFS_TYPE_FILENO(typ, cookie) \
11365569a4dScl 	(((cookie + 1) << 6) | (typ))
1148ca90bd4Sitojun 
115fa8ba8a3Scgd #define VFSTOKERNFS(mp)	((struct kernfs_mount *)((mp)->mnt_data))
116fa8ba8a3Scgd #define	VTOKERN(vp)	((struct kernfs_node *)(vp)->v_data)
1178ca90bd4Sitojun #define KERNFSTOV(kfs)	((kfs)->kfs_vnode)
118fa8ba8a3Scgd 
119efca0aaeSchristos #define KERNFS_MAXNAMLEN	255
120efca0aaeSchristos 
1218ca90bd4Sitojun extern const struct kern_target kern_targets[];
1228ca90bd4Sitojun extern int nkern_targets;
12365569a4dScl extern const int static_nkern_targets;
124af97f2e8Sxtraeme extern int (**kernfs_vnodeop_p)(void *);
1259c12b632Sriastradh extern int (**kernfs_specop_p)(void *);
126fa8ba8a3Scgd extern struct vfsops kernfs_vfsops;
127cde1d475Smycroft extern dev_t rrootdev;
1288189cd82Shannken extern kmutex_t kfs_lock;
1298ca90bd4Sitojun 
13002443708Sad int kernfs_root(struct mount *, int, struct vnode **);
1318ca90bd4Sitojun 
13265569a4dScl /*
13365569a4dScl  * Data types for the kernfs file operations.
13465569a4dScl  */
13565569a4dScl typedef enum {
13682722a8dSbouyer 	KERNFS_XREAD,
13765569a4dScl 	KERNFS_XWRITE,
13865569a4dScl 	KERNFS_FILEOP_CLOSE,
13965569a4dScl 	KERNFS_FILEOP_GETATTR,
14065569a4dScl 	KERNFS_FILEOP_IOCTL,
14165569a4dScl 	KERNFS_FILEOP_OPEN,
14282722a8dSbouyer 	KERNFS_FILEOP_READ,
14365569a4dScl 	KERNFS_FILEOP_WRITE,
14465569a4dScl } kfsfileop;
14565569a4dScl 
14665569a4dScl struct kernfs_fileop {
14765569a4dScl 	kfstype				kf_type;
14865569a4dScl 	kfsfileop			kf_fileop;
14965569a4dScl 	union {
15065569a4dScl 		int			(*_kf_vop)(void *);
15182722a8dSbouyer 		int			(*_kf_xread)
15214349e55Sbouyer 			(const struct kernfs_node *, char **, size_t);
15365569a4dScl 		int			(*_kf_xwrite)
15465569a4dScl 			(const struct kernfs_node *, char *, size_t);
15565569a4dScl 	} _kf_opfn;
15665569a4dScl 	SPLAY_ENTRY(kernfs_fileop)	kf_node;
15765569a4dScl };
1587173cfeeSchristos 
15965569a4dScl #define	kf_vop		_kf_opfn._kf_vop
16082722a8dSbouyer #define	kf_xread	_kf_opfn._kf_xread
16165569a4dScl #define	kf_xwrite	_kf_opfn._kf_xwrite
16265569a4dScl 
16365569a4dScl typedef struct kern_target kernfs_parentdir_t;
16465569a4dScl typedef struct dyn_kern_target kernfs_entry_t;
16565569a4dScl 
16665569a4dScl /*
16765569a4dScl  * Functions for adding kernfs datatypes and nodes.
16865569a4dScl  */
16965569a4dScl kfstype kernfs_alloctype(int, const struct kernfs_fileop *);
17065569a4dScl #define	KERNFS_ALLOCTYPE(kf) kernfs_alloctype(sizeof((kf)) / \
17165569a4dScl 	sizeof((kf)[0]), (kf))
172*3c14d572Sjdolecek #define	KERNFS_ALLOCENTRY(dkt, km_flags)				\
173*3c14d572Sjdolecek 	dkt = (kernfs_entry_t *)kmem_zalloc(				\
174*3c14d572Sjdolecek 		sizeof(struct dyn_kern_target), (km_flags))
17565569a4dScl #define	KERNFS_INITENTRY(dkt, type, name, data, tag, vtype, mode) do {	\
17665569a4dScl 	(dkt)->dkt_kt.kt_type = (type);					\
17765569a4dScl 	(dkt)->dkt_kt.kt_namlen = strlen((name));			\
17865569a4dScl 	(dkt)->dkt_kt.kt_name = (name);					\
17965569a4dScl 	(dkt)->dkt_kt.kt_data = (data);					\
18065569a4dScl 	(dkt)->dkt_kt.kt_tag = (tag);					\
18165569a4dScl 	(dkt)->dkt_kt.kt_vtype = (vtype);				\
18265569a4dScl 	(dkt)->dkt_kt.kt_mode = (mode);					\
18365569a4dScl } while (/*CONSTCOND*/0)
18465569a4dScl #define	KERNFS_ENTOPARENTDIR(dkt) &(dkt)->dkt_kt
185af97f2e8Sxtraeme int kernfs_addentry(kernfs_parentdir_t *, kernfs_entry_t *);
18665569a4dScl 
187461a86f9Schristos #ifdef IPSEC
188461a86f9Schristos __weak_extern(key_freesp)
189461a86f9Schristos __weak_extern(key_getspbyid)
190461a86f9Schristos __weak_extern(key_setdumpsa_spi)
191461a86f9Schristos __weak_extern(key_setdumpsp)
192461a86f9Schristos __weak_extern(satailq)
193461a86f9Schristos __weak_extern(sptailq)
194461a86f9Schristos #endif
195461a86f9Schristos 
1966efcd1b6Sbriggs #endif /* _KERNEL */
197