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