| /*  | 
 |    You may distribute this file under either of the two licenses that | 
 |    follow at your discretion. | 
 | */ | 
 |  | 
 | /* BLURB lgpl | 
 |  | 
 |                            Coda File System | 
 |                               Release 5 | 
 |  | 
 |           Copyright (c) 1987-1999 Carnegie Mellon University | 
 |                   Additional copyrights listed below | 
 |  | 
 | This code is distributed "AS IS" without warranty of any kind under | 
 | the terms of the GNU Library General Public Licence Version 2, as | 
 | shown in the file LICENSE, or under the license shown below. The | 
 | technical and financial contributors to Coda are listed in the file | 
 | CREDITS. | 
 |  | 
 |                         Additional copyrights  | 
 | */ | 
 |  | 
 | /* | 
 |  | 
 |             Coda: an Experimental Distributed File System | 
 |                              Release 4.0 | 
 |  | 
 |           Copyright (c) 1987-1999 Carnegie Mellon University | 
 |                          All Rights Reserved | 
 |  | 
 | Permission  to  use, copy, modify and distribute this software and its | 
 | documentation is hereby granted,  provided  that  both  the  copyright | 
 | notice  and  this  permission  notice  appear  in  all  copies  of the | 
 | software, derivative works or  modified  versions,  and  any  portions | 
 | thereof, and that both notices appear in supporting documentation, and | 
 | that credit is given to Carnegie Mellon University  in  all  documents | 
 | and publicity pertaining to direct or indirect use of this code or its | 
 | derivatives. | 
 |  | 
 | CODA IS AN EXPERIMENTAL SOFTWARE SYSTEM AND IS  KNOWN  TO  HAVE  BUGS, | 
 | SOME  OF  WHICH MAY HAVE SERIOUS CONSEQUENCES.  CARNEGIE MELLON ALLOWS | 
 | FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION.   CARNEGIE  MELLON | 
 | DISCLAIMS  ANY  LIABILITY  OF  ANY  KIND  FOR  ANY  DAMAGES WHATSOEVER | 
 | RESULTING DIRECTLY OR INDIRECTLY FROM THE USE OF THIS SOFTWARE  OR  OF | 
 | ANY DERIVATIVE WORK. | 
 |  | 
 | Carnegie  Mellon  encourages  users  of  this  software  to return any | 
 | improvements or extensions that  they  make,  and  to  grant  Carnegie | 
 | Mellon the rights to redistribute these changes without encumbrance. | 
 | */ | 
 |  | 
 | /* | 
 |  * | 
 |  * Based on cfs.h from Mach, but revamped for increased simplicity. | 
 |  * Linux modifications by  | 
 |  * Peter Braam, Aug 1996 | 
 |  */ | 
 |  | 
 | #ifndef _CODA_HEADER_ | 
 | #define _CODA_HEADER_ | 
 |  | 
 |  | 
 | /* Catch new _KERNEL defn for NetBSD and DJGPP/__CYGWIN32__ */ | 
 | #if defined(__NetBSD__) || \ | 
 |   ((defined(DJGPP) || defined(__CYGWIN32__)) && !defined(KERNEL)) | 
 | #include <sys/types.h> | 
 | #endif  | 
 |  | 
 | #ifndef CODA_MAXSYMLINKS | 
 | #define CODA_MAXSYMLINKS 10 | 
 | #endif | 
 |  | 
 | #if defined(DJGPP) || defined(__CYGWIN32__) | 
 | #ifdef KERNEL | 
 | typedef unsigned long u_long; | 
 | typedef unsigned int u_int; | 
 | typedef unsigned short u_short; | 
 | typedef u_long ino_t; | 
 | typedef u_long dev_t; | 
 | typedef void * caddr_t; | 
 | #ifdef DOS | 
 | typedef unsigned __int64 u_quad_t; | 
 | #else  | 
 | typedef unsigned long long u_quad_t; | 
 | #endif | 
 |  | 
 | #define inline | 
 |  | 
 | struct timespec { | 
 |         long       ts_sec; | 
 |         long       ts_nsec; | 
 | }; | 
 | #else  /* DJGPP but not KERNEL */ | 
 | #include <sys/time.h> | 
 | typedef unsigned long long u_quad_t; | 
 | #endif /* !KERNEL */ | 
 | #endif /* !DJGPP */ | 
 |  | 
 |  | 
 | #if defined(__linux__) | 
 | #include <linux/time.h> | 
 | #define cdev_t u_quad_t | 
 | #ifndef __KERNEL__ | 
 | #if !defined(_UQUAD_T_) && (!defined(__GLIBC__) || __GLIBC__ < 2) | 
 | #define _UQUAD_T_ 1 | 
 | typedef unsigned long long u_quad_t; | 
 | #endif | 
 | #else /*__KERNEL__ */ | 
 | typedef unsigned long long u_quad_t; | 
 | #endif /* __KERNEL__ */ | 
 | #else | 
 | #define cdev_t dev_t | 
 | #endif | 
 |  | 
 | #ifdef __CYGWIN32__ | 
 | struct timespec { | 
 |         time_t  tv_sec;         /* seconds */ | 
 |         long    tv_nsec;        /* nanoseconds */ | 
 | }; | 
 | #endif | 
 |  | 
 | #ifndef __BIT_TYPES_DEFINED__ | 
 | #define __BIT_TYPES_DEFINED__ | 
 | typedef signed char	      int8_t; | 
 | typedef unsigned char	    u_int8_t; | 
 | typedef short		     int16_t; | 
 | typedef unsigned short	   u_int16_t; | 
 | typedef int		     int32_t; | 
 | typedef unsigned int	   u_int32_t; | 
 | #endif | 
 |  | 
 |  | 
 | /* | 
 |  * Cfs constants | 
 |  */ | 
 | #define CODA_MAXNAMLEN   255 | 
 | #define CODA_MAXPATHLEN  1024 | 
 | #define CODA_MAXSYMLINK  10 | 
 |  | 
 | /* these are Coda's version of O_RDONLY etc combinations | 
 |  * to deal with VFS open modes | 
 |  */ | 
 | #define	C_O_READ	0x001 | 
 | #define	C_O_WRITE       0x002 | 
 | #define C_O_TRUNC       0x010 | 
 | #define C_O_EXCL	0x100 | 
 | #define C_O_CREAT	0x200 | 
 |  | 
 | /* these are to find mode bits in Venus */  | 
 | #define C_M_READ  00400 | 
 | #define C_M_WRITE 00200 | 
 |  | 
 | /* for access Venus will use */ | 
 | #define C_A_C_OK    8               /* Test for writing upon create.  */ | 
 | #define C_A_R_OK    4               /* Test for read permission.  */ | 
 | #define C_A_W_OK    2               /* Test for write permission.  */ | 
 | #define C_A_X_OK    1               /* Test for execute permission.  */ | 
 | #define C_A_F_OK    0               /* Test for existence.  */ | 
 |  | 
 |  | 
 |  | 
 | #ifndef _VENUS_DIRENT_T_ | 
 | #define _VENUS_DIRENT_T_ 1 | 
 | struct venus_dirent { | 
 |         u_int32_t d_fileno;		/* file number of entry */ | 
 |         u_int16_t d_reclen;		/* length of this record */ | 
 |         u_int8_t  d_type;			/* file type, see below */ | 
 |         u_int8_t  d_namlen;		/* length of string in d_name */ | 
 |         char	  d_name[CODA_MAXNAMLEN + 1];/* name must be no longer than this */ | 
 | }; | 
 | #undef DIRSIZ | 
 | #define DIRSIZ(dp)      ((sizeof (struct venus_dirent) - (CODA_MAXNAMLEN+1)) + \ | 
 |                          (((dp)->d_namlen+1 + 3) &~ 3)) | 
 |  | 
 | /* | 
 |  * File types | 
 |  */ | 
 | #define	CDT_UNKNOWN	 0 | 
 | #define	CDT_FIFO	 1 | 
 | #define	CDT_CHR		 2 | 
 | #define	CDT_DIR		 4 | 
 | #define	CDT_BLK		 6 | 
 | #define	CDT_REG		 8 | 
 | #define	CDT_LNK		10 | 
 | #define	CDT_SOCK	12 | 
 | #define	CDT_WHT		14 | 
 |  | 
 | /* | 
 |  * Convert between stat structure types and directory types. | 
 |  */ | 
 | #define	IFTOCDT(mode)	(((mode) & 0170000) >> 12) | 
 | #define	CDTTOIF(dirtype)	((dirtype) << 12) | 
 |  | 
 | #endif | 
 |  | 
 | #ifndef _VUID_T_ | 
 | #define _VUID_T_ | 
 | typedef u_int32_t vuid_t; | 
 | typedef u_int32_t vgid_t; | 
 | #endif /*_VUID_T_ */ | 
 |  | 
 | #ifdef CONFIG_CODA_FS_OLD_API | 
 | struct CodaFid { | 
 | 	u_int32_t opaque[3]; | 
 | }; | 
 |  | 
 | static __inline__ ino_t  coda_f2i(struct CodaFid *fid) | 
 | { | 
 | 	if ( ! fid )  | 
 | 		return 0;  | 
 | 	if (fid->opaque[1] == 0xfffffffe || fid->opaque[1] == 0xffffffff) | 
 | 		return ((fid->opaque[0] << 20) | (fid->opaque[2] & 0xfffff)); | 
 | 	else | 
 | 		return (fid->opaque[2] + (fid->opaque[1]<<10) + (fid->opaque[0]<<20)); | 
 | } | 
 |  | 
 | struct coda_cred { | 
 |     vuid_t cr_uid, cr_euid, cr_suid, cr_fsuid; /* Real, efftve, set, fs uid*/ | 
 |     vgid_t cr_groupid, cr_egid, cr_sgid, cr_fsgid; /* same for groups */ | 
 | }; | 
 |  | 
 | #else /* not defined(CONFIG_CODA_FS_OLD_API) */ | 
 |  | 
 | struct CodaFid { | 
 | 	u_int32_t opaque[4]; | 
 | }; | 
 |  | 
 | #define coda_f2i(fid)\ | 
 | 	(fid ? (fid->opaque[3] ^ (fid->opaque[2]<<10) ^ (fid->opaque[1]<<20) ^ fid->opaque[0]) : 0) | 
 |  | 
 | #endif | 
 |  | 
 | #ifndef _VENUS_VATTR_T_ | 
 | #define _VENUS_VATTR_T_ | 
 | /* | 
 |  * Vnode types.  VNON means no type. | 
 |  */ | 
 | enum coda_vtype	{ C_VNON, C_VREG, C_VDIR, C_VBLK, C_VCHR, C_VLNK, C_VSOCK, C_VFIFO, C_VBAD }; | 
 |  | 
 | struct coda_vattr { | 
 | 	long     	va_type;	/* vnode type (for create) */ | 
 | 	u_short		va_mode;	/* files access mode and type */ | 
 | 	short		va_nlink;	/* number of references to file */ | 
 | 	vuid_t		va_uid;		/* owner user id */ | 
 | 	vgid_t		va_gid;		/* owner group id */ | 
 | 	long		va_fileid;	/* file id */ | 
 | 	u_quad_t	va_size;	/* file size in bytes */ | 
 | 	long		va_blocksize;	/* blocksize preferred for i/o */ | 
 | 	struct timespec	va_atime;	/* time of last access */ | 
 | 	struct timespec	va_mtime;	/* time of last modification */ | 
 | 	struct timespec	va_ctime;	/* time file changed */ | 
 | 	u_long		va_gen;		/* generation number of file */ | 
 | 	u_long		va_flags;	/* flags defined for file */ | 
 | 	cdev_t	        va_rdev;	/* device special file represents */ | 
 | 	u_quad_t	va_bytes;	/* bytes of disk space held by file */ | 
 | 	u_quad_t	va_filerev;	/* file modification number */ | 
 | }; | 
 |  | 
 | #endif  | 
 |  | 
 | /* structure used by CODA_STATFS for getting cache information from venus */ | 
 | struct coda_statfs { | 
 |     int32_t f_blocks; | 
 |     int32_t f_bfree; | 
 |     int32_t f_bavail; | 
 |     int32_t f_files; | 
 |     int32_t f_ffree; | 
 | }; | 
 |  | 
 | /* | 
 |  * Kernel <--> Venus communications. | 
 |  */ | 
 |  | 
 | #define CODA_ROOT	2 | 
 | #define CODA_OPEN_BY_FD	3 | 
 | #define CODA_OPEN	4 | 
 | #define CODA_CLOSE	5 | 
 | #define CODA_IOCTL	6 | 
 | #define CODA_GETATTR	7 | 
 | #define CODA_SETATTR	8 | 
 | #define CODA_ACCESS	9 | 
 | #define CODA_LOOKUP	10 | 
 | #define CODA_CREATE	11 | 
 | #define CODA_REMOVE	12 | 
 | #define CODA_LINK	13 | 
 | #define CODA_RENAME	14 | 
 | #define CODA_MKDIR	15 | 
 | #define CODA_RMDIR	16 | 
 | #define CODA_SYMLINK	18 | 
 | #define CODA_READLINK	19 | 
 | #define CODA_FSYNC	20 | 
 | #define CODA_VGET	22 | 
 | #define CODA_SIGNAL	23 | 
 | #define CODA_REPLACE	 24 /* DOWNCALL */ | 
 | #define CODA_FLUSH       25 /* DOWNCALL */ | 
 | #define CODA_PURGEUSER   26 /* DOWNCALL */ | 
 | #define CODA_ZAPFILE     27 /* DOWNCALL */ | 
 | #define CODA_ZAPDIR      28 /* DOWNCALL */ | 
 | #define CODA_PURGEFID    30 /* DOWNCALL */ | 
 | #define CODA_OPEN_BY_PATH 31 | 
 | #define CODA_RESOLVE     32 | 
 | #define CODA_REINTEGRATE 33 | 
 | #define CODA_STATFS	 34 | 
 | #define CODA_STORE	 35 | 
 | #define CODA_RELEASE	 36 | 
 | #define CODA_NCALLS 37 | 
 |  | 
 | #define DOWNCALL(opcode) (opcode >= CODA_REPLACE && opcode <= CODA_PURGEFID) | 
 |  | 
 | #define VC_MAXDATASIZE	    8192 | 
 | #define VC_MAXMSGSIZE      sizeof(union inputArgs)+sizeof(union outputArgs) +\ | 
 |                             VC_MAXDATASIZE   | 
 |  | 
 | #define CIOC_KERNEL_VERSION _IOWR('c', 10, size_t) | 
 |  | 
 | #if 0 | 
 | #define CODA_KERNEL_VERSION 0 /* don't care about kernel version number */ | 
 | #define CODA_KERNEL_VERSION 1 /* The old venus 4.6 compatible interface */ | 
 | #endif | 
 | #ifdef CONFIG_CODA_FS_OLD_API | 
 | #define CODA_KERNEL_VERSION 2 /* venus_lookup got an extra parameter */ | 
 | #else | 
 | #define CODA_KERNEL_VERSION 3 /* 128-bit file identifiers */ | 
 | #endif | 
 |  | 
 | /* | 
 |  *        Venus <-> Coda  RPC arguments | 
 |  */ | 
 | struct coda_in_hdr { | 
 |     u_int32_t opcode; | 
 |     u_int32_t unique;	    /* Keep multiple outstanding msgs distinct */ | 
 | #ifdef CONFIG_CODA_FS_OLD_API | 
 |     u_int16_t pid;	    /* Common to all */ | 
 |     u_int16_t pgid;	    /* Common to all */ | 
 |     u_int16_t sid;          /* Common to all */ | 
 |     struct coda_cred cred;  /* Common to all */ | 
 | #else | 
 |     pid_t pid; | 
 |     pid_t pgid; | 
 |     vuid_t uid; | 
 | #endif | 
 | }; | 
 |  | 
 | /* Really important that opcode and unique are 1st two fields! */ | 
 | struct coda_out_hdr { | 
 |     u_int32_t opcode; | 
 |     u_int32_t unique;	 | 
 |     u_int32_t result; | 
 | }; | 
 |  | 
 | /* coda_root: NO_IN */ | 
 | struct coda_root_out { | 
 |     struct coda_out_hdr oh; | 
 |     struct CodaFid VFid; | 
 | }; | 
 |  | 
 | struct coda_root_in { | 
 |     struct coda_in_hdr in; | 
 | }; | 
 |  | 
 | /* coda_open: */ | 
 | struct coda_open_in { | 
 |     struct coda_in_hdr ih; | 
 |     struct CodaFid VFid; | 
 |     int	flags; | 
 | }; | 
 |  | 
 | struct coda_open_out { | 
 |     struct coda_out_hdr oh; | 
 |     cdev_t	dev; | 
 |     ino_t	inode; | 
 | }; | 
 |  | 
 |  | 
 | /* coda_store: */ | 
 | struct coda_store_in { | 
 |     struct coda_in_hdr ih; | 
 |     struct CodaFid VFid; | 
 |     int	flags; | 
 | }; | 
 |  | 
 | struct coda_store_out { | 
 |     struct coda_out_hdr out; | 
 | }; | 
 |  | 
 | /* coda_release: */ | 
 | struct coda_release_in { | 
 |     struct coda_in_hdr ih; | 
 |     struct CodaFid VFid; | 
 |     int	flags; | 
 | }; | 
 |  | 
 | struct coda_release_out { | 
 |     struct coda_out_hdr out; | 
 | }; | 
 |  | 
 | /* coda_close: */ | 
 | struct coda_close_in { | 
 |     struct coda_in_hdr ih; | 
 |     struct CodaFid VFid; | 
 |     int	flags; | 
 | }; | 
 |  | 
 | struct coda_close_out { | 
 |     struct coda_out_hdr out; | 
 | }; | 
 |  | 
 | /* coda_ioctl: */ | 
 | struct coda_ioctl_in { | 
 |     struct coda_in_hdr ih; | 
 |     struct CodaFid VFid; | 
 |     int	cmd; | 
 |     int	len; | 
 |     int	rwflag; | 
 |     char *data;			/* Place holder for data. */ | 
 | }; | 
 |  | 
 | struct coda_ioctl_out { | 
 |     struct coda_out_hdr oh; | 
 |     int	len; | 
 |     caddr_t	data;		/* Place holder for data. */ | 
 | }; | 
 |  | 
 |  | 
 | /* coda_getattr: */ | 
 | struct coda_getattr_in { | 
 |     struct coda_in_hdr ih; | 
 |     struct CodaFid VFid; | 
 | }; | 
 |  | 
 | struct coda_getattr_out { | 
 |     struct coda_out_hdr oh; | 
 |     struct coda_vattr attr; | 
 | }; | 
 |  | 
 |  | 
 | /* coda_setattr: NO_OUT */ | 
 | struct coda_setattr_in { | 
 |     struct coda_in_hdr ih; | 
 |     struct CodaFid VFid; | 
 |     struct coda_vattr attr; | 
 | }; | 
 |  | 
 | struct coda_setattr_out { | 
 |     struct coda_out_hdr out; | 
 | }; | 
 |  | 
 | /* coda_access: NO_OUT */ | 
 | struct coda_access_in { | 
 |     struct coda_in_hdr ih; | 
 |     struct CodaFid VFid; | 
 |     int	flags; | 
 | }; | 
 |  | 
 | struct coda_access_out { | 
 |     struct coda_out_hdr out; | 
 | }; | 
 |  | 
 |  | 
 | /* lookup flags */ | 
 | #define CLU_CASE_SENSITIVE     0x01 | 
 | #define CLU_CASE_INSENSITIVE   0x02 | 
 |  | 
 | /* coda_lookup: */ | 
 | struct  coda_lookup_in { | 
 |     struct coda_in_hdr ih; | 
 |     struct CodaFid VFid; | 
 |     int         name;		/* Place holder for data. */ | 
 |     int         flags;	 | 
 | }; | 
 |  | 
 | struct coda_lookup_out { | 
 |     struct coda_out_hdr oh; | 
 |     struct CodaFid VFid; | 
 |     int	vtype; | 
 | }; | 
 |  | 
 |  | 
 | /* coda_create: */ | 
 | struct coda_create_in { | 
 |     struct coda_in_hdr ih; | 
 |     struct CodaFid VFid; | 
 |     struct coda_vattr attr; | 
 |     int excl; | 
 |     int mode; | 
 |     int 	name;		/* Place holder for data. */ | 
 | }; | 
 |  | 
 | struct coda_create_out { | 
 |     struct coda_out_hdr oh; | 
 |     struct CodaFid VFid; | 
 |     struct coda_vattr attr; | 
 | }; | 
 |  | 
 |  | 
 | /* coda_remove: NO_OUT */ | 
 | struct coda_remove_in { | 
 |     struct coda_in_hdr ih; | 
 |     struct CodaFid VFid; | 
 |     int name;		/* Place holder for data. */ | 
 | }; | 
 |  | 
 | struct coda_remove_out { | 
 |     struct coda_out_hdr out; | 
 | }; | 
 |  | 
 | /* coda_link: NO_OUT */ | 
 | struct coda_link_in { | 
 |     struct coda_in_hdr ih; | 
 |     struct CodaFid sourceFid;	/* cnode to link *to* */ | 
 |     struct CodaFid destFid;	/* Directory in which to place link */ | 
 |     int tname;		/* Place holder for data. */ | 
 | }; | 
 |  | 
 | struct coda_link_out { | 
 |     struct coda_out_hdr out; | 
 | }; | 
 |  | 
 |  | 
 | /* coda_rename: NO_OUT */ | 
 | struct coda_rename_in { | 
 |     struct coda_in_hdr ih; | 
 |     struct CodaFid sourceFid; | 
 |     int 	srcname; | 
 |     struct CodaFid destFid; | 
 |     int 	destname; | 
 | }; | 
 |  | 
 | struct coda_rename_out { | 
 |     struct coda_out_hdr out; | 
 | }; | 
 |  | 
 | /* coda_mkdir: */ | 
 | struct coda_mkdir_in { | 
 |     struct coda_in_hdr ih; | 
 |     struct CodaFid VFid; | 
 |     struct coda_vattr attr; | 
 |     int	   name;		/* Place holder for data. */ | 
 | }; | 
 |  | 
 | struct coda_mkdir_out { | 
 |     struct coda_out_hdr oh; | 
 |     struct CodaFid VFid; | 
 |     struct coda_vattr attr; | 
 | }; | 
 |  | 
 |  | 
 | /* coda_rmdir: NO_OUT */ | 
 | struct coda_rmdir_in { | 
 |     struct coda_in_hdr ih; | 
 |     struct CodaFid VFid; | 
 |     int name;		/* Place holder for data. */ | 
 | }; | 
 |  | 
 | struct coda_rmdir_out { | 
 |     struct coda_out_hdr out; | 
 | }; | 
 |  | 
 | /* coda_symlink: NO_OUT */ | 
 | struct coda_symlink_in { | 
 |     struct coda_in_hdr ih; | 
 |     struct CodaFid VFid;	/* Directory to put symlink in */ | 
 |     int srcname; | 
 |     struct coda_vattr attr; | 
 |     int tname; | 
 | }; | 
 |  | 
 | struct coda_symlink_out { | 
 |     struct coda_out_hdr out; | 
 | }; | 
 |  | 
 | /* coda_readlink: */ | 
 | struct coda_readlink_in { | 
 |     struct coda_in_hdr ih; | 
 |     struct CodaFid VFid; | 
 | }; | 
 |  | 
 | struct coda_readlink_out { | 
 |     struct coda_out_hdr oh; | 
 |     int	count; | 
 |     caddr_t	data;		/* Place holder for data. */ | 
 | }; | 
 |  | 
 |  | 
 | /* coda_fsync: NO_OUT */ | 
 | struct coda_fsync_in { | 
 |     struct coda_in_hdr ih; | 
 |     struct CodaFid VFid; | 
 | }; | 
 |  | 
 | struct coda_fsync_out { | 
 |     struct coda_out_hdr out; | 
 | }; | 
 |  | 
 | /* coda_vget: */ | 
 | struct coda_vget_in { | 
 |     struct coda_in_hdr ih; | 
 |     struct CodaFid VFid; | 
 | }; | 
 |  | 
 | struct coda_vget_out { | 
 |     struct coda_out_hdr oh; | 
 |     struct CodaFid VFid; | 
 |     int	vtype; | 
 | }; | 
 |  | 
 |  | 
 | /* CODA_SIGNAL is out-of-band, doesn't need data. */ | 
 | /* CODA_INVALIDATE is a venus->kernel call */ | 
 | /* CODA_FLUSH is a venus->kernel call */ | 
 |  | 
 | /* coda_purgeuser: */ | 
 | /* CODA_PURGEUSER is a venus->kernel call */ | 
 | struct coda_purgeuser_out { | 
 |     struct coda_out_hdr oh; | 
 | #ifdef CONFIG_CODA_FS_OLD_API | 
 |     struct coda_cred cred; | 
 | #else | 
 |     vuid_t uid; | 
 | #endif | 
 | }; | 
 |  | 
 | /* coda_zapfile: */ | 
 | /* CODA_ZAPFILE is a venus->kernel call */ | 
 | struct coda_zapfile_out {   | 
 |     struct coda_out_hdr oh; | 
 |     struct CodaFid CodaFid; | 
 | }; | 
 |  | 
 | /* coda_zapdir: */ | 
 | /* CODA_ZAPDIR is a venus->kernel call */	 | 
 | struct coda_zapdir_out {	   | 
 |     struct coda_out_hdr oh; | 
 |     struct CodaFid CodaFid; | 
 | }; | 
 |  | 
 | /* coda_purgefid: */ | 
 | /* CODA_PURGEFID is a venus->kernel call */	 | 
 | struct coda_purgefid_out {  | 
 |     struct coda_out_hdr oh; | 
 |     struct CodaFid CodaFid; | 
 | }; | 
 |  | 
 | /* coda_replace: */ | 
 | /* CODA_REPLACE is a venus->kernel call */	 | 
 | struct coda_replace_out { /* coda_replace is a venus->kernel call */ | 
 |     struct coda_out_hdr oh; | 
 |     struct CodaFid NewFid; | 
 |     struct CodaFid OldFid; | 
 | }; | 
 |  | 
 | /* coda_open_by_fd: */ | 
 | struct coda_open_by_fd_in { | 
 |     struct coda_in_hdr ih; | 
 |     struct CodaFid VFid; | 
 |     int        flags; | 
 | }; | 
 |  | 
 | struct coda_open_by_fd_out { | 
 |     struct coda_out_hdr oh; | 
 |     int fd; | 
 |  | 
 | #ifdef __KERNEL__ | 
 |     struct file *fh; /* not passed from userspace but used in-kernel only */ | 
 | #endif | 
 | }; | 
 |  | 
 | /* coda_open_by_path: */ | 
 | struct coda_open_by_path_in { | 
 |     struct coda_in_hdr ih; | 
 |     struct CodaFid VFid; | 
 |     int	flags; | 
 | }; | 
 |  | 
 | struct coda_open_by_path_out { | 
 |     struct coda_out_hdr oh; | 
 | 	int path; | 
 | }; | 
 |  | 
 | /* coda_statfs: NO_IN */ | 
 | struct coda_statfs_in { | 
 |     struct coda_in_hdr in; | 
 | }; | 
 |  | 
 | struct coda_statfs_out { | 
 |     struct coda_out_hdr oh; | 
 |     struct coda_statfs stat; | 
 | }; | 
 |  | 
 | /*  | 
 |  * Occasionally, we don't cache the fid returned by CODA_LOOKUP.  | 
 |  * For instance, if the fid is inconsistent.  | 
 |  * This case is handled by setting the top bit of the type result parameter. | 
 |  */ | 
 | #define CODA_NOCACHE          0x80000000 | 
 |  | 
 | union inputArgs { | 
 |     struct coda_in_hdr ih;		/* NB: every struct below begins with an ih */ | 
 |     struct coda_open_in coda_open; | 
 |     struct coda_store_in coda_store; | 
 |     struct coda_release_in coda_release; | 
 |     struct coda_close_in coda_close; | 
 |     struct coda_ioctl_in coda_ioctl; | 
 |     struct coda_getattr_in coda_getattr; | 
 |     struct coda_setattr_in coda_setattr; | 
 |     struct coda_access_in coda_access; | 
 |     struct coda_lookup_in coda_lookup; | 
 |     struct coda_create_in coda_create; | 
 |     struct coda_remove_in coda_remove; | 
 |     struct coda_link_in coda_link; | 
 |     struct coda_rename_in coda_rename; | 
 |     struct coda_mkdir_in coda_mkdir; | 
 |     struct coda_rmdir_in coda_rmdir; | 
 |     struct coda_symlink_in coda_symlink; | 
 |     struct coda_readlink_in coda_readlink; | 
 |     struct coda_fsync_in coda_fsync; | 
 |     struct coda_vget_in coda_vget; | 
 |     struct coda_open_by_fd_in coda_open_by_fd; | 
 |     struct coda_open_by_path_in coda_open_by_path; | 
 |     struct coda_statfs_in coda_statfs; | 
 | }; | 
 |  | 
 | union outputArgs { | 
 |     struct coda_out_hdr oh;		/* NB: every struct below begins with an oh */ | 
 |     struct coda_root_out coda_root; | 
 |     struct coda_open_out coda_open; | 
 |     struct coda_ioctl_out coda_ioctl; | 
 |     struct coda_getattr_out coda_getattr; | 
 |     struct coda_lookup_out coda_lookup; | 
 |     struct coda_create_out coda_create; | 
 |     struct coda_mkdir_out coda_mkdir; | 
 |     struct coda_readlink_out coda_readlink; | 
 |     struct coda_vget_out coda_vget; | 
 |     struct coda_purgeuser_out coda_purgeuser; | 
 |     struct coda_zapfile_out coda_zapfile; | 
 |     struct coda_zapdir_out coda_zapdir; | 
 |     struct coda_purgefid_out coda_purgefid; | 
 |     struct coda_replace_out coda_replace; | 
 |     struct coda_open_by_fd_out coda_open_by_fd; | 
 |     struct coda_open_by_path_out coda_open_by_path; | 
 |     struct coda_statfs_out coda_statfs; | 
 | };     | 
 |  | 
 | union coda_downcalls { | 
 |     /* CODA_INVALIDATE is a venus->kernel call */ | 
 |     /* CODA_FLUSH is a venus->kernel call */ | 
 |     struct coda_purgeuser_out purgeuser; | 
 |     struct coda_zapfile_out zapfile; | 
 |     struct coda_zapdir_out zapdir; | 
 |     struct coda_purgefid_out purgefid; | 
 |     struct coda_replace_out replace; | 
 | }; | 
 |  | 
 |  | 
 | /* | 
 |  * Used for identifying usage of "Control" and pioctls | 
 |  */ | 
 |  | 
 | #define PIOCPARM_MASK 0x0000ffff | 
 | struct ViceIoctl { | 
 |         void __user *in;        /* Data to be transferred in */ | 
 |         void __user *out;       /* Data to be transferred out */ | 
 |         u_short in_size;        /* Size of input buffer <= 2K */ | 
 |         u_short out_size;       /* Maximum size of output buffer, <= 2K */ | 
 | }; | 
 |  | 
 | struct PioctlData { | 
 |         const char __user *path; | 
 |         int follow; | 
 |         struct ViceIoctl vi; | 
 | }; | 
 |  | 
 | #define CODA_CONTROL		".CONTROL" | 
 | #define CODA_CONTROLLEN		8 | 
 | #define CTL_INO			-1 | 
 |  | 
 | /* Data passed to mount */ | 
 |  | 
 | #define CODA_MOUNT_VERSION 1 | 
 |  | 
 | struct coda_mount_data { | 
 | 	int		version; | 
 | 	int		fd;       /* Opened device */ | 
 | }; | 
 |  | 
 | #endif  | 
 |  |