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