[BACK]Return to puffs_sys.h CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / fs / puffs

Annotation of src/sys/fs/puffs/puffs_sys.h, Revision 1.9.2.4

1.9.2.4 ! ad          1: /*     $NetBSD: puffs_sys.h,v 1.9.2.3 2007/02/01 08:48:33 ad Exp $     */
1.9.2.2   ad          2:
                      3: /*
                      4:  * Copyright (c) 2005, 2006  Antti Kantee.  All Rights Reserved.
                      5:  *
                      6:  * Development of this software was supported by the
                      7:  * Google Summer of Code program and the Ulla Tuominen Foundation.
                      8:  * The Google SoC project was mentored by Bill Studenmund.
                      9:  *
                     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.
                     18:  * 3. The name of the company nor the name of the author may be used to
                     19:  *    endorse or promote products derived from this software without specific
                     20:  *    prior written permission.
                     21:  *
                     22:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
                     23:  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
                     24:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
                     25:  * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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 OR
                     28:  * 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.
                     33:  */
                     34:
                     35: #ifndef _PUFFS_SYS_H_
                     36: #define _PUFFS_SYS_H_
                     37:
                     38: #include <sys/param.h>
                     39: #include <sys/select.h>
                     40: #include <sys/kauth.h>
                     41: #include <sys/lock.h>
                     42: #include <sys/queue.h>
                     43: #include <sys/pool.h>
                     44:
                     45: #include <fs/puffs/puffs_msgif.h>
                     46:
                     47: #include <miscfs/genfs/genfs_node.h>
                     48:
                     49: extern int (**puffs_vnodeop_p)(void *);
                     50: extern int (**puffs_specop_p)(void *);
                     51: extern int (**puffs_fifoop_p)(void *);
                     52:
                     53: extern const struct vnodeopv_desc puffs_vnodeop_opv_desc;
                     54: extern const struct vnodeopv_desc puffs_specop_opv_desc;
                     55: extern const struct vnodeopv_desc puffs_fifoop_opv_desc;
1.9.2.3   ad         56: extern const struct vnodeopv_desc puffs_msgop_opv_desc;
1.9.2.2   ad         57:
                     58: extern struct pool puffs_pnpool;
                     59:
1.9.2.3   ad         60: #define PUFFS_NAMEPREFIX "puffs:"
                     61:
1.9.2.2   ad         62: /*
                     63:  * While a request is going to userspace, park the caller within the
                     64:  * kernel.  This is the kernel counterpart of "struct puffs_req".
                     65:  */
                     66: struct puffs_park {
1.9.2.3   ad         67:        struct puffs_req        *park_preq;     /* req followed by buf  */
                     68:        size_t                  park_copylen;   /* userspace copylength */
1.9.2.2   ad         69:
1.9.2.3   ad         70:        size_t                  park_maxlen;    /* max size, only for "adj" */
                     71:                                                /* ^ XXX: overloaded */
1.9.2.2   ad         72:
                     73:        TAILQ_ENTRY(puffs_park) park_entries;
                     74: };
                     75:
                     76: #define PUFFS_SIZEOPREQ_UIO_IN 1
                     77: #define PUFFS_SIZEOPREQ_UIO_OUT 2
                     78: #define PUFFS_SIZEOPREQ_BUF_IN 3
                     79: #define PUFFS_SIZEOPREQ_BUF_OUT 4
                     80:
                     81: #define PUFFS_SIZEOP_UIO(a)    \
                     82:        (((a)==PUFFS_SIZEOPREQ_UIO_IN)||(a)==PUFFS_SIZEOPREQ_UIO_OUT)
                     83: #define PUFFS_SIZEOP_BUF(a)    \
                     84:        (((a)==PUFFS_SIZEOPREQ_BUF_IN)||(a)==PUFFS_SIZEOPREQ_BUF_OUT)
                     85:
                     86: /* XXX: alignment-optimization */
                     87: struct puffs_sizepark {
                     88:        uint64_t        pkso_reqid;
                     89:        uint8_t         pkso_reqtype;
                     90:
                     91:        struct uio      *pkso_uio;
                     92:        void            *pkso_copybuf;
                     93:        size_t          pkso_bufsize;
                     94:
                     95:        TAILQ_ENTRY(puffs_sizepark) pkso_entries;
                     96: };
                     97:
