|  | /* | 
|  | 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 | 
|  |  |