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

Annotation of src/sys/fs/puffs/puffs_msgif.h, Revision 1.14

1.14    ! pooka       1: /*     $NetBSD: puffs_msgif.h,v 1.13 2006/12/29 15:38:37 pooka 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_MSGIF_H_
                     36: #define _PUFFS_MSGIF_H_
                     37:
                     38: #include <sys/param.h>
                     39: #include <sys/time.h>
                     40: #include <sys/ioccom.h>
                     41: #include <sys/uio.h>
                     42: #include <sys/vnode.h>
                     43: #include <sys/ucred.h>
                     44: #include <sys/statvfs.h>
                     45: #include <sys/dirent.h>
                     46: #include <sys/fcntl.h>
                     47:
                     48: #define PUFFSOP_VFS    1
                     49: #define PUFFSOP_VN     2
1.5       pooka      50: #define PUFFSOPFLAG_FAF        0x10    /* fire-and-forget */
                     51:
                     52: #define PUFFSOP_OPCMASK                0x03
                     53: #define PUFFSOP_OPCLASS(a)     ((a) & PUFFSOP_OPCMASK)
1.6       pooka      54: #define PUFFSOP_WANTREPLY(a)   (((a) & PUFFSOPFLAG_FAF) == 0)
1.1       pooka      55:
1.9       pooka      56: /* XXX: we don't need everything */
1.1       pooka      57: enum {
                     58:        PUFFS_VFS_MOUNT,        PUFFS_VFS_START,        PUFFS_VFS_UNMOUNT,
                     59:        PUFFS_VFS_ROOT,         PUFFS_VFS_STATVFS,      PUFFS_VFS_SYNC,
                     60:        PUFFS_VFS_VGET,         PUFFS_VFS_FHTOVP,       PUFFS_VFS_VPTOFH,
                     61:        PUFFS_VFS_INIT,         PUFFS_VFS_DONE,         PUFFS_VFS_SNAPSHOT,
                     62:        PUFFS_VFS_EXTATTCTL
                     63: };
                     64: #define PUFFS_VFS_MAX PUFFS_VFS_EXTATTCTL
                     65:
1.9       pooka      66: /* moreXXX: we don't need everything here either */
1.1       pooka      67: enum {
                     68:        PUFFS_VN_LOOKUP,        PUFFS_VN_CREATE,        PUFFS_VN_MKNOD,
                     69:        PUFFS_VN_OPEN,          PUFFS_VN_CLOSE,         PUFFS_VN_ACCESS,
                     70:        PUFFS_VN_GETATTR,       PUFFS_VN_SETATTR,       PUFFS_VN_READ,
                     71:        PUFFS_VN_WRITE,         PUFFS_VN_IOCTL,         PUFFS_VN_FCNTL,
                     72:        PUFFS_VN_POLL,          PUFFS_VN_KQFILTER,      PUFFS_VN_REVOKE,
                     73:        PUFFS_VN_MMAP,          PUFFS_VN_FSYNC,         PUFFS_VN_SEEK,
                     74:        PUFFS_VN_REMOVE,        PUFFS_VN_LINK,          PUFFS_VN_RENAME,
                     75:        PUFFS_VN_MKDIR,         PUFFS_VN_RMDIR,         PUFFS_VN_SYMLINK,
                     76:        PUFFS_VN_READDIR,       PUFFS_VN_READLINK,      PUFFS_VN_ABORTOP,
                     77:        PUFFS_VN_INACTIVE,      PUFFS_VN_RECLAIM,       PUFFS_VN_LOCK,
                     78:        PUFFS_VN_UNLOCK,        PUFFS_VN_BMAP,          PUFFS_VN_STRATEGY,
                     79:        PUFFS_VN_PRINT,         PUFFS_VN_ISLOCKED,      PUFFS_VN_PATHCONF,
                     80:        PUFFS_VN_ADVLOCK,       PUFFS_VN_LEASE,         PUFFS_VN_WHITEOUT,
                     81:        PUFFS_VN_GETPAGES,      PUFFS_VN_PUTPAGES,      PUFFS_VN_GETEXTATTR,
                     82:        PUFFS_VN_LISTEXTATTR,   PUFFS_VN_OPENEXTATTR,   PUFFS_VN_DELETEEXTATTR,
                     83:        PUFFS_VN_SETEXTATTR
                     84: };
                     85: #define PUFFS_VN_MAX PUFFS_VN_SETEXTATTR
                     86:
