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