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