[BACK]Return to kernfs.h CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / miscfs / kernfs

Annotation of src/sys/miscfs/kernfs/kernfs.h, Revision 1.34

1.34    ! apb         1: /*     $NetBSD: kernfs.h,v 1.33 2008/06/28 01:34:06 rumble Exp $       */
1.8       cgd         2:
1.1       cgd         3: /*
1.6       mycroft     4:  * Copyright (c) 1992, 1993
                      5:  *     The Regents of the University of California.  All rights reserved.
1.1       cgd         6:  *
1.5       cgd         7:  * This code is derived from software donated to Berkeley by
1.1       cgd         8:  * Jan-Simon Pendry.
                      9:  *
1.2       cgd        10:  * Redistribution and use in source and binary forms, with or without
                     11:  * modification, are permitted provided that the following conditions
                     12:  * are met:
                     13:  * 1. Redistributions of source code must retain the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer.
                     15:  * 2. Redistributions in binary form must reproduce the above copyright
                     16:  *    notice, this list of conditions and the following disclaimer in the
                     17:  *    documentation and/or other materials provided with the distribution.
1.17      agc        18:  * 3. Neither the name of the University nor the names of its contributors
1.2       cgd        19:  *    may be used to endorse or promote products derived from this software
                     20:  *    without specific prior written permission.
1.1       cgd        21:  *
1.2       cgd        22:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     23:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     24:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     25:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     26:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     27:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     28:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     29:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     30:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     31:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     32:  * SUCH DAMAGE.
1.1       cgd        33:  *
1.12      fvdl       34:  *     @(#)kernfs.h    8.6 (Berkeley) 3/29/95
1.1       cgd        35:  */
                     36:
1.6       mycroft    37: #define        _PATH_KERNFS    "/kern"         /* Default mountpoint */
                     38:
1.9       briggs     39: #ifdef _KERNEL
1.18      itojun     40: #include <sys/queue.h>
1.34    ! apb        41: #include <sys/tree.h>
1.18      itojun     42:
                     43: /*
                     44:  * The different types of node in a kernfs filesystem
                     45:  */
                     46: typedef enum {
1.20      darcy      47:        KFSkern,                /* the filesystem itself (.) */
                     48:        KFSroot,                /* the filesystem root (..) */
                     49:        KFSnull,                /* none aplicable */
                     50:        KFStime,                /* boottime */
                     51:        KFSint,                 /* integer */
                     52:        KFSstring,              /* string */
                     53:        KFShostname,    /* hostname */
                     54:        KFSavenrun,             /* loadavg */
                     55:        KFSdevice,              /* device file (rootdev/rrootdev) */
                     56:        KFSmsgbuf,              /* msgbuf */
                     57:        KFSipsecsadir,  /* ipsec security association (top dir) */
                     58:        KFSipsecspdir,  /* ipsec security policy (top dir) */
                     59:        KFSipsecsa,             /* ipsec security association entry */
                     60:        KFSipsecsp,             /* ipsec security policy entry */
1.22      cl         61:        KFSsubdir,              /* directory */
                     62:        KFSlasttype,            /* last used type */
                     63:        KFSmaxtype = (1<<6) - 1 /* last possible type */
1.18      itojun     64: } kfstype;
1.11      pk         65:
1.18      itojun     66: /*
1.22      cl         67:  * Control data for the kern file system.
1.18      itojun     68:  */
1.11      pk         69: struct kern_target {
1.18      itojun     70:        u_char          kt_type;
                     71:        u_char          kt_namlen;
                     72:        const char      *kt_name;
                     73:        void            *kt_data;
                     74:        kfstype         kt_tag;
                     75:        u_char          kt_vtype;
                     76:        mode_t          kt_mode;
1.1       cgd        77: };
                     78:
1.22      cl         79: struct dyn_kern_target {
                     80:        struct kern_target              dkt_kt;
                     81:        SIMPLEQ_ENTRY(dyn_kern_target)  dkt_queue;
                     82: };
                     83:
                     84: struct kernfs_subdir {
                     85:        SIMPLEQ_HEAD(,dyn_kern_target)  ks_entries;
                     86:        unsigned int                    ks_nentries;
                     87:        unsigned int                    ks_dirs;
                     88:        const struct kern_target        *ks_parent;
                     89: };
                     90:
1.1       cgd        91: struct kernfs_node {
1.18      itojun     92:        LIST_ENTRY(kernfs_node) kfs_hash; /* hash chain */
                     93:        TAILQ_ENTRY(kernfs_node) kfs_list; /* flat list */
1.32      alc        94:        struct vnode    *kfs_vnode;     /* vnode associated with this kernfs_node */
                     95:        kfstype         kfs_type;       /* type of kernfs node */
1.18      itojun     96:        mode_t          kfs_mode;       /* mode bits for stat() */
                     97:        long            kfs_fileno;     /* unique file id */
1.20      darcy      98:        u_int32_t       kfs_value;      /* SA id or SP id (KFSint) */
1.18      itojun     99:        const struct kern_target *kfs_kt;
                    100:        void            *kfs_v;         /* pointer to secasvar/secpolicy/mbuf */
                    101:        long            kfs_cookie;     /* fileno cookie */
                    102: };
                    103:
                    104: struct kernfs_mount {
                    105:        TAILQ_HEAD(, kernfs_node) nodelist;
                    106:        long fileno_cookie;
1.1       cgd       107: };
                    108:
