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