Home | History | Annotate | Line # | Download | only in coda
coda.h revision 1.20
      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