1 /* $NetBSD: puffs_msgif.h,v 1.76 2011/07/04 08:07:30 manu Exp $ */
4 * Copyright (c) 2005, 2006, 2007 Antti Kantee. All Rights Reserved.
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.
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
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.
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
32 #ifndef _FS_PUFFS_PUFFS_MSGIF_H_
33 #define _FS_PUFFS_PUFFS_MSGIF_H_
35 #include <sys/param.h>
37 #include <sys/ioccom.h>
38 #include <sys/mount.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>
48 #include <dev/misc/putter/putter.h>
50 #define _VFS_NAMELEN MFSNAMELEN
51 #define _VFS_MNAMELEN MNAMELEN
54 typedef off_t vsize_t;
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 */
64 #define PUFFSOPFLAG_FAF 0x10 /* fire-and-forget */
65 #define PUFFSOPFLAG_ISRESPONSE 0x20 /* req is actually a resp */
67 #define PUFFSOP_OPCMASK 0x07
68 #define PUFFSOP_OPCLASS(a) ((a) & PUFFSOP_OPCMASK)
69 #define PUFFSOP_WANTREPLY(a) (((a) & PUFFSOPFLAG_FAF) == 0)
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
78 #define PUFFS_VFS_MAX PUFFS_VFS_SUSPEND
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 */
100 #define PUFFS_VN_MAX PUFFS_VN_CLOSEEXTATTR
101 #define PUFFS_VN_SPARE 31
104 * These signal invalid parameters the file system returned.
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
112 #define PUFFS_ERR_MAX PUFFS_ERR_LISTEXTATTR
114 #define PUFFSVERSION 30
115 #define PUFFSNAMESIZE 32
117 #define PUFFS_TYPEPREFIX "puffs|"
119 #define PUFFS_TYPELEN (_VFS_NAMELEN - (sizeof(PUFFS_TYPEPREFIX)+1))
120 #define PUFFS_NAMELEN (_VFS_MNAMELEN-1)
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.
127 typedef void *puffs_cookie_t;
128 typedef puffs_cookie_t puffs_croissant_t;
131 unsigned int pa_vers;
142 uint8_t pa_vnopmask[PUFFS_VN_MAX + PUFFS_VN_SPARE];
144 char pa_typename[_VFS_NAMELEN];
145 char pa_mntfromname[_VFS_MNAMELEN];
147 puffs_cookie_t pa_root_cookie;
148 enum vtype pa_root_vtype;
149 voff_t pa_root_vsize;
155 struct statvfs pa_svfsb;
159 uint32_t pa_spare[127];
161 #define pa_root_rdev devunion.dev
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) */
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
179 #define PUFFS_FHSIZE_MAX 1020 /* FHANDLE_SIZE_MAX - 4 */
182 struct putter_hdr preq_pth;
185 puffs_cookie_t preq_cookie;
187 uint16_t preq_opclass;
188 uint16_t preq_optype;
191 uint32_t preq_setbacks;
193 /* Who is making the call? Eventually host id is also needed. */
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
203 uint8_t preq_buf[0] __aligned(ALIGNBYTES+1);
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
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
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
226 struct puffs_req pf_req;
228 puffs_cookie_t pf_cookie;
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
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.
247 struct xucred pkcr_uuc;
249 uint8_t pkcr_internal;
251 #define PUFFCRED_TYPE_UUC 1
252 #define PUFFCRED_TYPE_INTERNAL 2
253 #define PUFFCRED_CRED_NOCRED 1
254 #define PUFFCRED_CRED_FSCRED 2
257 * 2*MAXPHYS is the max size the system will attempt to copy,
258 * else treated as garbage
260 #define PUFFS_MSG_MAXSIZE 2*MAXPHYS
261 #define PUFFS_MSGSTRUCT_MAX 4096 /* approximate */
263 #define PUFFS_EXTNAMELEN NAME_MAX /* currently same as EXTATTR_MAXNAMELEN */
265 #define PUFFS_TOMOVE(a,b) (MIN((a), b->pmp_msg_maxsize - PUFFS_MSGSTRUCT_MAX))
267 /* puffs struct componentname built by kernel */
269 char pkcn_name[NAME_MAX + 1]; /* nulterminated path component */
270 size_t pkcn_namelen; /* current component length */
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
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.
286 * aux structures for vfs operations.
288 struct puffs_vfsmsg_unmount {
289 struct puffs_req pvfsr_pr;
294 struct puffs_vfsmsg_statvfs {
295 struct puffs_req pvfsr_pr;
297 struct statvfs pvfsr_sb;
300 struct puffs_vfsmsg_sync {
301 struct puffs_req pvfsr_pr;
306 struct puffs_vfsmsg_fhtonode {
307 struct puffs_req pvfsr_pr;
309 void *pvfsr_fhcookie; /* IN */
310 enum vtype pvfsr_vtype; /* IN */
311 voff_t pvfsr_size; /* IN */
312 dev_t pvfsr_rdev; /* IN */
314 size_t pvfsr_dsize; /* OUT */
315 uint8_t pvfsr_data[0] /* OUT, XXX */
316 __aligned(ALIGNBYTES+1);
319 struct puffs_vfsmsg_nodetofh {
320 struct puffs_req pvfsr_pr;
322 void *pvfsr_fhcookie; /* OUT */
324 size_t pvfsr_dsize; /* OUT/IN */
325 uint8_t pvfsr_data[0] /* IN, XXX */
326 __aligned(ALIGNBYTES+1);
329 struct puffs_vfsmsg_suspend {
330 struct puffs_req pvfsr_pr;
334 #define PUFFS_SUSPEND_START 0
335 #define PUFFS_SUSPEND_SUSPENDED 1
336 #define PUFFS_SUSPEND_RESUME 2
337 #define PUFFS_SUSPEND_ERROR 3
339 #define PUFFS_EXTATTRCTL_HASNODE 0x01
340 #define PUFFS_EXTATTRCTL_HASATTRNAME 0x02
341 struct puffs_vfsmsg_extattrctl {
342 struct puffs_req pvfsr_pr;
344 int pvfsr_cmd; /* OUT */
345 int pvfsr_attrnamespace; /* OUT */
346 int pvfsr_flags; /* OUT */
347 char pvfsr_attrname[PUFFS_EXTNAMELEN]; /* OUT */
351 * aux structures for vnode operations.
354 struct puffs_vnmsg_lookup {
355 struct puffs_req pvn_pr;
357 struct puffs_kcn pvnr_cn; /* OUT */
358 struct puffs_kcred pvnr_cn_cred; /* OUT */
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 */
366 struct puffs_vnmsg_lookupdotdot {
367 struct puffs_req pvn_pr;
369 struct puffs_kcred pvnr_cred; /* OUT */
371 puffs_cookie_t pvnr_newnode; /* IN */
374 struct puffs_vnmsg_create {
375 struct puffs_req pvn_pr;
377 struct puffs_kcn pvnr_cn; /* OUT */
378 struct puffs_kcred pvnr_cn_cred; /* OUT */
380 struct vattr pvnr_va; /* OUT */
381 puffs_cookie_t pvnr_newnode; /* IN */
384 struct puffs_vnmsg_mknod {
385 struct puffs_req pvn_pr;
387 struct puffs_kcn pvnr_cn; /* OUT */
388 struct puffs_kcred pvnr_cn_cred; /* OUT */
390 struct vattr pvnr_va; /* OUT */
391 puffs_cookie_t pvnr_newnode; /* IN */
394 struct puffs_vnmsg_open {
395 struct puffs_req pvn_pr;
397 struct puffs_kcred pvnr_cred; /* OUT */
398 int pvnr_mode; /* OUT */
401 struct puffs_vnmsg_close {
402 struct puffs_req pvn_pr;
404 int pvnr_fflag; /* OUT */
407 struct puffs_vnmsg_access {
408 struct puffs_req pvn_pr;
410 struct puffs_kcred pvnr_cred; /* OUT */
411 int pvnr_mode; /* OUT */
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;
419 struct puffs_kcred pvnr_cred; /* OUT */
420 struct vattr pvnr_va; /* IN/OUT (op depend) */
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;
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 */
433 uint8_t pvnr_data[0]; /* IN/OUT (wr/rd) */
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;
441 struct puffs_kcred pvnr_cred;
451 struct puffs_vnmsg_poll {
452 struct puffs_req pvn_pr;
454 int pvnr_events; /* IN/OUT */
457 struct puffs_vnmsg_fsync {
458 struct puffs_req pvn_pr;
460 int pvnr_flags; /* OUT */
463 struct puffs_vnmsg_seek {
464 struct puffs_req pvn_pr;
466 struct puffs_kcred pvnr_cred; /* OUT */
467 off_t pvnr_oldoff; /* OUT */
468 off_t pvnr_newoff; /* OUT */
471 struct puffs_vnmsg_remove {
472 struct puffs_req pvn_pr;
474 struct puffs_kcn pvnr_cn; /* OUT */
475 struct puffs_kcred pvnr_cn_cred; /* OUT */
477 puffs_cookie_t pvnr_cookie_targ; /* OUT */
480 struct puffs_vnmsg_mkdir {
481 struct puffs_req pvn_pr;
483 struct puffs_kcn pvnr_cn; /* OUT */
484 struct puffs_kcred pvnr_cn_cred; /* OUT */
486 struct vattr pvnr_va; /* OUT */
487 puffs_cookie_t pvnr_newnode; /* IN */
490 struct puffs_vnmsg_rmdir {
491 struct puffs_req pvn_pr;
493 struct puffs_kcn pvnr_cn; /* OUT */
494 struct puffs_kcred pvnr_cn_cred; /* OUT */
496 puffs_cookie_t pvnr_cookie_targ; /* OUT */
499 struct puffs_vnmsg_link {
500 struct puffs_req pvn_pr;
502 struct puffs_kcn pvnr_cn; /* OUT */
503 struct puffs_kcred pvnr_cn_cred; /* OUT */
505 puffs_cookie_t pvnr_cookie_targ; /* OUT */
508 struct puffs_vnmsg_rename {
509 struct puffs_req pvn_pr;
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 */
516 puffs_cookie_t pvnr_cookie_src; /* OUT */
517 puffs_cookie_t pvnr_cookie_targ; /* OUT */
518 puffs_cookie_t pvnr_cookie_targdir; /* OUT */
521 struct puffs_vnmsg_symlink {
522 struct puffs_req pvn_pr;
524 struct puffs_kcn pvnr_cn; /* OUT */
525 struct puffs_kcred pvnr_cn_cred; /* OUT */
527 struct vattr pvnr_va; /* OUT */
528 puffs_cookie_t pvnr_newnode; /* IN */
529 char pvnr_link[MAXPATHLEN]; /* OUT */
532 struct puffs_vnmsg_readdir {
533 struct puffs_req pvn_pr;
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 */
541 size_t pvnr_dentoff; /* OUT */
542 uint8_t pvnr_data[0] /* IN */
543 __aligned(ALIGNBYTES+1);
546 struct puffs_vnmsg_readlink {
547 struct puffs_req pvn_pr;
549 struct puffs_kcred pvnr_cred; /* OUT */
550 size_t pvnr_linklen; /* IN */
551 char pvnr_link[MAXPATHLEN]; /* IN */
554 struct puffs_vnmsg_reclaim {
555 struct puffs_req pvn_pr;
558 struct puffs_vnmsg_inactive {
559 struct puffs_req pvn_pr;
562 struct puffs_vnmsg_print {
563 struct puffs_req pvn_pr;
568 struct puffs_vnmsg_pathconf {
569 struct puffs_req pvn_pr;
571 int pvnr_name; /* OUT */
572 register_t pvnr_retval; /* IN */
575 struct puffs_vnmsg_advlock {
576 struct puffs_req pvn_pr;
578 struct flock pvnr_fl; /* OUT */
579 void *pvnr_id; /* OUT */
580 int pvnr_op; /* OUT */
581 int pvnr_flags; /* OUT */
584 struct puffs_vnmsg_mmap {
585 struct puffs_req pvn_pr;
587 vm_prot_t pvnr_prot; /* OUT */
588 struct puffs_kcred pvnr_cred; /* OUT */
591 struct puffs_vnmsg_abortop {
592 struct puffs_req pvn_pr;
594 struct puffs_kcn pvnr_cn; /* OUT */
595 struct puffs_kcred pvnr_cn_cred; /* OUT */
598 struct puffs_vnmsg_getextattr {
599 struct puffs_req pvn_pr;
601 int pvnr_attrnamespace; /* OUT */
602 char pvnr_attrname[PUFFS_EXTNAMELEN];/* OUT */
604 struct puffs_kcred pvnr_cred; /* OUT */
605 size_t pvnr_datasize; /* IN */
607 size_t pvnr_resid; /* IN/OUT */
608 uint8_t pvnr_data[0] /* IN */
609 __aligned(ALIGNBYTES+1);
612 struct puffs_vnmsg_setextattr {
613 struct puffs_req pvn_pr;
615 int pvnr_attrnamespace; /* OUT */
616 char pvnr_attrname[PUFFS_EXTNAMELEN];/* OUT */
618 struct puffs_kcred pvnr_cred; /* OUT */
620 size_t pvnr_resid; /* IN/OUT */
621 uint8_t pvnr_data[0] /* OUT */
622 __aligned(ALIGNBYTES+1);
625 struct puffs_vnmsg_listextattr {
626 struct puffs_req pvn_pr;
628 int pvnr_attrnamespace; /* OUT */
630 struct puffs_kcred pvnr_cred; /* OUT */
631 size_t pvnr_datasize; /* IN */
633 size_t pvnr_resid; /* IN/OUT */
634 int pvnr_flag; /* OUT */
635 uint8_t pvnr_data[0] /* IN */
636 __aligned(ALIGNBYTES+1);
639 struct puffs_vnmsg_deleteextattr {
640 struct puffs_req pvn_pr;
642 int pvnr_attrnamespace; /* OUT */
643 char pvnr_attrname[PUFFS_EXTNAMELEN];/* OUT */
645 struct puffs_kcred pvnr_cred; /* OUT */
649 * For cache reports. Everything is always out-out-out, no replies
652 struct puffs_cacherun {
653 off_t pcache_runstart;
657 /* cache info. old used for write now */
658 struct puffs_cacheinfo {
659 struct puffs_req pcache_pr;
663 struct puffs_cacherun pcache_runs[0];
665 #define PCACHE_TYPE_READ 0
666 #define PCACHE_TYPE_WRITE 1
669 * Error notification. Always outgoing, no response, no remorse.
672 struct puffs_req perr_pr;
678 #endif /* _FS_PUFFS_PUFFS_MSGIF_H_ */