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