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