1.9.2.3   ad         98: #ifdef DEBUG
                     99: extern int puffsdebug; /* puffs_subr.c */
                    100: #define DPRINTF(x) if (puffsdebug > 0) printf x
                    101: #define DPRINTF_VERBOSE(x) if (puffsdebug > 1) printf x
                    102: #else
1.9.2.2   ad        103: #define DPRINTF(x)
1.9.2.3   ad        104: #define DPRINTF_VERBOSE(x)
                    105: #endif
1.9.2.2   ad        106:
                    107: #define MPTOPUFFSMP(mp) ((struct puffs_mount *)((mp)->mnt_data))
                    108: #define PMPTOMP(pmp) (pmp->pmp_mp)
                    109: #define VPTOPP(vp) ((struct puffs_node *)(vp)->v_data)
                    110: #define VPTOPNC(vp) (((struct puffs_node *)(vp)->v_data)->pn_cookie)
                    111: #define VPTOPUFFSMP(vp) ((struct puffs_mount*)((struct puffs_node*)vp->v_data))
                    112: #define FPTOPMP(fp) (((struct puffs_instance *)fp->f_data)->pi_pmp)
                    113: #define FPTOPI(fp) ((struct puffs_instance *)fp->f_data)
                    114:
1.9.2.3   ad        115: #define EXISTSOP(pmp, op) \
                    116:  (((pmp)->pmp_flags&PUFFS_KFLAG_ALLOPS) || ((pmp)->pmp_vnopmask[PUFFS_VN_##op]))
                    117:
                    118: #define PUFFS_DOCACHE(pmp)     (((pmp)->pmp_flags & PUFFS_KFLAG_NOCACHE) == 0)
                    119:
1.9.2.2   ad        120: TAILQ_HEAD(puffs_wq, puffs_park);
1.9.2.4 ! ad        121: LIST_HEAD(puffs_node_hashlist, puffs_node);
1.9.2.2   ad        122: struct puffs_mount {
                    123:        struct simplelock               pmp_lock;
                    124:
                    125:        struct puffs_args               pmp_args;
1.9.2.3   ad        126: #define pmp_flags pmp_args.pa_flags
                    127: #define pmp_vnopmask pmp_args.pa_vnopmask
1.9.2.2   ad        128:
                    129:        struct puffs_wq                 pmp_req_touser;
                    130:        size_t                          pmp_req_touser_waiters;
                    131:        size_t                          pmp_req_maxsize;
                    132:
                    133:        struct puffs_wq                 pmp_req_replywait;
                    134:        TAILQ_HEAD(, puffs_sizepark)    pmp_req_sizepark;
                    135:
1.9.2.4 ! ad        136:        struct puffs_node_hashlist      *pmp_pnodehash;
        !           137:        size_t                          pmp_npnodehash;
1.9.2.2   ad        138:
                    139:        struct mount                    *pmp_mp;
                    140:        struct vnode                    *pmp_root;
                    141:        void                            *pmp_rootcookie;
                    142:        struct selinfo                  *pmp_sel;       /* in puffs_instance */
                    143:
1.9.2.4 ! ad        144:        uint64_t                        pmp_nextreq;
1.9.2.2   ad        145:        uint8_t                         pmp_status;
1.9.2.3   ad        146:        uint8_t                         pmp_unmounting;
1.9.2.4 ! ad        147:        uint8_t                         pmp_suspend;
1.9.2.2   ad        148: };
1.9.2.3   ad        149:
1.9.2.2   ad        150: #define PUFFSTAT_BEFOREINIT    0
                    151: #define PUFFSTAT_MOUNTING      1
                    152: #define PUFFSTAT_RUNNING       2
1.9.2.3   ad        153: #define PUFFSTAT_DYING         3 /* Do you want your possessions identified? */
1.9.2.2   ad        154:
1.9.2.4 ! ad        155: #define PNODE_NOREFS   0x01    /* vnode inactive, no backend reference */
        !           156: #define PNODE_SUSPEND  0x02    /* issue all operations as FAF          */
        !           157: #if 0
        !           158: #define PNODE_LOCKED   0x0
        !           159: #define PNODE_WANTED   0x0
        !           160: #endif
1.9.2.2   ad        161: struct puffs_node {
                    162:        struct genfs_node pn_gnode;     /* genfs glue                   */
                    163:
                    164:        void            *pn_cookie;     /* userspace pnode cookie       */
                    165:        struct vnode    *pn_vp;         /* backpointer to vnode         */
                    166:        uint32_t        pn_stat;        /* node status                  */
                    167:
1.9.2.4 ! ad        168:        LIST_ENTRY(puffs_node) pn_hashent;
1.9.2.2   ad        169: };
                    170:
                    171: int    puffs_start2(struct puffs_mount *, struct puffs_startreq *);
                    172:
                    173: int    puffs_vfstouser(struct puffs_mount *, int, void *, size_t);
1.9.2.4 ! ad        174: void   puffs_suspendtouser(struct puffs_mount *, int);
1.9.2.2   ad        175: int    puffs_vntouser(struct puffs_mount *, int, void *, size_t, void *,
                    176:                       struct vnode *, struct vnode *);
                    177: void   puffs_vntouser_faf(struct puffs_mount *, int, void *, size_t, void *);
                    178: int    puffs_vntouser_req(struct puffs_mount *, int, void *, size_t,
                    179:                           void *, uint64_t, struct vnode *, struct vnode *);
                    180: int    puffs_vntouser_adjbuf(struct puffs_mount *, int, void **, size_t *,
                    181:                              size_t, void *, struct vnode *, struct vnode *);
                    182:
                    183: int    puffs_getvnode(struct mount *, void *, enum vtype, voff_t, dev_t,
                    184:                       struct vnode **);
                    185: int    puffs_newnode(struct mount *, struct vnode *, struct vnode **,
                    186:                      void *, struct componentname *, enum vtype, dev_t);
                    187: void   puffs_putvnode(struct vnode *);
1.9.2.3   ad        188: struct vnode *puffs_pnode2vnode(struct puffs_mount *, void *, int);
                    189: void   puffs_makecn(struct puffs_kcn *, const struct componentname *);
1.9.2.2   ad        190: void   puffs_credcvt(struct puffs_cred *, kauth_cred_t);
                    191: pid_t  puffs_lwp2pid(struct lwp *);
                    192:
                    193: void   puffs_updatenode(struct vnode *, int);
                    194: #define PUFFS_UPDATEATIME      0x01
                    195: #define PUFFS_UPDATECTIME      0x02
                    196: #define PUFFS_UPDATEMTIME      0x04
                    197: #define PUFFS_UPDATESIZE       0x08
1.9.2.3   ad        198: void   puffs_updatevpsize(struct vnode *);
1.9.2.2   ad        199:
                    200: int    puffs_setpmp(pid_t, int, struct puffs_mount *);
                    201: void   puffs_nukebypmp(struct puffs_mount *);
                    202:
                    203: uint64_t       puffs_getreqid(struct puffs_mount *);
                    204: void           puffs_userdead(struct puffs_mount *);
                    205:
1.9.2.3   ad        206: /* get/put called by ioctl handler */
                    207: int    puffs_getop(struct puffs_mount *, struct puffs_reqh_get *, int);
                    208: int    puffs_putop(struct puffs_mount *, struct puffs_reqh_put *);
                    209:
1.9.2.2   ad        210: extern int (**puffs_vnodeop_p)(void *);
                    211:
                    212: MALLOC_DECLARE(M_PUFFS);
                    213:
                    214: #endif /* _PUFFS_SYS_H_ */

CVSweb <webmaster@jp.NetBSD.org>