1.14    ! pooka      87: #define PUFFSDEVELVERS 0x80000000
        !            88: #define PUFFSVERSION   0
1.1       pooka      89: #define PUFFSNAMESIZE  32
                     90: struct puffs_args {
1.14    ! pooka      91:        unsigned int    pa_vers;
1.1       pooka      92:        int             pa_fd;
1.9       pooka      93:        uint32_t        pa_flags;
1.1       pooka      94:        size_t          pa_maxreqlen;
1.14    ! pooka      95:        char            pa_name[PUFFSNAMESIZE+1];   /* name for puffs type */
1.9       pooka      96:        uint8_t         pa_vnopmask[PUFFS_VN_MAX];
1.1       pooka      97: };
1.10      pooka      98: #define PUFFS_KFLAG_ALLOWCTL   0x01    /* ioctl/fcntl commands allowed */
                     99: #define PUFFS_KFLAG_NOCACHE    0x02    /* flush page cache immediately */
                    100: #define PUFFS_KFLAG_ALLOPS     0x04    /* ignore pa_vnopmask, send all */
                    101: #define PUFFS_KFLAG_MASK       0x07
1.1       pooka     102:
                    103: /*
                    104:  * This is the device minor number for the cloning device.  Make it
                    105:  * a high number "just in case", even though we don't want to open
                    106:  * any specific devices currently.
                    107:  */
                    108: #define PUFFS_CLONER 0x7ffff
                    109:
1.11      pooka     110: struct puffs_reqh_get {
                    111:        void    *phg_buf;       /* user buffer          */
                    112:        size_t  phg_buflen;     /* user buffer length   */
                    113:
                    114:        int     phg_nops;       /* max ops user wants / number delivered */
                    115:        int     phg_more;       /* advisory: more ops available? */
                    116: };
                    117:
                    118: struct puffs_reqh_put {
                    119:        int             php_nops;       /* ops available / ops handled */
                    120:
                    121:        /* these describe the first request */
                    122:        uint64_t        php_id;         /* request id */
                    123:        void            *php_buf;       /* user buffer address */
                    124:        size_t          php_buflen;     /* user buffer length, hdr NOT incl. */
                    125: };
                    126:
