742 lines
		
	
	
	
		
			17 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			742 lines
		
	
	
	
		
			17 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /* 
 | ||
|  |    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 _UAPI_CODA_HEADER_
 | ||
|  | #define _UAPI_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
 | ||
|  | #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_ */
 | ||
|  | 
 | ||
|  | 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) | ||
|  | 
 | ||
|  | #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)
 | ||
|  | 
 | ||
|  | #define CODA_KERNEL_VERSION 3 /* 128-bit file identifiers */
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  *        Venus <-> Coda  RPC arguments | ||
|  |  */ | ||
|  | struct coda_in_hdr { | ||
|  |     u_int32_t opcode; | ||
|  |     u_int32_t unique;	    /* Keep multiple outstanding msgs distinct */ | ||
|  |     pid_t pid; | ||
|  |     pid_t pgid; | ||
|  |     vuid_t uid; | ||
|  | }; | ||
|  | 
 | ||
|  | /* 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; | ||
|  |     vuid_t uid; | ||
|  | }; | ||
|  | 
 | ||
|  | /* 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 /* _UAPI_CODA_HEADER_ */
 |