Bring in the "Port PUFFS from NetBSD/FreeBSD" GSoC 2011 project results.
[dragonfly.git] / sys / vfs / puffs / puffs_msgif.h
1 /*      $NetBSD: puffs_msgif.h,v 1.76 2011/07/04 08:07:30 manu Exp $    */
2
3 /*
4  * Copyright (c) 2005, 2006, 2007  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  *
19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
20  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22  * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29  * SUCH DAMAGE.
30  */
31
32 #ifndef _FS_PUFFS_PUFFS_MSGIF_H_
33 #define _FS_PUFFS_PUFFS_MSGIF_H_
34
35 #include <sys/param.h>
36 #include <sys/time.h>
37 #include <sys/ioccom.h>
38 #include <sys/mount.h>
39 #include <sys/uio.h>
40 #include <sys/vfscache.h>
41 #include <sys/vnode.h>
42 #include <sys/ucred.h>
43 #include <sys/statvfs.h>
44 #include <sys/dirent.h>
45 #include <sys/fcntl.h>
46 #include <vm/vm.h>
47
48 #include <dev/misc/putter/putter.h>
49
50 #define _VFS_NAMELEN            MFSNAMELEN
51 #define _VFS_MNAMELEN           MNAMELEN
52
53 typedef off_t voff_t;
54 typedef off_t vsize_t;
55
56 #define PUFFSOP_VFS             0x01    /* kernel-> */
57 #define PUFFSOP_VN              0x02    /* kernel-> */
58 #define PUFFSOP_CACHE           0x03    /* only kernel-> */
59 #define PUFFSOP_ERROR           0x04    /* only kernel-> */
60 #define PUFFSOP_FLUSH           0x05    /* ->kernel */
61 #define PUFFSOP_SUSPEND         0x06    /* ->kernel */
62 #define PUFFSOP_UNMOUNT         0x07    /* ->kernel */
63
64 #define PUFFSOPFLAG_FAF         0x10    /* fire-and-forget */
65 #define PUFFSOPFLAG_ISRESPONSE  0x20    /* req is actually a resp */
66
67 #define PUFFSOP_OPCMASK         0x07
68 #define PUFFSOP_OPCLASS(a)      ((a) & PUFFSOP_OPCMASK)
69 #define PUFFSOP_WANTREPLY(a)    (((a) & PUFFSOPFLAG_FAF) == 0)
70
71 enum {
72         PUFFS_VFS_MOUNT,        PUFFS_VFS_START,        PUFFS_VFS_UNMOUNT,
73         PUFFS_VFS_ROOT,         PUFFS_VFS_QUOTACTL,     PUFFS_VFS_STATVFS,
74         PUFFS_VFS_SYNC,         PUFFS_VFS_VGET,         PUFFS_VFS_FHTOVP,
75         PUFFS_VFS_VPTOFH,       PUFFS_VFS_INIT,         PUFFS_VFS_DONE,
76         PUFFS_VFS_SNAPSHOT,     PUFFS_VFS_EXTATTRCTL,   PUFFS_VFS_SUSPEND
77 };
78 #define PUFFS_VFS_MAX PUFFS_VFS_SUSPEND
79
80 enum {
81         PUFFS_VN_LOOKUP,        PUFFS_VN_LOOKUPDOTDOT,
82         PUFFS_VN_CREATE,        PUFFS_VN_MKNOD,
83         PUFFS_VN_OPEN,          PUFFS_VN_CLOSE,         PUFFS_VN_ACCESS,
84         PUFFS_VN_GETATTR,       PUFFS_VN_SETATTR,       PUFFS_VN_READ,
85         PUFFS_VN_WRITE,         PUFFS_VN_IOCTL,         PUFFS_VN_FCNTL,
86         PUFFS_VN_POLL,          PUFFS_VN_KQFILTER,      PUFFS_VN_REVOKE,
87         PUFFS_VN_MMAP,          PUFFS_VN_FSYNC,         PUFFS_VN_SEEK,
88         PUFFS_VN_REMOVE,        PUFFS_VN_LINK,          PUFFS_VN_RENAME,
89         PUFFS_VN_MKDIR,         PUFFS_VN_RMDIR,         PUFFS_VN_SYMLINK,
90         PUFFS_VN_READDIR,       PUFFS_VN_READLINK,      PUFFS_VN_ABORTOP,
91         PUFFS_VN_INACTIVE,      PUFFS_VN_RECLAIM,       PUFFS_VN_LOCK,
92         PUFFS_VN_UNLOCK,        PUFFS_VN_BMAP,          PUFFS_VN_STRATEGY,
93         PUFFS_VN_PRINT,         PUFFS_VN_ISLOCKED,      PUFFS_VN_PATHCONF,
94         PUFFS_VN_ADVLOCK,       PUFFS_VN_LEASE,         PUFFS_VN_WHITEOUT,
95         PUFFS_VN_GETPAGES,      PUFFS_VN_PUTPAGES,      PUFFS_VN_GETEXTATTR,
96         PUFFS_VN_LISTEXTATTR,   PUFFS_VN_OPENEXTATTR,   PUFFS_VN_DELETEEXTATTR,
97         PUFFS_VN_SETEXTATTR,    PUFFS_VN_CLOSEEXTATTR
98         /* NOTE: If you add an op, decrement PUFFS_VN_SPARE accordingly */
99 };
100 #define PUFFS_VN_MAX PUFFS_VN_CLOSEEXTATTR
101 #define PUFFS_VN_SPARE 31
102
103 /*
104  * These signal invalid parameters the file system returned.
105  */
106 enum {
107         PUFFS_ERR_ERROR,
108         PUFFS_ERR_MAKENODE,     PUFFS_ERR_LOOKUP,       PUFFS_ERR_READDIR,
109         PUFFS_ERR_READLINK,     PUFFS_ERR_READ,         PUFFS_ERR_WRITE,
110         PUFFS_ERR_VPTOFH,       PUFFS_ERR_GETEXTATTR,   PUFFS_ERR_LISTEXTATTR
111 };
112 #define PUFFS_ERR_MAX PUFFS_ERR_LISTEXTATTR
113
114 #define PUFFSVERSION    30
115 #define PUFFSNAMESIZE   32
116
117 #define PUFFS_TYPEPREFIX "puffs|"
118
119 #define PUFFS_TYPELEN (_VFS_NAMELEN - (sizeof(PUFFS_TYPEPREFIX)+1))
120 #define PUFFS_NAMELEN (_VFS_MNAMELEN-1)
121
122 /*
123  * Just a weak typedef for code clarity.  Additionally, we have a
124  * more appropriate vanity type for puffs:
125  * <uep> it should be croissant, not cookie.
126  */
127 typedef void *puffs_cookie_t;
128 typedef puffs_cookie_t puffs_croissant_t;
129
130 struct puffs_kargs {
131         unsigned int    pa_vers;
132         int             pa_minor;
133
134         uint32_t        pa_flags;
135
136         size_t          pa_maxmsglen;
137         int             pa_nhashbuckets;
138
139         size_t          pa_fhsize;
140         int             pa_fhflags;
141
142         uint8_t         pa_vnopmask[PUFFS_VN_MAX + PUFFS_VN_SPARE];
143
144         char            pa_typename[_VFS_NAMELEN];
145         char            pa_mntfromname[_VFS_MNAMELEN];
146
147         puffs_cookie_t  pa_root_cookie;
148         enum vtype      pa_root_vtype;
149         voff_t          pa_root_vsize;
150         union {
151                 dev_t           dev;
152                 uint64_t        container;
153         } devunion;
154
155         struct statvfs  pa_svfsb;
156
157         uint32_t        pa_time32;
158
159         uint32_t        pa_spare[127];
160 };
161 #define pa_root_rdev devunion.dev
162
163 #define PUFFS_KFLAG_NOCACHE_NAME        0x01    /* don't use name cache     */
164 #define PUFFS_KFLAG_NOCACHE_PAGE        0x02    /* don't use page cache     */
165 #define PUFFS_KFLAG_NOCACHE             0x03    /* no cache whatsoever      */
166 #define PUFFS_KFLAG_ALLOPS              0x04    /* ignore pa_vnopmask       */
167 #define PUFFS_KFLAG_WTCACHE             0x08    /* write-through page cache */
168 #define PUFFS_KFLAG_IAONDEMAND          0x10    /* inactive only on demand  */
169 #define PUFFS_KFLAG_MASK                0x3f
170 #define PUFFS_KFLAG_NOCACHE_ATTR        0x40    /* no attrib cache (unused) */
171
172 #define PUFFS_FHFLAG_DYNAMIC            0x01
173 #define PUFFS_FHFLAG_NFSV2              0x02
174 #define PUFFS_FHFLAG_NFSV3              0x04
175 #define PUFFS_FHFLAG_PROTOMASK          0x06
176 #define PUFFS_FHFLAG_PASSTHROUGH        0x08
177 #define PUFFS_FHFLAG_MASK               0x0f
178
179 #define PUFFS_FHSIZE_MAX        1020    /* FHANDLE_SIZE_MAX - 4 */
180
181 struct puffs_req {
182         struct putter_hdr       preq_pth;
183
184         uint64_t                preq_id;
185         puffs_cookie_t          preq_cookie;
186
187         uint16_t                preq_opclass;
188         uint16_t                preq_optype;
189         int                     preq_rv;
190
191         uint32_t                preq_setbacks;
192
193         /* Who is making the call?  Eventually host id is also needed. */
194         pid_t                   preq_pid;
195         lwpid_t                 preq_lid;
196
197         /*
198          * the following helper pads the struct size to md alignment
199          * multiple (should size_t not cut it).  it makes sure that
200          * whatever comes after this struct is aligned
201          */
202         size_t                  preq_buflen;
203         uint8_t preq_buf[0] __aligned(ALIGNBYTES+1);
204 };
205
206 #define PUFFS_SETBACK_INACT_N1  0x01    /* set VOP_INACTIVE for node 1 */
207 #define PUFFS_SETBACK_INACT_N2  0x02    /* set VOP_INACTIVE for node 2 */
208 #define PUFFS_SETBACK_NOREF_N1  0x04    /* set pn PN_NOREFS for node 1 */
209 #define PUFFS_SETBACK_NOREF_N2  0x08    /* set pn PN_NOREFS for node 2 */
210 #define PUFFS_SETBACK_MASK      0x0f
211
212 /*
213  * Flush operation.  This can be used to invalidate:
214  * 1) name cache for one node
215  * 2) name cache for all children
216  * 3) name cache for the entire mount
217  * 4) page cache for a set of ranges in one node
218  * 5) page cache for one entire node
219  *
220  * It can be used to flush:
221  * 1) page cache for a set of ranges in one node
222  * 2) page cache for one entire node
223  */
224
225 struct puffs_flush {
226         struct puffs_req        pf_req;
227
228         puffs_cookie_t          pf_cookie;
229
230         int                     pf_op;
231         off_t                   pf_start;
232         off_t                   pf_end;
233 };
234 #define PUFFS_INVAL_NAMECACHE_NODE              0
235 #define PUFFS_INVAL_NAMECACHE_DIR               1
236 #define PUFFS_INVAL_NAMECACHE_ALL               2
237 #define PUFFS_INVAL_PAGECACHE_NODE_RANGE        3
238 #define PUFFS_FLUSH_PAGECACHE_NODE_RANGE        4
239
240 /*
241  * Credentials for an operation.  Can be either struct uucred for
242  * ops called from a credential context or NOCRED/FSCRED for ops
243  * called from within the kernel.  It is up to the implementation
244  * if it makes a difference between these two and the super-user.
245  */
246 struct puffs_kcred {
247         struct xucred   pkcr_uuc;
248         uint8_t         pkcr_type;
249         uint8_t         pkcr_internal;
250 };
251 #define PUFFCRED_TYPE_UUC       1
252 #define PUFFCRED_TYPE_INTERNAL  2
253 #define PUFFCRED_CRED_NOCRED    1
254 #define PUFFCRED_CRED_FSCRED    2
255
256 /*
257  * 2*MAXPHYS is the max size the system will attempt to copy,
258  * else treated as garbage
259  */
260 #define PUFFS_MSG_MAXSIZE       2*MAXPHYS
261 #define PUFFS_MSGSTRUCT_MAX     4096 /* approximate */
262
263 #define PUFFS_EXTNAMELEN NAME_MAX /* currently same as EXTATTR_MAXNAMELEN */
264
265 #define PUFFS_TOMOVE(a,b) (MIN((a), b->pmp_msg_maxsize - PUFFS_MSGSTRUCT_MAX))
266
267 /* puffs struct componentname built by kernel */
268 struct puffs_kcn {
269         char pkcn_name[NAME_MAX + 1];   /* nulterminated path component */
270         size_t pkcn_namelen;            /* current component length     */
271 };
272
273
274 /*
275  * Next come the individual requests.  They are all subclassed from
276  * puffs_req and contain request-specific fields in addition.  Note
277  * that there are some requests which have to handle arbitrary-length
278  * buffers.
279  *
280  * The division is the following: puffs_req is to be touched only
281  * by generic routines while the other stuff is supposed to be
282  * modified only by specific routines.
283  */
284
285 /*
286  * aux structures for vfs operations.
287  */
288 struct puffs_vfsmsg_unmount {
289         struct puffs_req        pvfsr_pr;
290
291         int                     pvfsr_flags;
292 };
293
294 struct puffs_vfsmsg_statvfs {
295         struct puffs_req        pvfsr_pr;
296
297         struct statvfs          pvfsr_sb;
298 };
299
300 struct puffs_vfsmsg_sync {
301         struct puffs_req        pvfsr_pr;
302
303         int                     pvfsr_waitfor;
304 };
305
306 struct puffs_vfsmsg_fhtonode {
307         struct puffs_req        pvfsr_pr;
308
309         void                    *pvfsr_fhcookie;        /* IN   */
310         enum vtype              pvfsr_vtype;            /* IN   */
311         voff_t                  pvfsr_size;             /* IN   */
312         dev_t                   pvfsr_rdev;             /* IN   */
313
314         size_t                  pvfsr_dsize;            /* OUT */
315         uint8_t                 pvfsr_data[0]           /* OUT, XXX */
316                                     __aligned(ALIGNBYTES+1);
317 };
318
319 struct puffs_vfsmsg_nodetofh {
320         struct puffs_req        pvfsr_pr;
321
322         void                    *pvfsr_fhcookie;        /* OUT  */
323
324         size_t                  pvfsr_dsize;            /* OUT/IN  */
325         uint8_t                 pvfsr_data[0]           /* IN, XXX */
326                                     __aligned(ALIGNBYTES+1);
327 };
328
329 struct puffs_vfsmsg_suspend {
330         struct puffs_req        pvfsr_pr;
331
332         int                     pvfsr_status;
333 };
334 #define PUFFS_SUSPEND_START     0
335 #define PUFFS_SUSPEND_SUSPENDED 1
336 #define PUFFS_SUSPEND_RESUME    2
337 #define PUFFS_SUSPEND_ERROR     3
338
339 #define PUFFS_EXTATTRCTL_HASNODE        0x01
340 #define PUFFS_EXTATTRCTL_HASATTRNAME    0x02
341 struct puffs_vfsmsg_extattrctl {
342         struct puffs_req        pvfsr_pr;
343
344         int                     pvfsr_cmd;                        /* OUT */
345         int                     pvfsr_attrnamespace;              /* OUT */
346         int                     pvfsr_flags;                      /* OUT */
347         char                    pvfsr_attrname[PUFFS_EXTNAMELEN]; /* OUT */
348 };
349
350 /*
351  * aux structures for vnode operations.
352  */
353
354 struct puffs_vnmsg_lookup {
355         struct puffs_req        pvn_pr;
356
357         struct puffs_kcn        pvnr_cn;                /* OUT  */
358         struct puffs_kcred      pvnr_cn_cred;           /* OUT  */
359
360         puffs_cookie_t          pvnr_newnode;           /* IN   */
361         enum vtype              pvnr_vtype;             /* IN   */
362         voff_t                  pvnr_size;              /* IN   */
363         dev_t                   pvnr_rdev;              /* IN   */
364 };
365
366 struct puffs_vnmsg_lookupdotdot {
367         struct puffs_req        pvn_pr;
368
369         struct puffs_kcred      pvnr_cred;              /* OUT  */
370
371         puffs_cookie_t          pvnr_newnode;           /* IN   */
372 };
373
374 struct puffs_vnmsg_create {
375         struct puffs_req        pvn_pr;
376
377         struct puffs_kcn        pvnr_cn;                /* OUT  */
378         struct puffs_kcred      pvnr_cn_cred;           /* OUT  */
379
380         struct vattr            pvnr_va;                /* OUT  */
381         puffs_cookie_t          pvnr_newnode;           /* IN   */
382 };
383
384 struct puffs_vnmsg_mknod {
385         struct puffs_req        pvn_pr;
386
387         struct puffs_kcn        pvnr_cn;                /* OUT  */
388         struct puffs_kcred      pvnr_cn_cred;           /* OUT  */
389
390         struct vattr            pvnr_va;                /* OUT  */
391         puffs_cookie_t          pvnr_newnode;           /* IN   */
392 };
393
394 struct puffs_vnmsg_open {
395         struct puffs_req        pvn_pr;
396
397         struct puffs_kcred      pvnr_cred;              /* OUT  */
398         int                     pvnr_mode;              /* OUT  */
399 };
400
401 struct puffs_vnmsg_close {
402         struct puffs_req        pvn_pr;
403
404         int                     pvnr_fflag;             /* OUT  */
405 };
406
407 struct puffs_vnmsg_access {
408         struct puffs_req        pvn_pr;
409
410         struct puffs_kcred      pvnr_cred;              /* OUT  */
411         int                     pvnr_mode;              /* OUT  */
412 };
413
414 #define puffs_vnmsg_setattr puffs_vnmsg_setgetattr
415 #define puffs_vnmsg_getattr puffs_vnmsg_setgetattr
416 struct puffs_vnmsg_setgetattr {
417         struct puffs_req        pvn_pr;
418
419         struct puffs_kcred      pvnr_cred;              /* OUT  */
420         struct vattr            pvnr_va;                /* IN/OUT (op depend) */
421 };
422
423 #define puffs_vnmsg_read puffs_vnmsg_rw
424 #define puffs_vnmsg_write puffs_vnmsg_rw
425 struct puffs_vnmsg_rw {
426         struct puffs_req        pvn_pr;
427
428         struct puffs_kcred      pvnr_cred;              /* OUT    */
429         off_t                   pvnr_offset;            /* OUT    */
430         size_t                  pvnr_resid;             /* IN/OUT */
431         int                     pvnr_ioflag;            /* OUT    */
432
433         uint8_t                 pvnr_data[0];           /* IN/OUT (wr/rd) */
434 };
435
436 #define puffs_vnmsg_ioctl puffs_vnreq_fcnioctl
437 #define puffs_vnmsg_fcntl puffs_vnreq_fcnioctl
438 struct puffs_vnmsg_fcnioctl {
439         struct puffs_req        pvn_pr;
440
441         struct puffs_kcred      pvnr_cred;
442         u_long                  pvnr_command;
443         pid_t                   pvnr_pid;
444         int                     pvnr_fflag;
445
446         void                    *pvnr_data;
447         size_t                  pvnr_datalen;
448         int                     pvnr_copyback;
449 };
450
451 struct puffs_vnmsg_poll {
452         struct puffs_req        pvn_pr;
453
454         int                     pvnr_events;            /* IN/OUT */
455 };
456
457 struct puffs_vnmsg_fsync {
458         struct puffs_req        pvn_pr;
459
460         int                     pvnr_flags;             /* OUT  */
461 };
462
463 struct puffs_vnmsg_seek {
464         struct puffs_req        pvn_pr;
465
466         struct puffs_kcred      pvnr_cred;              /* OUT  */
467         off_t                   pvnr_oldoff;            /* OUT  */
468         off_t                   pvnr_newoff;            /* OUT  */
469 };
470
471 struct puffs_vnmsg_remove {
472         struct puffs_req        pvn_pr;
473
474         struct puffs_kcn        pvnr_cn;                /* OUT  */
475         struct puffs_kcred      pvnr_cn_cred;           /* OUT  */
476
477         puffs_cookie_t          pvnr_cookie_targ;       /* OUT  */
478 };
479
480 struct puffs_vnmsg_mkdir {
481         struct puffs_req        pvn_pr;
482
483         struct puffs_kcn        pvnr_cn;                /* OUT  */
484         struct puffs_kcred      pvnr_cn_cred;           /* OUT  */
485
486         struct vattr            pvnr_va;                /* OUT  */
487         puffs_cookie_t          pvnr_newnode;           /* IN   */
488 };
489
490 struct puffs_vnmsg_rmdir {
491         struct puffs_req        pvn_pr;
492
493         struct puffs_kcn        pvnr_cn;                /* OUT  */
494         struct puffs_kcred      pvnr_cn_cred;           /* OUT  */
495
496         puffs_cookie_t          pvnr_cookie_targ;       /* OUT  */
497 };
498
499 struct puffs_vnmsg_link {
500         struct puffs_req        pvn_pr;
501
502         struct puffs_kcn        pvnr_cn;                /* OUT  */
503         struct puffs_kcred      pvnr_cn_cred;           /* OUT  */
504
505         puffs_cookie_t          pvnr_cookie_targ;       /* OUT  */
506 };
507
508 struct puffs_vnmsg_rename {
509         struct puffs_req        pvn_pr;
510
511         struct puffs_kcn        pvnr_cn_src;            /* OUT  */
512         struct puffs_kcred      pvnr_cn_src_cred;       /* OUT  */
513         struct puffs_kcn        pvnr_cn_targ;           /* OUT  */
514         struct puffs_kcred      pvnr_cn_targ_cred;      /* OUT  */
515
516         puffs_cookie_t          pvnr_cookie_src;        /* OUT  */
517         puffs_cookie_t          pvnr_cookie_targ;       /* OUT  */
518         puffs_cookie_t          pvnr_cookie_targdir;    /* OUT  */
519 };
520
521 struct puffs_vnmsg_symlink {
522         struct puffs_req        pvn_pr;
523
524         struct puffs_kcn        pvnr_cn;                /* OUT  */
525         struct puffs_kcred      pvnr_cn_cred;           /* OUT  */
526
527         struct vattr            pvnr_va;                /* OUT  */
528         puffs_cookie_t          pvnr_newnode;           /* IN   */
529         char                    pvnr_link[MAXPATHLEN];  /* OUT  */
530 };
531
532 struct puffs_vnmsg_readdir {
533         struct puffs_req        pvn_pr;
534
535         struct puffs_kcred      pvnr_cred;              /* OUT    */
536         off_t                   pvnr_offset;            /* IN/OUT */
537         size_t                  pvnr_resid;             /* IN/OUT */
538         size_t                  pvnr_ncookies;          /* IN/OUT */
539         int                     pvnr_eofflag;           /* IN     */
540
541         size_t                  pvnr_dentoff;           /* OUT    */
542         uint8_t                 pvnr_data[0]            /* IN     */
543                                     __aligned(ALIGNBYTES+1);
544 };
545
546 struct puffs_vnmsg_readlink {
547         struct puffs_req        pvn_pr;
548
549         struct puffs_kcred      pvnr_cred;              /* OUT */
550         size_t                  pvnr_linklen;           /* IN  */
551         char                    pvnr_link[MAXPATHLEN];  /* IN  */
552 };
553
554 struct puffs_vnmsg_reclaim {
555         struct puffs_req        pvn_pr;
556 };
557
558 struct puffs_vnmsg_inactive {
559         struct puffs_req        pvn_pr;
560 };
561
562 struct puffs_vnmsg_print {
563         struct puffs_req        pvn_pr;
564
565         /* empty */
566 };
567
568 struct puffs_vnmsg_pathconf {
569         struct puffs_req        pvn_pr;
570
571         int                     pvnr_name;              /* OUT  */
572         register_t              pvnr_retval;            /* IN   */
573 };
574
575 struct puffs_vnmsg_advlock {
576         struct puffs_req        pvn_pr;
577
578         struct flock            pvnr_fl;                /* OUT  */
579         void                    *pvnr_id;               /* OUT  */
580         int                     pvnr_op;                /* OUT  */
581         int                     pvnr_flags;             /* OUT  */
582 };
583
584 struct puffs_vnmsg_mmap {
585         struct puffs_req        pvn_pr;
586
587         vm_prot_t               pvnr_prot;              /* OUT  */
588         struct puffs_kcred      pvnr_cred;              /* OUT  */
589 };
590
591 struct puffs_vnmsg_abortop {
592         struct puffs_req        pvn_pr;
593
594         struct puffs_kcn        pvnr_cn;                /* OUT  */
595         struct puffs_kcred      pvnr_cn_cred;           /* OUT  */
596 };
597
598 struct puffs_vnmsg_getextattr {
599         struct puffs_req        pvn_pr;
600
601         int                     pvnr_attrnamespace;             /* OUT    */
602         char                    pvnr_attrname[PUFFS_EXTNAMELEN];/* OUT    */
603
604         struct puffs_kcred      pvnr_cred;                      /* OUT    */
605         size_t                  pvnr_datasize;                  /* IN     */
606
607         size_t                  pvnr_resid;                     /* IN/OUT */
608         uint8_t                 pvnr_data[0]                    /* IN     */
609                                     __aligned(ALIGNBYTES+1);
610 };
611
612 struct puffs_vnmsg_setextattr {
613         struct puffs_req        pvn_pr;
614
615         int                     pvnr_attrnamespace;             /* OUT    */
616         char                    pvnr_attrname[PUFFS_EXTNAMELEN];/* OUT    */
617
618         struct puffs_kcred      pvnr_cred;                      /* OUT  */
619
620         size_t                  pvnr_resid;                     /* IN/OUT */
621         uint8_t                 pvnr_data[0]                    /* OUT    */
622                                     __aligned(ALIGNBYTES+1);
623 };
624
625 struct puffs_vnmsg_listextattr {
626         struct puffs_req        pvn_pr;
627
628         int                     pvnr_attrnamespace;             /* OUT    */
629
630         struct puffs_kcred      pvnr_cred;                      /* OUT  */
631         size_t                  pvnr_datasize;                  /* IN     */
632
633         size_t                  pvnr_resid;                     /* IN/OUT */
634         int                     pvnr_flag;                      /* OUT */
635         uint8_t                 pvnr_data[0]                    /* IN     */
636                                     __aligned(ALIGNBYTES+1);
637 };
638
639 struct puffs_vnmsg_deleteextattr {
640         struct puffs_req        pvn_pr;
641
642         int                     pvnr_attrnamespace;             /* OUT    */
643         char                    pvnr_attrname[PUFFS_EXTNAMELEN];/* OUT    */
644
645         struct puffs_kcred      pvnr_cred;                      /* OUT  */
646 };
647
648 /*
649  * For cache reports.  Everything is always out-out-out, no replies
650  */
651
652 struct puffs_cacherun {
653         off_t                   pcache_runstart;
654         off_t                   pcache_runend;
655 };
656
657 /* cache info.  old used for write now */
658 struct puffs_cacheinfo {
659         struct puffs_req        pcache_pr;
660
661         int                     pcache_type;
662         size_t                  pcache_nruns;
663         struct puffs_cacherun   pcache_runs[0];
664 };
665 #define PCACHE_TYPE_READ        0
666 #define PCACHE_TYPE_WRITE       1
667
668 /*
669  * Error notification.  Always outgoing, no response, no remorse.
670  */
671 struct puffs_error {
672         struct puffs_req        perr_pr;
673
674         int                     perr_error;
675         char                    perr_str[256];
676 };
677
678 #endif /* _FS_PUFFS_PUFFS_MSGIF_H_ */