1.1       pooka     127: /*
1.11      pooka     128:  * The requests work as follows:
                    129:  *
                    130:  *  + GETOP: When fetching operations from the kernel, the user server
                    131:  *           supplies a flat buffer into which operations are written.
                    132:  *           The number of operations written to the buffer is
                    133:  *           MIN(prhg_nops, requests waiting, space in buffer).
                    134:  *
                    135:  *           Operations follow each other and each one is described
                    136:  *           by the puffs_req structure, which is immediately followed
                    137:  *           by the aligned request data buffer in preq_buf.  The next
                    138:  *           puffs_req can be found at preq + preq_buflen.
                    139:  *
                    140:  *           Visually, the server should expect:
                    141:  *
                    142:  *           |<-- preq_buflen -->|
                    143:  *           ---------------------------------------------------------------
                    144:  *           |hdr|  buffer |align|hdr| buffer |hdr| ....   |buffer|        |
                    145:  *           ---------------------------------------------------------------
                    146:  *           ^ start       ^ unaligned        ^ aligned    ^ always aligned
                    147:  *
                    148:  *           The server is allowed to modify the contents of the buffers.
                    149:  *           Since the headers are the same size for both get and put, it
                    150:  *           is possible to handle all operations simply by doing in-place
                    151:  *           modification.  Where more input is expected that what was put
                    152:  *           out, the kernel leaves a hole in the buffer.  This hole size
                    153:  *           is derived from the operational semantics known by the vnode
                    154:  *           layer.  The hole size is included in preq_buflen.  The
                    155:  *           amount of relevant information in the buffer is call-specific
                    156:  *           and can be deduced by the server from the call type.
                    157:  *
                    158:  *  + PUTOP: When returning the results of an operation to the kernel, the
                    159:  *           user server is allowed to input results in a scatter-gather
                    160:  *           fashion.  Each request is made up of a header and the buffer.
                    161:  *           The header describes the *NEXT* request for copyin, *NOT* the
                    162:  *           current one.  The first request is described in puffs_reqh_put
                    163:  *           and the last one is left uninterpreted.  This is to halve the
                    164:  *           amount of copyin's required.
                    165:  *
                    166:  *           Fans of my ascii art, rejoice:
                    167:  *               /-------------------->| preq_buflen     |
                    168:  *           ---^----------------------------------------------------------
                    169:  *           |hdr|buffer| empty spaces |hdr|    buffer   |                |
                    170:  *           --v-----------------------^-v---------------------------------
                    171:  *             \------- preq_buf -----/  \------- preq_buf ....
                    172:  *
                    173:  *           This scheme also allows for better in-place modification of the
                    174:  *           request buffer when handling requests.  The vision is that
                    175:  *           operations which can be immediately satisfied will be edited
                    176:  *           in-place while ones which can't will be left blank.  Also,
                    177:  *           requests from async operations which have been satisfied
                    178:  *           meanwhile can be included.
                    179:  *
                    180:  *           The total number of operations is given by the ioctl control
                    181:  *           structure puffs_reqh.  The values in the header in the final
                    182:  *           are not used.
1.1       pooka     183:  */
                    184: struct puffs_req {
1.11      pooka     185:        uint64_t        preq_id;                /* get: cur, put: next */
1.1       pooka     186:
1.11      pooka     187:        union u {
                    188:                struct {
                    189:                        uint8_t opclass;        /* cur */
                    190:                        uint8_t optype;         /* cur */
                    191:
                    192:                        /*
                    193:                         * preq_cookie is the node cookie associated with
                    194:                         * the request.  It always maps 1:1 to a vnode
                    195:                         * and could map to a userspace struct puffs_node.
                    196:                         * The cookie usually describes the first
                    197:                         * vnode argument of the VOP_POP() in question.
                    198:                         */
                    199:
                    200:                        void    *cookie;        /* cur */
                    201:                } out;
                    202:                struct {
                    203:                        int     rv;             /* cur */
                    204:                        void    *buf;           /* next */
                    205:                } in;
                    206:        } u;
1.1       pooka     207:
1.11      pooka     208:        size_t  preq_buflen;                    /* get: cur, put: next */
1.1       pooka     209:        /*
1.11      pooka     210:         * the following helper pads the struct size to md alignment
                    211:         * multiple (should size_t not cut it).  it makes sure that
                    212:         * whatever comes after this struct is aligned
1.1       pooka     213:         */
1.11      pooka     214:        uint8_t preq_buf[0] __aligned(ALIGNBYTES+1);
1.1       pooka     215: };
1.11      pooka     216: #define preq_opclass   u.out.opclass
                    217: #define preq_optype    u.out.optype
                    218: #define preq_cookie    u.out.cookie
                    219: #define preq_rv                u.in.rv
                    220: #define preq_nextbuf   u.in.buf
1.1       pooka     221:
                    222: /*
                    223:  * Some operations have unknown size requirements.  So as the first
                    224:  * stab at handling it, do an extra bounce between the kernel and
                    225:  * userspace.
                    226:  */
                    227: struct puffs_sizeop {
                    228:        uint64_t        pso_reqid;
                    229:
                    230:        uint8_t         *pso_userbuf;
                    231:        size_t          pso_bufsize;
                    232: };
                    233:
                    234: /*
                    235:  * Credentials for an operation.  Can be either struct uucred for
                    236:  * ops called from a credential context or NOCRED/FSCRED for ops
                    237:  * called from within the kernel.  It is up to the implementation
                    238:  * if it makes a difference between these two and the super-user.
                    239:  */
                    240: struct puffs_cred {
                    241:        struct uucred   pcr_uuc;
                    242:        uint8_t         pcr_type;
                    243:        uint8_t         pcr_internal;
                    244: };
                    245: #define PUFFCRED_TYPE_UUC      1
                    246: #define PUFFCRED_TYPE_INTERNAL 2
                    247:
                    248: #define PUFFCRED_CRED_NOCRED   1
                    249: #define PUFFCRED_CRED_FSCRED   2
                    250:
                    251:
