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