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 64 enum 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 73 enum 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 */ 99 enum 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 */ 116 struct 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 155 static __inline void 156 statvfs_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 191 static __inline void 192 puffs_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 */ 233 typedef void *puffs_cookie_t; 234 typedef puffs_cookie_t puffs_croissant_t; 235 236 struct 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 291 struct 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 335 struct 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 */ 356 struct 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 */ 378 struct 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 */ 403 struct puffs_vfsmsg_unmount { 404 struct puffs_req pvfsr_pr; 405 406 int pvfsr_flags; 407 }; 408 409 struct puffs_vfsmsg_statvfs { 410 struct puffs_req pvfsr_pr; 411 412 struct puffs_statvfs pvfsr_sb; 413 }; 414 415 struct puffs_vfsmsg_sync { 416 struct puffs_req pvfsr_pr; 417 418 struct puffs_kcred pvfsr_cred; 419 int pvfsr_waitfor; 420 }; 421 422 struct 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 435 struct 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 445 struct 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 460 struct 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 473 struct 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 489 struct 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 502 struct 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 515 struct 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 523 struct puffs_vnmsg_close { 524 struct puffs_req pvn_pr; 525 526 struct puffs_kcred pvnr_cred; /* OUT */ 527 int pvnr_fflag; /* OUT */ 528 }; 529 530 struct 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 539 struct 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 550 struct 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 563 struct 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 576 struct puffs_vnmsg_poll { 577 struct puffs_req pvn_pr; 578 579 int pvnr_events; /* IN/OUT */ 580 }; 581 582 struct 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 591 struct 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 599 struct 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 608 struct 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 621 struct 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 630 struct 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 639 struct 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 652 struct 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 666 struct 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 680 struct 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 688 struct puffs_vnmsg_reclaim { 689 struct puffs_req pvn_pr; 690 691 int pvnr_nlookup; /* OUT */ 692 }; 693 694 struct puffs_vnmsg_inactive { 695 struct puffs_req pvn_pr; 696 }; 697 698 struct puffs_vnmsg_print { 699 struct puffs_req pvn_pr; 700 701 /* empty */ 702 }; 703 704 struct puffs_vnmsg_pathconf { 705 struct puffs_req pvn_pr; 706 707 int pvnr_name; /* OUT */ 708 __register_t pvnr_retval; /* IN */ 709 }; 710 711 struct 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 720 struct 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 727 struct 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 734 struct 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 748 struct 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 761 struct 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 775 struct 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 785 struct puffs_vnmsg_fallocate { 786 struct puffs_req pvn_pr; 787 off_t pvnr_off; /* OUT */ 788 off_t pvnr_len; /* OUT */ 789 }; 790 791 struct 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 801 struct puffs_cacherun { 802 off_t pcache_runstart; 803 off_t pcache_runend; 804 }; 805 806 /* cache info. old used for write now */ 807 struct 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 */ 820 struct 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_ */ 828