1.6       pooka     252: #define PUFFSSTARTOP   _IOWR('p', 1, struct puffs_startreq)
1.11      pooka     253: #define PUFFSGETOP     _IOWR('p', 2, struct puffs_reqh_get)
                    254: #define PUFFSPUTOP     _IOWR('p', 3, struct puffs_reqh_put)
1.6       pooka     255: #define PUFFSSIZEOP    _IOWR('p', 4, struct puffs_sizeop)
1.1       pooka     256:
                    257: /*
                    258:  * 4x MAXPHYS is the max size the system will attempt to copy,
                    259:  * else treated as garbage
                    260:  */
                    261: #define PUFFS_REQ_MAXSIZE      4*MAXPHYS
1.2       pooka     262: #define PUFFS_REQSTRUCT_MAX    4096 /* XXX: approxkludge */
1.1       pooka     263:
                    264: #define PUFFS_TOMOVE(a,b) (MIN((a), b->pmp_req_maxsize - PUFFS_REQSTRUCT_MAX))
                    265:
1.13      pooka     266: /* puffs struct componentname built by kernel */
                    267: struct puffs_kcn {
1.1       pooka     268:        /* args */
1.13      pooka     269:        u_long                  pkcn_nameiop;   /* namei operation      */
                    270:        u_long                  pkcn_flags;     /* flags                */
                    271:        pid_t                   pkcn_pid;       /* caller pid           */
                    272:        struct puffs_cred       pkcn_cred;      /* caller creds         */
                    273:
                    274:        char pkcn_name[MAXPATHLEN+1];  /* nul-terminated path component */
                    275:        long pkcn_namelen;
1.1       pooka     276: };
                    277:
                    278: /*
                    279:  * XXX: figure out what to do with these, copied from namei.h for now
                    280:  */
                    281: #define        PUFFSLOOKUP_LOOKUP      0       /* perform name lookup only */
                    282: #define PUFFSLOOKUP_CREATE     1       /* setup for file creation */
                    283: #define PUFFSLOOKUP_DELETE     2       /* setup for file deletion */
                    284: #define PUFFSLOOKUP_RENAME     3       /* setup for file renaming */
                    285: #define PUFFSLOOKUP_OPMASK     3       /* mask for operation */
                    286:
                    287: #define PUFFSLOOKUP_FOLLOW     0x04    /* follow symlinks */
                    288: #define PUFFSLOOKUP_NOFOLLOW   0x08    /* don't follow symlinks */
                    289: #define PUFFSLOOKUP_OPTIONS    0x0c
                    290:
1.11      pooka     291: /*
                    292:  * Next come the individual requests.  They are all subclassed from
                    293:  * puffs_req and contain request-specific fields in addition.  Note
                    294:  * that there are some requests which have to handle arbitrary-length
                    295:  * buffers.
                    296:  *
                    297:  * The division is the following: puffs_req is to be touched only
                    298:  * by generic routines while the other stuff is supposed to be
                    299:  * modified only by specific routines.
                    300:  */
