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