1 /* $NetBSD: puffs_msgif.h,v 1.66 2009/01/12 18:48:35 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 56 #define PUFFSOPFLAG_FAF 0x10 /* fire-and-forget */ 57 #define PUFFSOPFLAG_ISRESPONSE 0x20 /* req is actually a resp */ 58 59 #define PUFFSOP_OPCMASK 0x07 60 #define PUFFSOP_OPCLASS(a) ((a) & PUFFSOP_OPCMASK) 61 #define PUFFSOP_WANTREPLY(a) (((a) & PUFFSOPFLAG_FAF) == 0) 62 63 /* XXX: we don't need everything */ 64 enum { 65 PUFFS_VFS_MOUNT, PUFFS_VFS_START, PUFFS_VFS_UNMOUNT, 66 PUFFS_VFS_ROOT, PUFFS_VFS_STATVFS, PUFFS_VFS_SYNC, 67 PUFFS_VFS_VGET, PUFFS_VFS_FHTOVP, PUFFS_VFS_VPTOFH, 68 PUFFS_VFS_INIT, PUFFS_VFS_DONE, PUFFS_VFS_SNAPSHOT, 69 PUFFS_VFS_EXTATTCTL, PUFFS_VFS_SUSPEND 70 }; 71 #define PUFFS_VFS_MAX PUFFS_VFS_EXTATTCTL 72 73 /* moreXXX: we don't need everything here either */ 74 enum { 75 PUFFS_VN_LOOKUP, PUFFS_VN_CREATE, PUFFS_VN_MKNOD, 76 PUFFS_VN_OPEN, PUFFS_VN_CLOSE, PUFFS_VN_ACCESS, 77 PUFFS_VN_GETATTR, PUFFS_VN_SETATTR, PUFFS_VN_READ, 78 PUFFS_VN_WRITE, PUFFS_VN_IOCTL, PUFFS_VN_FCNTL, 79 PUFFS_VN_POLL, PUFFS_VN_KQFILTER, PUFFS_VN_REVOKE, 80 PUFFS_VN_MMAP, PUFFS_VN_FSYNC, PUFFS_VN_SEEK, 81 PUFFS_VN_REMOVE, PUFFS_VN_LINK, PUFFS_VN_RENAME, 82 PUFFS_VN_MKDIR, PUFFS_VN_RMDIR, PUFFS_VN_SYMLINK, 83 PUFFS_VN_READDIR, PUFFS_VN_READLINK, PUFFS_VN_ABORTOP, 84 PUFFS_VN_INACTIVE, PUFFS_VN_RECLAIM, PUFFS_VN_LOCK, 85 PUFFS_VN_UNLOCK, PUFFS_VN_BMAP, PUFFS_VN_STRATEGY, 86 PUFFS_VN_PRINT, PUFFS_VN_ISLOCKED, PUFFS_VN_PATHCONF, 87 PUFFS_VN_ADVLOCK, PUFFS_VN_LEASE, PUFFS_VN_WHITEOUT, 88 PUFFS_VN_GETPAGES, PUFFS_VN_PUTPAGES, PUFFS_VN_GETEXTATTR, 89 PUFFS_VN_LISTEXTATTR, PUFFS_VN_OPENEXTATTR, PUFFS_VN_DELETEEXTATTR, 90 PUFFS_VN_SETEXTATTR 91 }; 92 #define PUFFS_VN_MAX PUFFS_VN_SETEXTATTR 93 94 /* 95 * These signal invalid parameters the file system returned. 96 */ 97 enum { 98 PUFFS_ERR_MAKENODE, PUFFS_ERR_LOOKUP, PUFFS_ERR_READDIR, 99 PUFFS_ERR_READLINK, PUFFS_ERR_READ, PUFFS_ERR_WRITE, 100 PUFFS_ERR_VPTOFH, PUFFS_ERR_ERROR 101 }; 102 #define PUFFS_ERR_MAX PUFFS_ERR_VPTOFH 103 104 #define PUFFSDEVELVERS 0x80000000 105 #define PUFFSVERSION 27 106 #define PUFFSNAMESIZE 32 107 108 #define PUFFS_TYPEPREFIX "puffs|" 109 110 #define PUFFS_TYPELEN (_VFS_NAMELEN - (sizeof(PUFFS_TYPEPREFIX)+1)) 111 #define PUFFS_NAMELEN (_VFS_MNAMELEN-1) 112 113 /* 114 * Just a weak typedef for code clarity. Additionally, we have a 115 * more appropriate vanity type for puffs: 116 * <uep> it should be croissant, not cookie. 117 */ 118 typedef void *puffs_cookie_t; 119 typedef puffs_cookie_t puffs_croissant_t; 120 121 struct puffs_kargs { 122 unsigned int pa_vers; 123 int pa_fd; 124 125 uint32_t pa_flags; 126 127 size_t pa_maxmsglen; 128 int pa_nhashbuckets; 129 130 size_t pa_fhsize; 131 int pa_fhflags; 132 133 puffs_cookie_t pa_root_cookie; 134 enum vtype pa_root_vtype; 135 voff_t pa_root_vsize; 136 dev_t pa_root_rdev; 137 138 struct statvfs pa_svfsb; 139 140 char pa_typename[_VFS_NAMELEN]; 141 char pa_mntfromname[_VFS_MNAMELEN]; 142 143 uint8_t pa_vnopmask[PUFFS_VN_MAX]; 144 }; 145 #define PUFFS_KFLAG_NOCACHE_NAME 0x01 /* don't use name cache */ 146 #define PUFFS_KFLAG_NOCACHE_PAGE 0x02 /* don't use page cache */ 147 #define PUFFS_KFLAG_NOCACHE 0x03 /* no cache whatsoever */ 148 #define PUFFS_KFLAG_ALLOPS 0x04 /* ignore pa_vnopmask */ 149 #define PUFFS_KFLAG_WTCACHE 0x08 /* write-through page cache */ 150 #define PUFFS_KFLAG_IAONDEMAND 0x10 /* inactive only on demand */ 151 #define PUFFS_KFLAG_LOOKUP_FULLPNBUF 0x20 /* full pnbuf in lookup */ 152 #define PUFFS_KFLAG_MASK 0x3f 153 154 #define PUFFS_FHFLAG_DYNAMIC 0x01 155 #define PUFFS_FHFLAG_NFSV2 0x02 156 #define PUFFS_FHFLAG_NFSV3 0x04 157 #define PUFFS_FHFLAG_PROTOMASK 0x06 158 #define PUFFS_FHFLAG_PASSTHROUGH 0x08 159 #define PUFFS_FHFLAG_MASK 0x0f 160 161 #define PUFFS_FHSIZE_MAX 1020 /* XXX: FHANDLE_SIZE_MAX - 4 */ 162 163 struct puffs_req { 164 struct putter_hdr preq_pth; 165 166 uint64_t preq_id; 167 puffs_cookie_t preq_cookie; 168 169 uint16_t preq_opclass; 170 uint16_t preq_optype; 171 int preq_rv; 172 173 uint32_t preq_setbacks; 174 175 /* Who is making the call? Eventually host id is also needed. */ 176 pid_t preq_pid; 177 lwpid_t preq_lid; 178 179 /* 180 * the following helper pads the struct size to md alignment 181 * multiple (should size_t not cut it). it makes sure that 182 * whatever comes after this struct is aligned 183 */ 184 size_t preq_buflen; 185 uint8_t preq_buf[0] __aligned(ALIGNBYTES+1); 186 }; 187 188 #define PUFFS_SETBACK_INACT_N1 0x01 /* set VOP_INACTIVE for node 1 */ 189 #define PUFFS_SETBACK_INACT_N2 0x02 /* set VOP_INACTIVE for node 2 */ 190 #define PUFFS_SETBACK_NOREF_N1 0x04 /* set pn PN_NOREFS for node 1 */ 191 #define PUFFS_SETBACK_NOREF_N2 0x08 /* set pn PN_NOREFS for node 2 */ 192 #define PUFFS_SETBACK_MASK 0x0f 193 194 /* 195 * Flush operation. This can be used to invalidate: 196 * 1) name cache for one node 197 * 2) name cache for all children 198 * 3) name cache for the entire mount 199 * 4) page cache for a set of ranges in one node 200 * 5) page cache for one entire node 201 * 202 * It can be used to flush: 203 * 1) page cache for a set of ranges in one node 204 * 2) page cache for one entire node 205 */ 206 207 /* XXX: needs restructuring */ 208 struct puffs_flush { 209 struct puffs_req pf_req; 210 211 puffs_cookie_t pf_cookie; 212 213 int pf_op; 214 off_t pf_start; 215 off_t pf_end; 216 }; 217 #define PUFFS_INVAL_NAMECACHE_NODE 0 218 #define PUFFS_INVAL_NAMECACHE_DIR 1 219 #define PUFFS_INVAL_NAMECACHE_ALL 2 220 #define PUFFS_INVAL_PAGECACHE_NODE_RANGE 3 221 #define PUFFS_FLUSH_PAGECACHE_NODE_RANGE 4 222 223 /* keep this for now */ 224 #define PUFFSREQSIZEOP _IOR ('p', 1, size_t) 225 226 /* 227 * Credentials for an operation. Can be either struct uucred for 228 * ops called from a credential context or NOCRED/FSCRED for ops 229 * called from within the kernel. It is up to the implementation 230 * if it makes a difference between these two and the super-user. 231 */ 232 struct puffs_kcred { 233 struct uucred pkcr_uuc; 234 uint8_t pkcr_type; 235 uint8_t pkcr_internal; 236 }; 237 #define PUFFCRED_TYPE_UUC 1 238 #define PUFFCRED_TYPE_INTERNAL 2 239 #define PUFFCRED_CRED_NOCRED 1 240 #define PUFFCRED_CRED_FSCRED 2 241 242 /* 243 * 2*MAXPHYS is the max size the system will attempt to copy, 244 * else treated as garbage 245 */ 246 #define PUFFS_MSG_MAXSIZE 2*MAXPHYS 247 #define PUFFS_MSGSTRUCT_MAX 4096 /* XXX: approxkludge */ 248 249 #define PUFFS_TOMOVE(a,b) (MIN((a), b->pmp_msg_maxsize - PUFFS_MSGSTRUCT_MAX)) 250 251 /* puffs struct componentname built by kernel */ 252 struct puffs_kcn { 253 /* args */ 254 uint32_t pkcn_nameiop; /* namei operation */ 255 uint32_t pkcn_flags; /* flags */ 256 257 char pkcn_name[MAXPATHLEN]; /* nulterminated path component */ 258 size_t pkcn_namelen; /* current component length */ 259 size_t pkcn_consume; /* IN: extra chars server ate */ 260 }; 261 262 263 /* 264 * Next come the individual requests. They are all subclassed from 265 * puffs_req and contain request-specific fields in addition. Note 266 * that there are some requests which have to handle arbitrary-length 267 * buffers. 268 * 269 * The division is the following: puffs_req is to be touched only 270 * by generic routines while the other stuff is supposed to be 271 * modified only by specific routines. 272 */ 273 274 /* 275 * aux structures for vfs operations. 276 */ 277 struct puffs_vfsmsg_unmount { 278 struct puffs_req pvfsr_pr; 279 280 int pvfsr_flags; 281 }; 282 283 struct puffs_vfsmsg_statvfs { 284 struct puffs_req pvfsr_pr; 285 286 struct statvfs pvfsr_sb; 287 }; 288 289 struct puffs_vfsmsg_sync { 290 struct puffs_req pvfsr_pr; 291 292 struct puffs_kcred pvfsr_cred; 293 int pvfsr_waitfor; 294 }; 295 296 struct puffs_vfsmsg_fhtonode { 297 struct puffs_req pvfsr_pr; 298 299 void *pvfsr_fhcookie; /* IN */ 300 enum vtype pvfsr_vtype; /* IN */ 301 voff_t pvfsr_size; /* IN */ 302 dev_t pvfsr_rdev; /* IN */ 303 304 size_t pvfsr_dsize; /* OUT */ 305 uint8_t pvfsr_data[0] /* OUT, XXX */ 306 __aligned(ALIGNBYTES+1); 307 }; 308 309 struct puffs_vfsmsg_nodetofh { 310 struct puffs_req pvfsr_pr; 311 312 void *pvfsr_fhcookie; /* OUT */ 313 314 size_t pvfsr_dsize; /* OUT/IN */ 315 uint8_t pvfsr_data[0] /* IN, XXX */ 316 __aligned(ALIGNBYTES+1); 317 }; 318 319 struct puffs_vfsmsg_suspend { 320 struct puffs_req pvfsr_pr; 321 322 int pvfsr_status; 323 }; 324 #define PUFFS_SUSPEND_START 0 325 #define PUFFS_SUSPEND_SUSPENDED 1 326 #define PUFFS_SUSPEND_RESUME 2 327 #define PUFFS_SUSPEND_ERROR 3 328 329 /* 330 * aux structures for vnode operations. 331 */ 332 333 struct puffs_vnmsg_lookup { 334 struct puffs_req pvn_pr; 335 336 struct puffs_kcn pvnr_cn; /* OUT */ 337 struct puffs_kcred pvnr_cn_cred; /* OUT */ 338 339 puffs_cookie_t pvnr_newnode; /* IN */ 340 enum vtype pvnr_vtype; /* IN */ 341 voff_t pvnr_size; /* IN */ 342 dev_t pvnr_rdev; /* IN */ 343 }; 344 345 struct puffs_vnmsg_create { 346 struct puffs_req pvn_pr; 347 348 struct puffs_kcn pvnr_cn; /* OUT */ 349 struct puffs_kcred pvnr_cn_cred; /* OUT */ 350 351 struct vattr pvnr_va; /* OUT */ 352 puffs_cookie_t pvnr_newnode; /* IN */ 353 }; 354 355 struct puffs_vnmsg_mknod { 356 struct puffs_req pvn_pr; 357 358 struct puffs_kcn pvnr_cn; /* OUT */ 359 struct puffs_kcred pvnr_cn_cred; /* OUT */ 360 361 struct vattr pvnr_va; /* OUT */ 362 puffs_cookie_t pvnr_newnode; /* IN */ 363 }; 364 365 struct puffs_vnmsg_open { 366 struct puffs_req pvn_pr; 367 368 struct puffs_kcred pvnr_cred; /* OUT */ 369 int pvnr_mode; /* OUT */ 370 }; 371 372 struct puffs_vnmsg_close { 373 struct puffs_req pvn_pr; 374 375 struct puffs_kcred pvnr_cred; /* OUT */ 376 int pvnr_fflag; /* OUT */ 377 }; 378 379 struct puffs_vnmsg_access { 380 struct puffs_req pvn_pr; 381 382 struct puffs_kcred pvnr_cred; /* OUT */ 383 int pvnr_mode; /* OUT */ 384 }; 385 386 #define puffs_vnmsg_setattr puffs_vnmsg_setgetattr 387 #define puffs_vnmsg_getattr puffs_vnmsg_setgetattr 388 struct puffs_vnmsg_setgetattr { 389 struct puffs_req pvn_pr; 390 391 struct puffs_kcred pvnr_cred; /* OUT */ 392 struct vattr pvnr_va; /* IN/OUT (op depend) */ 393 }; 394 395 #define puffs_vnmsg_read puffs_vnmsg_rw 396 #define puffs_vnmsg_write puffs_vnmsg_rw 397 struct puffs_vnmsg_rw { 398 struct puffs_req pvn_pr; 399 400 struct puffs_kcred pvnr_cred; /* OUT */ 401 off_t pvnr_offset; /* OUT */ 402 size_t pvnr_resid; /* IN/OUT */ 403 int pvnr_ioflag; /* OUT */ 404 405 uint8_t pvnr_data[0]; /* IN/OUT (wr/rd) */ 406 }; 407 408 #define puffs_vnmsg_ioctl puffs_vnreq_fcnioctl 409 #define puffs_vnmsg_fcntl puffs_vnreq_fcnioctl 410 struct puffs_vnmsg_fcnioctl { 411 struct puffs_req pvn_pr; 412 413 struct puffs_kcred pvnr_cred; 414 u_long pvnr_command; 415 pid_t pvnr_pid; 416 int pvnr_fflag; 417 418 void *pvnr_data; 419 size_t pvnr_datalen; 420 int pvnr_copyback; 421 }; 422 423 struct puffs_vnmsg_poll { 424 struct puffs_req pvn_pr; 425 426 int pvnr_events; /* IN/OUT */ 427 }; 428 429 struct puffs_vnmsg_fsync { 430 struct puffs_req pvn_pr; 431 432 struct puffs_kcred pvnr_cred; /* OUT */ 433 off_t pvnr_offlo; /* OUT */ 434 off_t pvnr_offhi; /* OUT */ 435 int pvnr_flags; /* OUT */ 436 }; 437 438 struct puffs_vnmsg_seek { 439 struct puffs_req pvn_pr; 440 441 struct puffs_kcred pvnr_cred; /* OUT */ 442 off_t pvnr_oldoff; /* OUT */ 443 off_t pvnr_newoff; /* OUT */ 444 }; 445 446 struct puffs_vnmsg_remove { 447 struct puffs_req pvn_pr; 448 449 struct puffs_kcn pvnr_cn; /* OUT */ 450 struct puffs_kcred pvnr_cn_cred; /* OUT */ 451 452 puffs_cookie_t pvnr_cookie_targ; /* OUT */ 453 }; 454 455 struct puffs_vnmsg_mkdir { 456 struct puffs_req pvn_pr; 457 458 struct puffs_kcn pvnr_cn; /* OUT */ 459 struct puffs_kcred pvnr_cn_cred; /* OUT */ 460 461 struct vattr pvnr_va; /* OUT */ 462 puffs_cookie_t pvnr_newnode; /* IN */ 463 }; 464 465 struct puffs_vnmsg_rmdir { 466 struct puffs_req pvn_pr; 467 468 struct puffs_kcn pvnr_cn; /* OUT */ 469 struct puffs_kcred pvnr_cn_cred; /* OUT */ 470 471 puffs_cookie_t pvnr_cookie_targ; /* OUT */ 472 }; 473 474 struct puffs_vnmsg_link { 475 struct puffs_req pvn_pr; 476 477 struct puffs_kcn pvnr_cn; /* OUT */ 478 struct puffs_kcred pvnr_cn_cred; /* OUT */ 479 480 puffs_cookie_t pvnr_cookie_targ; /* OUT */ 481 }; 482 483 struct puffs_vnmsg_rename { 484 struct puffs_req pvn_pr; 485 486 struct puffs_kcn pvnr_cn_src; /* OUT */ 487 struct puffs_kcred pvnr_cn_src_cred; /* OUT */ 488 struct puffs_kcn pvnr_cn_targ; /* OUT */ 489 struct puffs_kcred pvnr_cn_targ_cred; /* OUT */ 490 491 puffs_cookie_t pvnr_cookie_src; /* OUT */ 492 puffs_cookie_t pvnr_cookie_targ; /* OUT */ 493 puffs_cookie_t pvnr_cookie_targdir; /* OUT */ 494 }; 495 496 struct puffs_vnmsg_symlink { 497 struct puffs_req pvn_pr; 498 499 struct puffs_kcn pvnr_cn; /* OUT */ 500 struct puffs_kcred pvnr_cn_cred; /* OUT */ 501 502 struct vattr pvnr_va; /* OUT */ 503 puffs_cookie_t pvnr_newnode; /* IN */ 504 char pvnr_link[MAXPATHLEN]; /* OUT */ 505 }; 506 507 struct puffs_vnmsg_readdir { 508 struct puffs_req pvn_pr; 509 510 struct puffs_kcred pvnr_cred; /* OUT */ 511 off_t pvnr_offset; /* IN/OUT */ 512 size_t pvnr_resid; /* IN/OUT */ 513 size_t pvnr_ncookies; /* IN/OUT */ 514 int pvnr_eofflag; /* IN */ 515 516 size_t pvnr_dentoff; /* OUT */ 517 uint8_t pvnr_data[0] /* IN */ 518 __aligned(ALIGNBYTES+1); 519 }; 520 521 struct puffs_vnmsg_readlink { 522 struct puffs_req pvn_pr; 523 524 struct puffs_kcred pvnr_cred; /* OUT */ 525 size_t pvnr_linklen; /* IN */ 526 char pvnr_link[MAXPATHLEN]; /* IN, XXX */ 527 }; 528 529 struct puffs_vnmsg_reclaim { 530 struct puffs_req pvn_pr; 531 }; 532 533 struct puffs_vnmsg_inactive { 534 struct puffs_req pvn_pr; 535 }; 536 537 struct puffs_vnmsg_print { 538 struct puffs_req pvn_pr; 539 540 /* empty */ 541 }; 542 543 struct puffs_vnmsg_pathconf { 544 struct puffs_req pvn_pr; 545 546 int pvnr_name; /* OUT */ 547 int pvnr_retval; /* IN */ 548 }; 549 550 struct puffs_vnmsg_advlock { 551 struct puffs_req pvn_pr; 552 553 struct flock pvnr_fl; /* OUT */ 554 void *pvnr_id; /* OUT */ 555 int pvnr_op; /* OUT */ 556 int pvnr_flags; /* OUT */ 557 }; 558 559 struct puffs_vnmsg_mmap { 560 struct puffs_req pvn_pr; 561 562 vm_prot_t pvnr_prot; /* OUT */ 563 struct puffs_kcred pvnr_cred; /* OUT */ 564 }; 565 566 567 /* 568 * For cache reports. Everything is always out-out-out, no replies 569 */ 570 571 struct puffs_cacherun { 572 off_t pcache_runstart; 573 off_t pcache_runend; 574 }; 575 576 /* cache info. old used for write now */ 577 struct puffs_cacheinfo { 578 struct puffs_req pcache_pr; 579 580 int pcache_type; 581 size_t pcache_nruns; 582 struct puffs_cacherun pcache_runs[0]; 583 }; 584 #define PCACHE_TYPE_READ 0 585 #define PCACHE_TYPE_WRITE 1 586 587 /* 588 * Error notification. Always outgoing, no response, no remorse. 589 */ 590 struct puffs_error { 591 struct puffs_req perr_pr; 592 593 int perr_error; 594 char perr_str[256]; 595 }; 596 597 #endif /* _FS_PUFFS_PUFFS_MSGIF_H_ */ 598