1.6       pooka     301:
                    302: struct puffs_startreq {
1.11      pooka     303:        struct puffs_req        psr_pr;
                    304:
                    305:        void                    *psr_cookie;    /* IN: root node cookie */
                    306:        struct statvfs          psr_sb;         /* IN: statvfs buffer */
1.1       pooka     307: };
                    308:
                    309: /*
                    310:  * aux structures for vfs operations.
                    311:  */
                    312: struct puffs_vfsreq_unmount {
1.11      pooka     313:        struct puffs_req        pvfsr_pr;
                    314:
1.1       pooka     315:        int                     pvfsr_flags;
                    316:        pid_t                   pvfsr_pid;
                    317: };
                    318:
                    319: struct puffs_vfsreq_statvfs {
1.11      pooka     320:        struct puffs_req        pvfsr_pr;
                    321:
1.1       pooka     322:        struct statvfs          pvfsr_sb;
                    323:        pid_t                   pvfsr_pid;
                    324: };
                    325:
                    326: struct puffs_vfsreq_sync {
1.11      pooka     327:        struct puffs_req        pvfsr_pr;
                    328:
1.1       pooka     329:        struct puffs_cred       pvfsr_cred;
                    330:        pid_t                   pvfsr_pid;
                    331:        int                     pvfsr_waitfor;
                    332: };
                    333:
                    334: /*
                    335:  * aux structures for vnode operations.
                    336:  */
                    337:
                    338: struct puffs_vnreq_lookup {
1.11      pooka     339:        struct puffs_req        pvn_pr;
                    340:
1.13      pooka     341:        struct puffs_kcn        pvnr_cn;                /* OUT  */
1.1       pooka     342:        void                    *pvnr_newnode;          /* IN   */
                    343:        enum vtype              pvnr_vtype;             /* IN   */
1.5       pooka     344:        voff_t                  pvnr_size;              /* IN   */
1.4       pooka     345:        dev_t                   pvnr_rdev;              /* IN   */
1.1       pooka     346: };
                    347:
                    348: struct puffs_vnreq_create {
1.11      pooka     349:        struct puffs_req        pvn_pr;
                    350:
1.13      pooka     351:        struct puffs_kcn        pvnr_cn;                /* OUT  */
1.1       pooka     352:        struct vattr            pvnr_va;                /* OUT  */
                    353:        void                    *pvnr_newnode;          /* IN   */
                    354: };
                    355:
                    356: struct puffs_vnreq_mknod {
1.11      pooka     357:        struct puffs_req        pvn_pr;
                    358:
1.13      pooka     359:        struct puffs_kcn        pvnr_cn;                /* OUT  */
1.1       pooka     360:        struct vattr            pvnr_va;                /* OUT  */
                    361:        void                    *pvnr_newnode;          /* IN   */
                    362: };
                    363:
                    364: struct puffs_vnreq_open {
1.11      pooka     365:        struct puffs_req        pvn_pr;
                    366:
1.1       pooka     367:        struct puffs_cred       pvnr_cred;              /* OUT  */
                    368:        pid_t                   pvnr_pid;               /* OUT  */
                    369:        int                     pvnr_mode;              /* OUT  */
                    370: };
                    371:
                    372: struct puffs_vnreq_close {
1.11      pooka     373:        struct puffs_req        pvn_pr;
                    374:
1.1       pooka     375:        struct puffs_cred       pvnr_cred;              /* OUT  */
                    376:        pid_t                   pvnr_pid;               /* OUT  */
                    377:        int                     pvnr_fflag;             /* OUT  */
                    378: };
                    379:
                    380: struct puffs_vnreq_access {
1.11      pooka     381:        struct puffs_req        pvn_pr;
                    382:
1.1       pooka     383:        struct puffs_cred       pvnr_cred;              /* OUT  */
                    384:        pid_t                   pvnr_pid;               /* OUT  */
                    385:        int                     pvnr_mode;              /* OUT  */
                    386: };
                    387:
                    388: #define puffs_vnreq_setattr puffs_vnreq_setgetattr
                    389: #define puffs_vnreq_getattr puffs_vnreq_setgetattr
                    390: struct puffs_vnreq_setgetattr {
1.11      pooka     391:        struct puffs_req        pvn_pr;
                    392:
1.1       pooka     393:        struct puffs_cred       pvnr_cred;              /* OUT  */
                    394:        struct vattr            pvnr_va;                /* IN/OUT (op depend) */
                    395:        pid_t                   pvnr_pid;               /* OUT  */
                    396: };
                    397:
                    398: #define puffs_vnreq_read puffs_vnreq_readwrite
                    399: #define puffs_vnreq_write puffs_vnreq_readwrite
                    400: struct puffs_vnreq_readwrite {
1.11      pooka     401:        struct puffs_req        pvn_pr;
                    402:
1.1       pooka     403:        struct puffs_cred       pvnr_cred;              /* OUT    */
                    404:        off_t                   pvnr_offset;            /* OUT    */
                    405:        size_t                  pvnr_resid;             /* IN/OUT */
                    406:        int                     pvnr_ioflag;            /* OUT    */
                    407:
                    408:        uint8_t                 pvnr_data[0];           /* IN/OUT (wr/rd) */
                    409: };
                    410:
                    411: #define puffs_vnreq_ioctl puffs_vnreq_fcnioctl
                    412: #define puffs_vnreq_fcntl puffs_vnreq_fcnioctl
                    413: struct puffs_vnreq_fcnioctl {
1.11      pooka     414:        struct puffs_req        pvn_pr;
                    415:
1.1       pooka     416:        struct puffs_cred       pvnr_cred;
                    417:        u_long                  pvnr_command;
                    418:        pid_t                   pvnr_pid;
                    419:        int                     pvnr_fflag;
                    420:
                    421:        void                    *pvnr_data;
                    422:        size_t                  pvnr_datalen;
                    423:        int                     pvnr_copyback;
                    424: };
                    425:
                    426: struct puffs_vnreq_poll {
1.11      pooka     427:        struct puffs_req        pvn_pr;
                    428:
1.1       pooka     429:        int                     pvnr_events;            /* OUT  */
                    430:        pid_t                   pvnr_pid;               /* OUT  */
                    431: };
                    432:
                    433: struct puffs_vnreq_revoke {
1.11      pooka     434:        struct puffs_req        pvn_pr;
                    435:
1.1       pooka     436:        int                     pvnr_flags;             /* OUT  */
                    437: };
                    438:
                    439: struct puffs_vnreq_fsync {
1.11      pooka     440:        struct puffs_req        pvn_pr;
                    441:
1.1       pooka     442:        struct puffs_cred       pvnr_cred;              /* OUT  */
                    443:        off_t                   pvnr_offlo;             /* OUT  */
                    444:        off_t                   pvnr_offhi;             /* OUT  */
                    445:        pid_t                   pvnr_pid;               /* OUT  */
                    446:        int                     pvnr_flags;             /* OUT  */
                    447: };
                    448:
                    449: struct puffs_vnreq_seek {
1.11      pooka     450:        struct puffs_req        pvn_pr;
                    451:
1.1       pooka     452:        struct puffs_cred       pvnr_cred;              /* OUT  */
                    453:        off_t                   pvnr_oldoff;            /* OUT  */
                    454:        off_t                   pvnr_newoff;            /* OUT  */
                    455: };
                    456:
                    457: struct puffs_vnreq_remove {
1.11      pooka     458:        struct puffs_req        pvn_pr;
                    459:
1.13      pooka     460:        struct puffs_kcn        pvnr_cn;                /* OUT  */
1.1       pooka     461:        void                    *pvnr_cookie_targ;      /* OUT  */
                    462: };
                    463:
                    464: struct puffs_vnreq_mkdir {
1.11      pooka     465:        struct puffs_req        pvn_pr;
                    466:
1.13      pooka     467:        struct puffs_kcn        pvnr_cn;                /* OUT  */
1.1       pooka     468:        struct vattr            pvnr_va;                /* OUT  */
                    469:        void                    *pvnr_newnode;          /* IN   */
                    470: };
                    471:
                    472: struct puffs_vnreq_rmdir {
1.11      pooka     473:        struct puffs_req        pvn_pr;
                    474:
1.13      pooka     475:        struct puffs_kcn        pvnr_cn;                /* OUT  */
1.1       pooka     476:        void                    *pvnr_cookie_targ;      /* OUT  */
                    477: };
                    478:
                    479: struct puffs_vnreq_link {
1.11      pooka     480:        struct puffs_req        pvn_pr;
                    481:
1.13      pooka     482:        struct puffs_kcn        pvnr_cn;                /* OUT */
1.1       pooka     483:        void                    *pvnr_cookie_targ;      /* OUT */
                    484: };
                    485:
                    486: struct puffs_vnreq_rename {
1.11      pooka     487:        struct puffs_req        pvn_pr;
                    488:
1.13      pooka     489:        struct puffs_kcn        pvnr_cn_src;            /* OUT  */
                    490:        struct puffs_kcn        pvnr_cn_targ;           /* OUT  */
1.1       pooka     491:        void                    *pvnr_cookie_src;       /* OUT  */
                    492:        void                    *pvnr_cookie_targ;      /* OUT  */
                    493:        void                    *pvnr_cookie_targdir;   /* OUT  */
                    494: };
                    495:
                    496: struct puffs_vnreq_symlink {
1.11      pooka     497:        struct puffs_req        pvn_pr;
                    498:
1.13      pooka     499:        struct puffs_kcn        pvnr_cn;                /* OUT  */
1.1       pooka     500:        struct vattr            pvnr_va;                /* OUT  */
                    501:        void                    *pvnr_newnode;          /* IN   */
                    502:        char                    pvnr_link[MAXPATHLEN];  /* OUT  */
                    503: };
                    504:
                    505: struct puffs_vnreq_readdir {
1.11      pooka     506:        struct puffs_req        pvn_pr;
                    507:
1.1       pooka     508:        struct puffs_cred       pvnr_cred;              /* OUT    */
                    509:        off_t                   pvnr_offset;            /* IN/OUT */
                    510:        size_t                  pvnr_resid;             /* IN/OUT */
                    511:
                    512:        struct dirent           pvnr_dent[0];           /* IN      */
                    513: };
                    514:
                    515: struct puffs_vnreq_readlink {
1.11      pooka     516:        struct puffs_req        pvn_pr;
                    517:
1.1       pooka     518:        struct puffs_cred       pvnr_cred;              /* OUT */
                    519:        size_t                  pvnr_linklen;           /* IN  */
                    520:        char                    pvnr_link[MAXPATHLEN];  /* IN, XXX  */
                    521: };
                    522:
                    523: struct puffs_vnreq_reclaim {
1.11      pooka     524:        struct puffs_req        pvn_pr;
                    525:
1.1       pooka     526:        pid_t                   pvnr_pid;               /* OUT  */
                    527: };
                    528:
