1 /* $NetBSD: coda.h,v 1.20 2018/04/19 21:50:07 christos Exp $ */ 2 3 /* 4 5 Coda: an Experimental Distributed File System 6 Release 4.0 7 8 Copyright (c) 1987-1999 Carnegie Mellon University 9 All Rights Reserved 10 11 Permission to use, copy, modify and distribute this software and its 12 documentation is hereby granted, provided that both the copyright 13 notice and this permission notice appear in all copies of the 14 software, derivative works or modified versions, and any portions 15 thereof, and that both notices appear in supporting documentation, and 16 that credit is given to Carnegie Mellon University in all documents 17 and publicity pertaining to direct or indirect use of this code or its 18 derivatives. 19 20 CODA IS AN EXPERIMENTAL SOFTWARE SYSTEM AND IS KNOWN TO HAVE BUGS, 21 SOME OF WHICH MAY HAVE SERIOUS CONSEQUENCES. CARNEGIE MELLON ALLOWS 22 FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION. CARNEGIE MELLON 23 DISCLAIMS ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER 24 RESULTING DIRECTLY OR INDIRECTLY FROM THE USE OF THIS SOFTWARE OR OF 25 ANY DERIVATIVE WORK. 26 27 Carnegie Mellon encourages users of this software to return any 28 improvements or extensions that they make, and to grant Carnegie 29 Mellon the rights to redistribute these changes without encumbrance. 30 */ 31 32 /* 33 * 34 * Based on cfs.h from Mach, but revamped for increased simplicity. 35 * Linux modifications by 36 * Peter Braam, Aug 1996 37 */ 38 39 #ifndef _CODA_HEADER_ 40 #define _CODA_HEADER_ 41 42 #if defined(__NetBSD__) 43 #include <sys/ioccom.h> 44 #if defined(_KERNEL_OPT) 45 /* pull in optional CODA_COMPAT_5 flag and NVCODA. */ 46 #include "opt_coda_compat.h" 47 #include <vcoda.h> 48 #else 49 #define NVCODA 4 50 #endif 51 #endif 52 53 /* Catch new _KERNEL defn for NetBSD and DJGPP/__CYGWIN32__ */ 54 #if defined(__NetBSD__) || \ 55 ((defined(DJGPP) || defined(__CYGWIN32__)) && !defined(KERNEL)) 56 #include <sys/types.h> 57 #include <sys/systm.h> 58 #endif 59 60 #ifndef CODA_MAXSYMLINKS 61 #define CODA_MAXSYMLINKS 10 62 #endif 63 64 #if defined(DJGPP) || defined(__CYGWIN32__) 65 #ifdef KERNEL 66 typedef unsigned long u_long; 67 typedef unsigned int u_int; 68 typedef unsigned short u_short; 69 typedef u_long ino_t; 70 typedef u_long dev_t; 71 typedef void *void *; 72 #ifdef DOS 73 typedef unsigned __int64 u_quad_t; 74 #else 75 typedef unsigned long long u_quad_t; 76 #endif 77 78 #define inline 79 80 struct timespec { 81 long ts_sec; 82 long ts_nsec; 83 }; 84 #else /* DJGPP but not KERNEL */ 85 #include <sys/time.h> 86 typedef unsigned long long u_quad_t; 87 #endif /* !KERNEL */ 88 #endif /* !DJGPP */ 89 90 91 #if defined(__linux__) 92 #define cdev_t u_quad_t 93 #ifndef __KERNEL__ 94 #if !defined(_UQUAD_T_) && (!defined(__GLIBC__) || __GLIBC__ < 2) 95 #define _UQUAD_T_ 1 96 typedef unsigned long long u_quad_t; 97 #endif 98 #else /*__KERNEL__ */ 99 typedef unsigned long long u_quad_t; 100 #endif /* __KERNEL__ */ 101 #else 102 #define cdev_t dev_t 103 #endif 104 105 /* Solaris Definitions */ 106 #if defined(sun) 107 #include <sys/types.h> 108 #include <sys/time.h> 109 typedef unsigned long long u_quad_t; 110 #undef __BIT_TYPES_DEFINED__ 111 #endif 112 113 /* Mac OS X / Darwin */ 114 #if defined(__APPLE__) && defined(__MACH__) 115 #define __BIT_TYPES_DEFINED__ 116 #endif 117 118 #ifndef __BIT_TYPES_DEFINED__ 119 #define __BIT_TYPES_DEFINED__ 120 typedef signed char int8_t; 121 typedef unsigned char u_int8_t; 122 typedef short int16_t; 123 typedef unsigned short u_int16_t; 124 typedef int int32_t; 125 typedef unsigned int u_int32_t; 126 #endif 127 128 129 /* 130 * Cfs constants 131 */ 132 #define CODA_MAXNAMLEN 255 133 #define CODA_MAXPATHLEN 1024 134 #define CODA_MAXSYMLINK 10 135 136 /* these are Coda's version of O_RDONLY etc combinations 137 * to deal with VFS open modes 138 */ 139 #define C_O_READ 0x001 140 #define C_O_WRITE 0x002 141 #define C_O_TRUNC 0x010 142 #define C_O_EXCL 0x100 143 #define C_O_CREAT 0x200 144 145 /* these are to find mode bits in Venus */ 146 #define C_M_READ 00400 147 #define C_M_WRITE 00200 148 149 /* for access Venus will use */ 150 #define C_A_C_OK 8 /* Test for writing upon create. */ 151 #define C_A_R_OK 4 /* Test for read permission. */ 152 #define C_A_W_OK 2 /* Test for write permission. */ 153 #define C_A_X_OK 1 /* Test for execute permission. */ 154 #define C_A_F_OK 0 /* Test for existence. */ 155 156 #if defined(sun) 157 #define _VENUS_DIRENT_T_ 1 158 struct venus_dirent { 159 unsigned long d_fileno; /* file number of entry */ 160 unsigned short d_reclen; /* length of this record */ 161 unsigned short d_namlen; /* length of string in d_name */ 162 char d_name[CODA_MAXNAMLEN + 1];/* name must be no longer than this */ 163 }; 164 #undef DIRSIZ 165 #define DIRSIZ(dp) ((sizeof (struct venus_dirent) - (CODA_MAXNAMLEN+1)) + \ 166 (((dp)->d_namlen+1 + 3) &~ 3)) 167 #endif 168 169 #ifndef _VENUS_DIRENT_T_ 170 #define _VENUS_DIRENT_T_ 1 171 struct venus_dirent { 172 unsigned long d_fileno; /* file number of entry */ 173 unsigned short d_reclen; /* length of this record */ 174 unsigned char d_type; /* file type, see below */ 175 unsigned char d_namlen; /* length of string in d_name */ 176 char d_name[CODA_MAXNAMLEN + 1];/* name must be no longer than this */ 177 }; 178 #undef DIRSIZ 179 #define DIRSIZ(dp) ((sizeof (struct venus_dirent) - (CODA_MAXNAMLEN+1)) + \ 180 (((dp)->d_namlen+1 + 3) &~ 3)) 181 182 /* 183 * File types 184 */ 185 #define CDT_UNKNOWN 0 186 #define CDT_FIFO 1 187 #define CDT_CHR 2 188 #define CDT_DIR 4 189 #define CDT_BLK 6 190 #define CDT_REG 8 191 #define CDT_LNK 10 192 #define CDT_SOCK 12 193 #define CDT_WHT 14 194 195 /* 196 * Convert between stat structure types and directory types. 197 */ 198 #define IFTOCDT(mode) (((mode) & 0170000) >> 12) 199 #define CDTTOIF(dirtype) ((dirtype) << 12) 200 201 #endif 202 203 #ifdef CODA_COMPAT_5 204 205 typedef struct { 206 u_long Volume; 207 u_long Vnode; 208 u_long Unique; 209 } CodaFid; 210 211 static __inline ino_t coda_f2i(CodaFid *fid) 212 { 213 if (!fid) return 0; 214 return (fid->Unique + (fid->Vnode<<10) + (fid->Volume<<20)); 215 } 216 217 static __inline char * coda_f2s(CodaFid *fid) 218 { 219 static char fid_str [35]; 220 snprintf (fid_str, 35, "[%lx.%lx.%lx]", fid->Volume, 221 fid->Vnode, fid->Unique); 222 return fid_str; 223 } 224 225 static __inline int coda_fid_eq (CodaFid *fid1, CodaFid *fid2) 226 { 227 return (fid1->Volume == fid2->Volume && 228 fid1->Vnode == fid2->Vnode && 229 fid1->Unique == fid2->Unique); 230 } 231 232 struct coda_cred { 233 u_int32_t cr_uid, cr_euid, cr_suid, cr_fsuid; /* Real, efftve, set, fs uid*/ 234 u_int32_t cr_groupid, cr_egid, cr_sgid, cr_fsgid; /* same for groups */ 235 }; 236 237 #else 238 239 typedef struct { 240 u_int32_t opaque[4]; 241 } CodaFid; 242 243 244 static __inline ino_t coda_f2i(CodaFid *fid) 245 { 246 if (!fid) return 0; 247 return (fid->opaque[1] + (fid->opaque[2]<<10) + (fid->opaque[3]<<20)); 248 } 249 250 static __inline char * coda_f2s(CodaFid *fid) 251 { 252 static char fid_str [35]; 253 snprintf (fid_str, 35, "[%x.%x.%x.%x]", fid->opaque[0], 254 fid->opaque[1], fid->opaque[2], fid->opaque[3]); 255 return fid_str; 256 } 257 258 static __inline int coda_fid_eq (CodaFid *fid1, CodaFid *fid2) 259 { 260 return (fid1->opaque[0] == fid2->opaque[0] && 261 fid1->opaque[1] == fid2->opaque[1] && 262 fid1->opaque[2] == fid2->opaque[2] && 263 fid1->opaque[3] == fid2->opaque[3]); 264 } 265 266 #endif 267 268 #ifndef _VENUS_VATTR_T_ 269 #define _VENUS_VATTR_T_ 270 /* 271 * Vnode types. VNON means no type. 272 */ 273 enum coda_vtype { C_VNON, C_VREG, C_VDIR, C_VBLK, C_VCHR, C_VLNK, C_VSOCK, C_VFIFO, C_VBAD }; 274 275 struct coda_vattr { 276 long va_type; /* vnode type (for create) */ 277 u_short va_mode; /* files access mode and type */ 278 short va_nlink; /* number of references to file */ 279 uid_t va_uid; /* owner user id */ 280 gid_t va_gid; /* owner group id */ 281 u_long va_fileid; /* file id */ 282 u_quad_t va_size; /* file size in bytes */ 283 long va_blocksize; /* blocksize preferred for i/o */ 284 struct timespec va_atime; /* time of last access */ 285 struct timespec va_mtime; /* time of last modification */ 286 struct timespec va_ctime; /* time file changed */ 287 u_long va_gen; /* generation number of file */ 288 u_long va_flags; /* flags defined for file */ 289 cdev_t va_rdev; /* device special file represents */ 290 u_quad_t va_bytes; /* bytes of disk space held by file */ 291 u_quad_t va_filerev; /* file modification number */ 292 }; 293 294 #endif 295 296 /* structure used by CODA_STATFS for getting cache information from venus */ 297 struct coda_statfs { 298 int32_t f_blocks; 299 int32_t f_bfree; 300 int32_t f_bavail; 301 int32_t f_files; 302 int32_t f_ffree; 303 }; 304 305 /* 306 * Kernel <--> Venus communications. 307 */ 308 309 #define CODA_ROOT 2 310 #define CODA_OPEN_BY_FD 3 311 #define CODA_OPEN 4 312 #define CODA_CLOSE 5 313 #define CODA_IOCTL 6 314 #define CODA_GETATTR 7 315 #define CODA_SETATTR 8 316 #define CODA_ACCESS 9 317 #define CODA_LOOKUP 10 318 #define CODA_CREATE 11 319 #define CODA_REMOVE 12 320 #define CODA_LINK 13 321 #define CODA_RENAME 14 322 #define CODA_MKDIR 15 323 #define CODA_RMDIR 16 324 #define CODA_READDIR 17 325 #define CODA_SYMLINK 18 326 #define CODA_READLINK 19 327 #define CODA_FSYNC 20 328 #define CODA_INACTIVE 21 329 #define CODA_VGET 22 330 #define CODA_SIGNAL 23 331 #define CODA_REPLACE 24 /* DOWNCALL */ 332 #define CODA_FLUSH 25 /* DOWNCALL */ 333 #define CODA_PURGEUSER 26 /* DOWNCALL */ 334 #define CODA_ZAPFILE 27 /* DOWNCALL */ 335 #define CODA_ZAPDIR 28 /* DOWNCALL */ 336 #define CODA_PURGEFID 30 /* DOWNCALL */ 337 #define CODA_OPEN_BY_PATH 31 338 #define CODA_RESOLVE 32 339 #define CODA_REINTEGRATE 33 340 #define CODA_STATFS 34 341 #define CODA_NCALLS 35 342 343 #define DOWNCALL(opcode) (opcode >= CODA_REPLACE && opcode <= CODA_PURGEFID) 344 345 #define VC_MAXDATASIZE 8192 346 #define VC_MAXMSGSIZE sizeof(union inputArgs)+sizeof(union outputArgs) +\ 347 VC_MAXDATASIZE 348 349 #define CIOC_KERNEL_VERSION _IOWR('c', 10, sizeof (int)) 350 351 #if 0 352 #define CODA_KERNEL_VERSION 0 /* don't care about kernel version number */ 353 #define CODA_KERNEL_VERSION 1 /* The old venus 4.6 compatible interface */ 354 #endif 355 #ifdef CODA_COMPAT_5 356 #define CODA_KERNEL_VERSION 2 /* venus_lookup gets an extra parameter */ 357 #else 358 #define CODA_KERNEL_VERSION 3 /* 128-bit fids for realms */ 359 #endif 360 361 /* 362 * Venus <-> Coda RPC arguments 363 */ 364 #ifdef CODA_COMPAT_5 365 struct coda_in_hdr { 366 unsigned long opcode; 367 unsigned long unique; /* Keep multiple outstanding msgs distinct */ 368 u_short pid; /* Common to all */ 369 u_short pgid; /* Common to all */ 370 u_short sid; /* Common to all */ 371 struct coda_cred cred; /* Common to all */ 372 }; 373 #else 374 struct coda_in_hdr { 375 u_int32_t opcode; 376 u_int32_t unique; /* Keep multiple outstanding msgs distinct */ 377 pid_t pid; /* Common to all */ 378 pid_t pgid; /* Common to all */ 379 uid_t uid; /* Common to all */ 380 }; 381 #endif 382 383 /* Really important that opcode and unique are 1st two fields! */ 384 struct coda_out_hdr { 385 u_int32_t opcode; 386 u_int32_t unique; 387 u_int32_t result; 388 }; 389 390 /* coda_root: NO_IN */ 391 struct coda_root_out { 392 struct coda_out_hdr oh; 393 CodaFid Fid; 394 }; 395 396 struct coda_root_in { 397 struct coda_in_hdr in; 398 }; 399 400 /* coda_open: */ 401 struct coda_open_in { 402 struct coda_in_hdr ih; 403 CodaFid Fid; 404 int flags; 405 }; 406 407 struct coda_open_out { 408 struct coda_out_hdr oh; 409 cdev_t dev; 410 ino_t inode; /* host inode of container file */ 411 }; 412 413 414 /* coda_close: */ 415 struct coda_close_in { 416 struct coda_in_hdr ih; 417 CodaFid Fid; 418 int flags; 419 }; 420 421 struct coda_close_out { 422 struct coda_out_hdr out; 423 }; 424 425 /* coda_ioctl: */ 426 struct coda_ioctl_in { 427 struct coda_in_hdr ih; 428 CodaFid Fid; 429 int cmd; 430 int len; 431 int rwflag; 432 char *data; /* Place holder for data. */ 433 }; 434 435 struct coda_ioctl_out { 436 struct coda_out_hdr oh; 437 int len; 438 void * data; /* Place holder for data. */ 439 }; 440 441 442 /* coda_getattr: */ 443 struct coda_getattr_in { 444 struct coda_in_hdr ih; 445 CodaFid Fid; 446 }; 447 448 struct coda_getattr_out { 449 struct coda_out_hdr oh; 450 struct coda_vattr attr; 451 }; 452 453 454 /* coda_setattr: NO_OUT */ 455 struct coda_setattr_in { 456 struct coda_in_hdr ih; 457 CodaFid Fid; 458 struct coda_vattr attr; 459 }; 460 461 struct coda_setattr_out { 462 struct coda_out_hdr out; 463 }; 464 465 /* coda_access: NO_OUT */ 466 struct coda_access_in { 467 struct coda_in_hdr ih; 468 CodaFid Fid; 469 int flags; 470 }; 471 472 struct coda_access_out { 473 struct coda_out_hdr out; 474 }; 475 476 477 /* lookup flags */ 478 #define CLU_CASE_SENSITIVE 0x01 479 #define CLU_CASE_INSENSITIVE 0x02 480 481 /* coda_lookup: */ 482 struct coda_lookup_in { 483 struct coda_in_hdr ih; 484 CodaFid Fid; 485 int name; /* Place holder for data. */ 486 int flags; 487 }; 488 489 struct coda_lookup_out { 490 struct coda_out_hdr oh; 491 CodaFid Fid; 492 int vtype; 493 }; 494 495 496 /* coda_create: */ 497 struct coda_create_in { 498 struct coda_in_hdr ih; 499 CodaFid Fid; 500 struct coda_vattr attr; 501 int excl; 502 int mode; 503 int name; /* Place holder for data. */ 504 }; 505 506 struct coda_create_out { 507 struct coda_out_hdr oh; 508 CodaFid Fid; 509 struct coda_vattr attr; 510 }; 511 512 513 /* coda_remove: NO_OUT */ 514 struct coda_remove_in { 515 struct coda_in_hdr ih; 516 CodaFid Fid; 517 int name; /* Place holder for data. */ 518 }; 519 520 struct coda_remove_out { 521 struct coda_out_hdr out; 522 }; 523 524 /* coda_link: NO_OUT */ 525 struct coda_link_in { 526 struct coda_in_hdr ih; 527 CodaFid sourceFid; /* cnode to link *to* */ 528 CodaFid destFid; /* Directory in which to place link */ 529 int tname; /* Place holder for data. */ 530 }; 531 532 struct coda_link_out { 533 struct coda_out_hdr out; 534 }; 535 536 537 /* coda_rename: NO_OUT */ 538 struct coda_rename_in { 539 struct coda_in_hdr ih; 540 CodaFid sourceFid; 541 int srcname; 542 CodaFid destFid; 543 int destname; 544 }; 545 546 struct coda_rename_out { 547 struct coda_out_hdr out; 548 }; 549 550 /* coda_mkdir: */ 551 struct coda_mkdir_in { 552 struct coda_in_hdr ih; 553 CodaFid Fid; 554 struct coda_vattr attr; 555 int name; /* Place holder for data. */ 556 }; 557 558 struct coda_mkdir_out { 559 struct coda_out_hdr oh; 560 CodaFid Fid; 561 struct coda_vattr attr; 562 }; 563 564 565 /* coda_rmdir: NO_OUT */ 566 struct coda_rmdir_in { 567 struct coda_in_hdr ih; 568 CodaFid Fid; 569 int name; /* Place holder for data. */ 570 }; 571 572 struct coda_rmdir_out { 573 struct coda_out_hdr out; 574 }; 575 576 /* coda_readdir: */ 577 struct coda_readdir_in { 578 struct coda_in_hdr ih; 579 CodaFid Fid; 580 int count; 581 int offset; 582 }; 583 584 struct coda_readdir_out { 585 struct coda_out_hdr oh; 586 int size; 587 void * data; /* Place holder for data. */ 588 }; 589 590 /* coda_symlink: NO_OUT */ 591 struct coda_symlink_in { 592 struct coda_in_hdr ih; 593 CodaFid Fid; /* Directory to put symlink in */ 594 int srcname; 595 struct coda_vattr attr; 596 int tname; 597 }; 598 599 struct coda_symlink_out { 600 struct coda_out_hdr out; 601 }; 602 603 /* coda_readlink: */ 604 struct coda_readlink_in { 605 struct coda_in_hdr ih; 606 CodaFid Fid; 607 }; 608 609 struct coda_readlink_out { 610 struct coda_out_hdr oh; 611 int count; 612 void * data; /* Place holder for data. */ 613 }; 614 615 616 /* coda_fsync: NO_OUT */ 617 struct coda_fsync_in { 618 struct coda_in_hdr ih; 619 CodaFid Fid; 620 }; 621 622 struct coda_fsync_out { 623 struct coda_out_hdr out; 624 }; 625 626 /* coda_vget: */ 627 struct coda_vget_in { 628 struct coda_in_hdr ih; 629 CodaFid Fid; 630 }; 631 632 struct coda_vget_out { 633 struct coda_out_hdr oh; 634 CodaFid Fid; 635 int vtype; 636 }; 637 638 639 /* CODA_SIGNAL is out-of-band, doesn't need data. */ 640 /* CODA_INVALIDATE is a venus->kernel call */ 641 /* CODA_FLUSH is a venus->kernel call */ 642 643 /* coda_purgeuser: */ 644 /* CODA_PURGEUSER is a venus->kernel call */ 645 struct coda_purgeuser_out { 646 struct coda_out_hdr oh; 647 #ifdef CODA_COMPAT_5 648 struct coda_cred cred; 649 #else 650 uid_t uid; 651 #endif 652 }; 653 654 /* coda_zapfile: */ 655 /* CODA_ZAPFILE is a venus->kernel call */ 656 struct coda_zapfile_out { 657 struct coda_out_hdr oh; 658 CodaFid Fid; 659 }; 660 661 /* coda_zapdir: */ 662 /* CODA_ZAPDIR is a venus->kernel call */ 663 struct coda_zapdir_out { 664 struct coda_out_hdr oh; 665 CodaFid Fid; 666 }; 667 668 /* coda_zapnode: */ 669 /* CODA_ZAPVNODE is a venus->kernel call */ 670 struct coda_zapvnode_out { 671 struct coda_out_hdr oh; 672 #ifdef CODA_COMPAT_5 673 struct coda_cred cred; 674 #endif 675 CodaFid Fid; 676 }; 677 678 /* coda_purgefid: */ 679 /* CODA_PURGEFID is a venus->kernel call */ 680 struct coda_purgefid_out { 681 struct coda_out_hdr oh; 682 CodaFid Fid; 683 }; 684 685 /* coda_replace: */ 686 /* CODA_REPLACE is a venus->kernel call */ 687 struct coda_replace_out { /* coda_replace is a venus->kernel call */ 688 struct coda_out_hdr oh; 689 CodaFid NewFid; 690 CodaFid OldFid; 691 }; 692 693 /* coda_open_by_fd: */ 694 struct coda_open_by_fd_in { 695 struct coda_in_hdr ih; 696 CodaFid Fid; 697 int flags; 698 }; 699 700 struct coda_open_by_fd_out { 701 struct coda_out_hdr oh; 702 int fd; 703 struct file *fh; 704 }; 705 706 /* coda_open_by_path: */ 707 struct coda_open_by_path_in { 708 struct coda_in_hdr ih; 709 CodaFid Fid; 710 int flags; 711 }; 712 713 struct coda_open_by_path_out { 714 struct coda_out_hdr oh; 715 int path; 716 }; 717 718 /* coda_statfs: NO_IN */ 719 struct coda_statfs_in { 720 struct coda_in_hdr ih; 721 }; 722 723 struct coda_statfs_out { 724 struct coda_out_hdr oh; 725 struct coda_statfs stat; 726 }; 727 728 /* 729 * Occasionally, we don't cache the fid returned by CODA_LOOKUP. 730 * For instance, if the fid is inconsistent. 731 * This case is handled by setting the top bit of the type result parameter. 732 */ 733 #define CODA_NOCACHE 0x80000000 734 735 union inputArgs { 736 struct coda_in_hdr ih; /* NB: every struct below begins with an ih */ 737 struct coda_open_in coda_open; 738 struct coda_close_in coda_close; 739 struct coda_ioctl_in coda_ioctl; 740 struct coda_getattr_in coda_getattr; 741 struct coda_setattr_in coda_setattr; 742 struct coda_access_in coda_access; 743 struct coda_lookup_in coda_lookup; 744 struct coda_create_in coda_create; 745 struct coda_remove_in coda_remove; 746 struct coda_link_in coda_link; 747 struct coda_rename_in coda_rename; 748 struct coda_mkdir_in coda_mkdir; 749 struct coda_rmdir_in coda_rmdir; 750 struct coda_readdir_in coda_readdir; 751 struct coda_symlink_in coda_symlink; 752 struct coda_readlink_in coda_readlink; 753 struct coda_fsync_in coda_fsync; 754 struct coda_vget_in coda_vget; 755 struct coda_open_by_fd_in coda_open_by_fd; 756 struct coda_open_by_path_in coda_open_by_path; 757 struct coda_statfs_in coda_statfs; 758 }; 759 760 union outputArgs { 761 struct coda_out_hdr oh; /* NB: every struct below begins with an oh */ 762 struct coda_root_out coda_root; 763 struct coda_open_out coda_open; 764 struct coda_ioctl_out coda_ioctl; 765 struct coda_getattr_out coda_getattr; 766 struct coda_lookup_out coda_lookup; 767 struct coda_create_out coda_create; 768 struct coda_mkdir_out coda_mkdir; 769 struct coda_readdir_out coda_readdir; 770 struct coda_readlink_out coda_readlink; 771 struct coda_vget_out coda_vget; 772 struct coda_purgeuser_out coda_purgeuser; 773 struct coda_zapfile_out coda_zapfile; 774 struct coda_zapdir_out coda_zapdir; 775 struct coda_zapvnode_out coda_zapvnode; 776 struct coda_purgefid_out coda_purgefid; 777 struct coda_replace_out coda_replace; 778 struct coda_open_by_fd_out coda_open_by_fd; 779 struct coda_open_by_path_out coda_open_by_path; 780 struct coda_statfs_out coda_statfs; 781 }; 782 783 union coda_downcalls { 784 /* CODA_INVALIDATE is a venus->kernel call */ 785 /* CODA_FLUSH is a venus->kernel call */ 786 struct coda_purgeuser_out purgeuser; 787 struct coda_zapfile_out zapfile; 788 struct coda_zapdir_out zapdir; 789 struct coda_zapvnode_out zapvnode; 790 struct coda_purgefid_out purgefid; 791 struct coda_replace_out replace; 792 }; 793 794 795 /* 796 * Used for identifying usage of "Control" and pioctls 797 */ 798 799 #define PIOCPARM_MASK 0x0000ffff 800 struct ViceIoctl { 801 void *in, *out; /* Data to be transferred in, or out */ 802 unsigned short in_size; /* Size of input buffer <= 8K */ 803 unsigned short out_size;/* Maximum size of output buffer, <= 8K */ 804 }; 805 806 struct PioctlData { 807 const char *path; 808 int follow; 809 #if defined(__CYGWIN32__) || defined(__NT_CODA__) 810 int cmd; 811 #endif 812 struct ViceIoctl vi; 813 }; 814 815 #define CODA_CONTROL ".CONTROL" 816 #define CODA_CONTROLLEN 8 817 #define CTL_INO -1 818 #define CTL_FILE "/coda/.CONTROL" 819 820 821 #ifdef CODA_COMPAT_5 822 #define CTL_FID { -1, -1, -1 } 823 #define IS_CTL_FID(fidp) ((fidp)->Volume == -1 &&\ 824 (fidp)->Vnode == -1 &&\ 825 (fidp)->Unique == -1) 826 #define INVAL_FID { 0, 0, 0 } 827 #else 828 #define CTL_FID { { -1, -1, -1, -1 } } 829 #define IS_CTL_FID(fidp) ((fidp)->opaque[0] == -1 &&\ 830 (fidp)->opaque[1] == -1 &&\ 831 (fidp)->opaque[2] == -1 &&\ 832 (fidp)->opaque[3] == -1) 833 #define INVAL_FID { { 0, 0, 0, 0 } } 834 #endif 835 836 /* Data passed to mount */ 837 838 #define CODA_MOUNT_VERSION 1 839 840 struct coda_mount_data { 841 int version; 842 int fd; /* Opened device */ 843 }; 844 845 #endif 846 847