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