1.3       pooka     529: struct puffs_vnreq_inactive {
1.11      pooka     530:        struct puffs_req        pvn_pr;
                    531:
1.3       pooka     532:        pid_t                   pvnr_pid;               /* OUT  */
                    533:        int                     pvnr_backendrefs;       /* IN   */
                    534: };
                    535:
1.1       pooka     536: struct puffs_vnreq_print {
1.11      pooka     537:        struct puffs_req        pvn_pr;
                    538:
1.1       pooka     539:        /* empty */
                    540: };
                    541:
                    542: struct puffs_vnreq_pathconf {
1.11      pooka     543:        struct puffs_req        pvn_pr;
                    544:
1.1       pooka     545:        int                     pvnr_name;              /* OUT  */
                    546:        int                     pvnr_retval;            /* IN   */
                    547: };
                    548:
                    549: struct puffs_vnreq_advlock {
1.11      pooka     550:        struct puffs_req        pvn_pr;
                    551:
1.1       pooka     552:        struct flock            pvnr_fl;                /* OUT  */
                    553:        void                    *pvnr_id;               /* OUT  */
                    554:        int                     pvnr_op;                /* OUT  */
                    555:        int                     pvnr_flags;             /* OUT  */
                    556: };
                    557:
1.12      pooka     558: struct puffs_vnreq_mmap {
                    559:        struct puffs_req        pvn_pr;
                    560:
                    561:        int                     pvnr_fflags;            /* OUT  */
                    562:        struct puffs_cred       pvnr_cred;              /* OUT  */
                    563:        pid_t                   pvnr_pid;               /* OUT  */
                    564: };
                    565:
1.1       pooka     566: /* notyet */
                    567: #if 0
                    568: struct puffs_vnreq_kqfilter { };
                    569: struct puffs_vnreq_islocked { };
                    570: struct puffs_vnreq_lease { };
                    571: #endif
                    572: struct puffs_vnreq_getpages { };
                    573: struct puffs_vnreq_putpages { };
                    574: struct puffs_vnreq_getextattr { };
                    575: struct puffs_vnreq_setextattr { };
                    576: struct puffs_vnreq_listextattr { };
                    577:
                    578: #ifdef _KERNEL
                    579: #define PUFFS_VFSREQ(a)                                                        \
                    580:        struct puffs_vfsreq_##a a##_arg;                                \
                    581:        memset(&a##_arg, 0, sizeof(struct puffs_vfsreq_##a))
                    582:
                    583: #define PUFFS_VNREQ(a)                                                 \
                    584:        struct puffs_vnreq_##a a##_arg;                                 \
                    585:        memset(&a##_arg, 0, sizeof(struct puffs_vnreq_##a))
                    586: #endif
                    587:
                    588: #endif /* _PUFFS_MSGIF_H_ */

CVSweb <webmaster@jp.NetBSD.org>