[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.24.2.4

1.24.2.4! yamt        1: /*     $NetBSD: puffs_sys.h,v 1.24.2.3 2007/04/15 16:03:46 yamt Exp $  */
1.1       pooka       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>
1.24.2.3  yamt       41: #include <sys/mutex.h>
1.1       pooka      42: #include <sys/queue.h>
1.4       pooka      43: #include <sys/pool.h>
1.1       pooka      44:
                     45: #include <fs/puffs/puffs_msgif.h>
                     46:
1.6       pooka      47: #include <miscfs/genfs/genfs_node.h>
                     48:
1.2       pooka      49: extern int (**puffs_vnodeop_p)(void *);
                     50: extern int (**puffs_specop_p)(void *);
1.3       pooka      51: extern int (**puffs_fifoop_p)(void *);
1.2       pooka      52:
                     53: extern const struct vnodeopv_desc puffs_vnodeop_opv_desc;
                     54: extern const struct vnodeopv_desc puffs_specop_opv_desc;
1.3       pooka      55: extern const struct vnodeopv_desc puffs_fifoop_opv_desc;
1.10      pooka      56: extern const struct vnodeopv_desc puffs_msgop_opv_desc;
1.2       pooka      57:
1.4       pooka      58: extern struct pool puffs_pnpool;
                     59:
1.17      pooka      60: #define PUFFS_NAMEPREFIX "puffs:"
                     61:
1.1       pooka      62: #define PUFFS_SIZEOPREQ_UIO_IN 1
                     63: #define PUFFS_SIZEOPREQ_UIO_OUT 2
                     64: #define PUFFS_SIZEOPREQ_BUF_IN 3
                     65: #define PUFFS_SIZEOPREQ_BUF_OUT 4
                     66:
                     67: #define PUFFS_SIZEOP_UIO(a)    \
                     68:        (((a)==PUFFS_SIZEOPREQ_UIO_IN)||(a)==PUFFS_SIZEOPREQ_UIO_OUT)
                     69: #define PUFFS_SIZEOP_BUF(a)    \
                     70:        (((a)==PUFFS_SIZEOPREQ_BUF_IN)||(a)==PUFFS_SIZEOPREQ_BUF_OUT)
                     71:
                     72: /* XXX: alignment-optimization */
                     73: struct puffs_sizepark {
                     74:        uint64_t        pkso_reqid;
                     75:        uint8_t         pkso_reqtype;
                     76:
                     77:        struct uio      *pkso_uio;
                     78:        void            *pkso_copybuf;
                     79:        size_t          pkso_bufsize;
                     80:
                     81:        TAILQ_ENTRY(puffs_sizepark) pkso_entries;
                     82: };
                     83:
1.12      pooka      84: #ifdef DEBUG
1.24      pooka      85: #ifndef PUFFSDEBUG
                     86: #define PUFFSDEBUG
                     87: #endif
                     88: #endif
                     89:
                     90: #ifdef PUFFSDEBUG
1.12      pooka      91: extern int puffsdebug; /* puffs_subr.c */
                     92: #define DPRINTF(x) if (puffsdebug > 0) printf x
                     93: #define DPRINTF_VERBOSE(x) if (puffsdebug > 1) printf x
                     94: #else
1.1       pooka      95: #define DPRINTF(x)
1.10      pooka      96: #define DPRINTF_VERBOSE(x)
1.12      pooka      97: #endif
1.1       pooka      98:
                     99: #define MPTOPUFFSMP(mp) ((struct puffs_mount *)((mp)->mnt_data))
                    100: #define PMPTOMP(pmp) (pmp->pmp_mp)
                    101: #define VPTOPP(vp) ((struct puffs_node *)(vp)->v_data)
                    102: #define VPTOPNC(vp) (((struct puffs_node *)(vp)->v_data)->pn_cookie)
                    103: #define VPTOPUFFSMP(vp) ((struct puffs_mount*)((struct puffs_node*)vp->v_data))
                    104: #define FPTOPMP(fp) (((struct puffs_instance *)fp->f_data)->pi_pmp)
                    105: #define FPTOPI(fp) ((struct puffs_instance *)fp->f_data)
                    106:
1.24.2.4! yamt      107: /* we don't pass the kernel overlay to userspace */
        !           108: #define PUFFS_TOFHSIZE(s) ((s)==0 ? (s) : (s)+4)
        !           109: #define PUFFS_FROMFHSIZE(s) ((s)==0 ? (s) : (s)-4)
        !           110:
1.10      pooka     111: #define EXISTSOP(pmp, op) \
1.11      pooka     112:  (((pmp)->pmp_flags&PUFFS_KFLAG_ALLOPS) || ((pmp)->pmp_vnopmask[PUFFS_VN_##op]))
1.10      pooka     113:
1.16      pooka     114: #define PUFFS_DOCACHE(pmp)     (((pmp)->pmp_flags & PUFFS_KFLAG_NOCACHE) == 0)
                    115:
1.24.2.2  yamt      116: #define PUFFS_WCACHEINFO(pmp)  0
                    117:
1.1       pooka     118: TAILQ_HEAD(puffs_wq, puffs_park);
1.20      pooka     119: LIST_HEAD(puffs_node_hashlist, puffs_node);
1.1       pooka     120: struct puffs_mount {
1.24.2.3  yamt      121:        kmutex_t                        pmp_lock;
1.1       pooka     122:
1.24.2.3  yamt      123:        struct puffs_kargs              pmp_args;
1.10      pooka     124: #define pmp_flags pmp_args.pa_flags
                    125: #define pmp_vnopmask pmp_args.pa_vnopmask
1.1       pooka     126:
                    127:        struct puffs_wq                 pmp_req_touser;
1.24.2.4! yamt      128:        int                             pmp_req_touser_count;
1.24.2.3  yamt      129:        kcondvar_t                      pmp_req_waiter_cv;
1.1       pooka     130:        size_t                          pmp_req_maxsize;
                    131:
                    132:        struct puffs_wq                 pmp_req_replywait;
                    133:        TAILQ_HEAD(, puffs_sizepark)    pmp_req_sizepark;
                    134:
1.20      pooka     135:        struct puffs_node_hashlist      *pmp_pnodehash;
1.24.2.4! yamt      136:        int                             pmp_npnodehash;
1.1       pooka     137:
                    138:        struct mount                    *pmp_mp;
                    139:        struct vnode                    *pmp_root;
                    140:        void                            *pmp_rootcookie;
                    141:        struct selinfo                  *pmp_sel;       /* in puffs_instance */
                    142:
1.24.2.4! yamt      143:        unsigned int                    pmp_refcount;
        !           144:        kcondvar_t                      pmp_refcount_cv;
1.24.2.3  yamt      145:
1.24.2.4! yamt      146:        kcondvar_t                      pmp_unmounting_cv;
1.14      pooka     147:        uint8_t                         pmp_unmounting;
1.24.2.4! yamt      148:
        !           149:        uint8_t                         pmp_status;
1.22      pooka     150:        uint8_t                         pmp_suspend;
1.24.2.3  yamt      151:
                    152:        uint64_t                        pmp_nextreq;
1.1       pooka     153: };
1.8       pooka     154:
1.1       pooka     155: #define PUFFSTAT_BEFOREINIT    0
                    156: #define PUFFSTAT_MOUNTING      1
                    157: #define PUFFSTAT_RUNNING       2
1.14      pooka     158: #define PUFFSTAT_DYING         3 /* Do you want your possessions identified? */
1.1       pooka     159:
1.24.2.2  yamt      160:
1.22      pooka     161: #define PNODE_NOREFS   0x01    /* vnode inactive, no backend reference */
                    162: #define PNODE_SUSPEND  0x02    /* issue all operations as FAF          */
1.24.2.2  yamt      163:
                    164: #define PNODE_METACACHE_ATIME  0x10    /* cache atime metadata */
                    165: #define PNODE_METACACHE_CTIME  0x20    /* cache atime metadata */
                    166: #define PNODE_METACACHE_MTIME  0x40    /* cache atime metadata */
                    167: #define PNODE_METACACHE_SIZE   0x80    /* cache atime metadata */
                    168: #define PNODE_METACACHE_MASK   0xf0
                    169:
1.1       pooka     170: struct puffs_node {
1.6       pooka     171:        struct genfs_node pn_gnode;     /* genfs glue                   */
                    172:
1.1       pooka     173:        void            *pn_cookie;     /* userspace pnode cookie       */
                    174:        struct vnode    *pn_vp;         /* backpointer to vnode         */
                    175:        uint32_t        pn_stat;        /* node status                  */
                    176:
1.24.2.2  yamt      177:        /* metacache */
                    178:        struct timespec pn_mc_atime;
                    179:        struct timespec pn_mc_ctime;
                    180:        struct timespec pn_mc_mtime;
                    181:        u_quad_t        pn_mc_size;
                    182:
1.20      pooka     183:        LIST_ENTRY(puffs_node) pn_hashent;
1.1       pooka     184: };
                    185:
1.24.2.3  yamt      186: typedef void (*parkdone_fn)(struct puffs_req *, void *);
                    187:
                    188: void   puffs_transport_init(void);
                    189: void   puffs_transport_destroy(void);
                    190:
                    191: void   puffs_msgif_init(void);
                    192: void   puffs_msgif_destroy(void);
                    193: void   *puffs_park_alloc(int);
                    194: void   puffs_park_release(void *, int);
                    195:
1.7       pooka     196: int    puffs_start2(struct puffs_mount *, struct puffs_startreq *);
1.1       pooka     197:
                    198: int    puffs_vfstouser(struct puffs_mount *, int, void *, size_t);
1.22      pooka     199: void   puffs_suspendtouser(struct puffs_mount *, int);
1.24.2.3  yamt      200: int    puffs_vntouser(struct puffs_mount *, int, void *, size_t, size_t,
                    201:                       void *, struct vnode *, struct vnode *);
1.6       pooka     202: void   puffs_vntouser_faf(struct puffs_mount *, int, void *, size_t, void *);
1.24.2.3  yamt      203: int    puffs_vntouser_req(struct puffs_mount *, int, void *, size_t, size_t,
1.6       pooka     204:                           void *, uint64_t, struct vnode *, struct vnode *);
1.24.2.3  yamt      205: void   puffs_vntouser_call(struct puffs_mount *, int, void *, size_t, size_t,
                    206:                            void *, parkdone_fn, void *,
                    207:                            struct vnode *, struct vnode *);
1.24.2.2  yamt      208: void   puffs_vntouser_faf(struct puffs_mount *, int, void *, size_t, void *);
                    209: void   puffs_cacheop(struct puffs_mount *, struct puffs_park *,
                    210:                      struct puffs_cacheinfo *, size_t, void *);
                    211: struct puffs_park *puffs_cacheop_alloc(void);
1.1       pooka     212:
1.6       pooka     213: int    puffs_getvnode(struct mount *, void *, enum vtype, voff_t, dev_t,
1.2       pooka     214:                       struct vnode **);
1.1       pooka     215: int    puffs_newnode(struct mount *, struct vnode *, struct vnode **,
1.2       pooka     216:                      void *, struct componentname *, enum vtype, dev_t);
1.1       pooka     217: void   puffs_putvnode(struct vnode *);
1.18      pooka     218: struct vnode *puffs_pnode2vnode(struct puffs_mount *, void *, int);
1.15      pooka     219: void   puffs_makecn(struct puffs_kcn *, const struct componentname *);
1.1       pooka     220: void   puffs_credcvt(struct puffs_cred *, kauth_cred_t);
                    221: pid_t  puffs_lwp2pid(struct lwp *);
                    222:
1.24.2.3  yamt      223: void   puffs_parkdone_asyncbioread(struct puffs_req *, void *);
                    224:
1.24.2.4! yamt      225: void   puffs_mp_reference(struct puffs_mount *);
        !           226: void   puffs_mp_release(struct puffs_mount *);
        !           227:
1.6       pooka     228: void   puffs_updatenode(struct vnode *, int);
                    229: #define PUFFS_UPDATEATIME      0x01
                    230: #define PUFFS_UPDATECTIME      0x02
                    231: #define PUFFS_UPDATEMTIME      0x04
                    232: #define PUFFS_UPDATESIZE       0x08
1.9       pooka     233: void   puffs_updatevpsize(struct vnode *);
1.6       pooka     234:
1.1       pooka     235: int    puffs_setpmp(pid_t, int, struct puffs_mount *);
                    236: void   puffs_nukebypmp(struct puffs_mount *);
                    237:
1.24.2.3  yamt      238: uint64_t       puffs_getreqid(struct puffs_mount *);
                    239: void           puffs_userdead(struct puffs_mount *);
1.1       pooka     240:
1.13      pooka     241: /* get/put called by ioctl handler */
                    242: int    puffs_getop(struct puffs_mount *, struct puffs_reqh_get *, int);
                    243: int    puffs_putop(struct puffs_mount *, struct puffs_reqh_put *);
                    244:
1.1       pooka     245: extern int (**puffs_vnodeop_p)(void *);
                    246:
                    247: MALLOC_DECLARE(M_PUFFS);
                    248:
                    249: #endif /* _PUFFS_SYS_H_ */

CVSweb <webmaster@jp.NetBSD.org>