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