1.18      itojun    109: #define UIO_MX 32
                    110:
                    111: #define KERNFS_FILENO(kt, typ, cookie) \
1.22      cl        112:        ((kt >= &kern_targets[0] && kt < &kern_targets[static_nkern_targets]) \
                    113:            ? 2 + ((kt) - &kern_targets[0]) \
1.21      cl        114:              : (((cookie + 1) << 6) | (typ)))
1.22      cl        115: #define KERNFS_TYPE_FILENO(typ, cookie) \
                    116:        (((cookie + 1) << 6) | (typ))
1.18      itojun    117:
1.1       cgd       118: #define VFSTOKERNFS(mp)        ((struct kernfs_mount *)((mp)->mnt_data))
1.18      itojun    119: #define        VTOKERN(vp)     ((struct kernfs_node *)(vp)->v_data)
                    120: #define KERNFSTOV(kfs) ((kfs)->kfs_vnode)
1.1       cgd       121:
1.18      itojun    122: extern const struct kern_target kern_targets[];
                    123: extern int nkern_targets;
1.22      cl        124: extern const int static_nkern_targets;
1.25      xtraeme   125: extern int (**kernfs_vnodeop_p)(void *);
1.1       cgd       126: extern struct vfsops kernfs_vfsops;
1.6       mycroft   127: extern dev_t rrootdev;
1.18      itojun    128:
                    129: struct secasvar;
                    130: struct secpolicy;
                    131:
1.25      xtraeme   132: int kernfs_root(struct mount *, struct vnode **);
1.18      itojun    133:
1.25      xtraeme   134: void kernfs_hashinit(void);
                    135: void kernfs_hashreinit(void);
                    136: void kernfs_hashdone(void);
                    137: int kernfs_freevp(struct vnode *);
                    138: int kernfs_allocvp(struct mount *, struct vnode **, kfstype,
                    139:        const struct kern_target *, u_int32_t);
1.18      itojun    140:
1.25      xtraeme   141: void kernfs_revoke_sa(struct secasvar *);
                    142: void kernfs_revoke_sp(struct secpolicy *);
1.22      cl        143:
                    144: /*
                    145:  * Data types for the kernfs file operations.
                    146:  */
                    147: typedef enum {
1.29      bouyer    148:        KERNFS_XREAD,
1.22      cl        149:        KERNFS_XWRITE,
                    150:        KERNFS_FILEOP_CLOSE,
                    151:        KERNFS_FILEOP_GETATTR,
                    152:        KERNFS_FILEOP_IOCTL,
                    153:        KERNFS_FILEOP_OPEN,
1.29      bouyer    154:        KERNFS_FILEOP_READ,
1.22      cl        155:        KERNFS_FILEOP_WRITE,
                    156: } kfsfileop;
                    157:
                    158: struct kernfs_fileop {
                    159:        kfstype                         kf_type;
                    160:        kfsfileop                       kf_fileop;
                    161:        union {
                    162:                int                     (*_kf_vop)(void *);
1.29      bouyer    163:                int                     (*_kf_xread)
1.30      bouyer    164:                        (const struct kernfs_node *, char **, size_t);
1.22      cl        165:                int                     (*_kf_xwrite)
                    166:                        (const struct kernfs_node *, char *, size_t);
                    167:        } _kf_opfn;
                    168:        SPLAY_ENTRY(kernfs_fileop)      kf_node;
                    169: };
1.31      christos  170:
1.22      cl        171: #define        kf_vop          _kf_opfn._kf_vop
1.29      bouyer    172: #define        kf_xread        _kf_opfn._kf_xread
1.22      cl        173: #define        kf_xwrite       _kf_opfn._kf_xwrite
                    174:
                    175: typedef struct kern_target kernfs_parentdir_t;
                    176: typedef struct dyn_kern_target kernfs_entry_t;
                    177:
                    178: /*
                    179:  * Functions for adding kernfs datatypes and nodes.
                    180:  */
                    181: kfstype kernfs_alloctype(int, const struct kernfs_fileop *);
                    182: #define        KERNFS_ALLOCTYPE(kf) kernfs_alloctype(sizeof((kf)) / \
                    183:        sizeof((kf)[0]), (kf))
                    184: #define        KERNFS_ALLOCENTRY(dkt, m_type, m_flags)                         \
                    185:        dkt = (struct dyn_kern_target *)malloc(                         \
                    186:                sizeof(struct dyn_kern_target), (m_type), (m_flags))
                    187: #define        KERNFS_INITENTRY(dkt, type, name, data, tag, vtype, mode) do {  \
                    188:        (dkt)->dkt_kt.kt_type = (type);                                 \
                    189:        (dkt)->dkt_kt.kt_namlen = strlen((name));                       \
                    190:        (dkt)->dkt_kt.kt_name = (name);                                 \
                    191:        (dkt)->dkt_kt.kt_data = (data);                                 \
                    192:        (dkt)->dkt_kt.kt_tag = (tag);                                   \
                    193:        (dkt)->dkt_kt.kt_vtype = (vtype);                               \
                    194:        (dkt)->dkt_kt.kt_mode = (mode);                                 \
                    195: } while (/*CONSTCOND*/0)
                    196: #define        KERNFS_ENTOPARENTDIR(dkt) &(dkt)->dkt_kt
1.25      xtraeme   197: int kernfs_addentry(kernfs_parentdir_t *, kernfs_entry_t *);
1.22      cl        198:
1.9       briggs    199: #endif /* _KERNEL */

CVSweb <webmaster@jp.NetBSD.org>