Home | History | Annotate | Line # | Download | only in coda
coda_namecache.h revision 1.1
      1  1.1  rvb /*
      2  1.1  rvb 
      3  1.1  rvb             Coda: an Experimental Distributed File System
      4  1.1  rvb                              Release 3.1
      5  1.1  rvb 
      6  1.1  rvb           Copyright (c) 1987-1998 Carnegie Mellon University
      7  1.1  rvb                          All Rights Reserved
      8  1.1  rvb 
      9  1.1  rvb Permission  to  use, copy, modify and distribute this software and its
     10  1.1  rvb documentation is hereby granted,  provided  that  both  the  copyright
     11  1.1  rvb notice  and  this  permission  notice  appear  in  all  copies  of the
     12  1.1  rvb software, derivative works or  modified  versions,  and  any  portions
     13  1.1  rvb thereof, and that both notices appear in supporting documentation, and
     14  1.1  rvb that credit is given to Carnegie Mellon University  in  all  documents
     15  1.1  rvb and publicity pertaining to direct or indirect use of this code or its
     16  1.1  rvb derivatives.
     17  1.1  rvb 
     18  1.1  rvb CODA IS AN EXPERIMENTAL SOFTWARE SYSTEM AND IS  KNOWN  TO  HAVE  BUGS,
     19  1.1  rvb SOME  OF  WHICH MAY HAVE SERIOUS CONSEQUENCES.  CARNEGIE MELLON ALLOWS
     20  1.1  rvb FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION.   CARNEGIE  MELLON
     21  1.1  rvb DISCLAIMS  ANY  LIABILITY  OF  ANY  KIND  FOR  ANY  DAMAGES WHATSOEVER
     22  1.1  rvb RESULTING DIRECTLY OR INDIRECTLY FROM THE USE OF THIS SOFTWARE  OR  OF
     23  1.1  rvb ANY DERIVATIVE WORK.
     24  1.1  rvb 
     25  1.1  rvb Carnegie  Mellon  encourages  users  of  this  software  to return any
     26  1.1  rvb improvements or extensions that  they  make,  and  to  grant  Carnegie
     27  1.1  rvb Mellon the rights to redistribute these changes without encumbrance.
     28  1.1  rvb */
     29  1.1  rvb 
     30  1.1  rvb /* $Header: /tank/opengrok/rsync2/NetBSD/src/sys/coda/coda_namecache.h,v 1.1 1998/08/29 21:26:46 rvb Exp $ */
     31  1.1  rvb 
     32  1.1  rvb /*
     33  1.1  rvb  * Mach Operating System
     34  1.1  rvb  * Copyright (c) 1990 Carnegie-Mellon University
     35  1.1  rvb  * Copyright (c) 1989 Carnegie-Mellon University
     36  1.1  rvb  * All rights reserved.  The CMU software License Agreement specifies
     37  1.1  rvb  * the terms and conditions for use and redistribution.
     38  1.1  rvb  */
     39  1.1  rvb 
     40  1.1  rvb /*
     41  1.1  rvb  * This code was written for the Coda file system at Carnegie Mellon University.
     42  1.1  rvb  * Contributers include David Steere, James Kistler, and M. Satyanarayanan.
     43  1.1  rvb  */
     44  1.1  rvb 
     45  1.1  rvb /*
     46  1.1  rvb  * HISTORY
     47  1.1  rvb  * $Log: coda_namecache.h,v $
     48  1.1  rvb  * Revision 1.1  1998/08/29 21:26:46  rvb
     49  1.1  rvb  * Initial revision
     50  1.1  rvb  *
     51  1.1  rvb  * Revision 1.8  1998/08/28 18:12:25  rvb
     52  1.1  rvb  * Now it also works on FreeBSD -current.  This code will be
     53  1.1  rvb  * committed to the FreeBSD -current and NetBSD -current
     54  1.1  rvb  * trees.  It will then be tailored to the particular platform
     55  1.1  rvb  * by flushing conditional code.
     56  1.1  rvb  *
     57  1.1  rvb  * Revision 1.7  1998/08/18 17:05:24  rvb
     58  1.1  rvb  * Don't use __RCSID now
     59  1.1  rvb  *
     60  1.1  rvb  * Revision 1.6  1998/08/18 16:31:49  rvb
     61  1.1  rvb  * Sync the code for NetBSD -current; test on 1.3 later
     62  1.1  rvb  *
     63  1.1  rvb  * Revision 1.5  98/01/23  11:53:51  rvb
     64  1.1  rvb  * Bring RVB_CFS1_1 to HEAD
     65  1.1  rvb  *
     66  1.1  rvb  * Revision 1.4.2.1  97/12/16  12:40:23  rvb
     67  1.1  rvb  * Sync with 1.3
     68  1.1  rvb  *
     69  1.1  rvb  * Revision 1.4  97/12/05  10:39:29  rvb
     70  1.1  rvb  * Read CHANGES
     71  1.1  rvb  *
     72  1.1  rvb  * Revision 1.3.4.3  97/11/24  15:44:51  rvb
     73  1.1  rvb  * Final cfs_venus.c w/o macros, but one locking bug
     74  1.1  rvb  *
     75  1.1  rvb  * Revision 1.3.4.2  97/11/12  12:09:44  rvb
     76  1.1  rvb  * reorg pass1
     77  1.1  rvb  *
     78  1.1  rvb  * Revision 1.3.4.1  97/11/06  21:06:05  rvb
     79  1.1  rvb  * don't include headers in headers
     80  1.1  rvb  *
     81  1.1  rvb  * Revision 1.3  97/08/05  11:08:19  lily
     82  1.1  rvb  * Removed cfsnc_replace, replaced it with a cfs_find, unhash, and
     83  1.1  rvb  * rehash.  This fixes a cnode leak and a bug in which the fid is
     84  1.1  rvb  * not actually replaced.  (cfs_namecache.c, cfsnc.h, cfs_subr.c)
     85  1.1  rvb  *
     86  1.1  rvb  * Revision 1.2  96/01/02  16:57:19  bnoble
     87  1.1  rvb  * Added support for Coda MiniCache and raw inode calls (final commit)
     88  1.1  rvb  *
     89  1.1  rvb  * Revision 1.1.2.1  1995/12/20 01:57:45  bnoble
     90  1.1  rvb  * Added CFS-specific files
     91  1.1  rvb  *
     92  1.1  rvb  * Revision 3.1.1.1  1995/03/04  19:08:22  bnoble
     93  1.1  rvb  * Branch for NetBSD port revisions
     94  1.1  rvb  *
     95  1.1  rvb  * Revision 3.1  1995/03/04  19:08:21  bnoble
     96  1.1  rvb  * Bump to major revision 3 to prepare for NetBSD port
     97  1.1  rvb  *
     98  1.1  rvb  * Revision 2.2  1994/08/28  19:37:39  luqi
     99  1.1  rvb  * Add a new CFS_REPLACE call to allow venus to replace a ViceFid in the
    100  1.1  rvb  * mini-cache.
    101  1.1  rvb  *
    102  1.1  rvb  * In "cfs.h":
    103  1.1  rvb  * Add CFS_REPLACE decl.
    104  1.1  rvb  *
    105  1.1  rvb  * In "cfs_namecache.c":
    106  1.1  rvb  * Add routine cfsnc_replace.
    107  1.1  rvb  *
    108  1.1  rvb  * In "cfs_subr.c":
    109  1.1  rvb  * Add case-statement to process CFS_REPLACE.
    110  1.1  rvb  *
    111  1.1  rvb  * In "cfsnc.h":
    112  1.1  rvb  * Add decl for CFSNC_REPLACE.
    113  1.1  rvb  *
    114  1.1  rvb  * Revision 2.1  94/07/21  16:25:27  satya
    115  1.1  rvb  * Conversion to C++ 3.0; start of Coda Release 2.0
    116  1.1  rvb  *
    117  1.1  rvb  * Revision 1.2  92/10/27  17:58:34  lily
    118  1.1  rvb  * merge kernel/latest and alpha/src/cfs
    119  1.1  rvb  *
    120  1.1  rvb  * Revision 2.2  90/07/05  11:27:04  mrt
    121  1.1  rvb  * 	Created for the Coda File System.
    122  1.1  rvb  * 	[90/05/23            dcs]
    123  1.1  rvb  *
    124  1.1  rvb  * Revision 1.4  90/05/31  17:02:12  dcs
    125  1.1  rvb  * Prepare for merge with facilities kernel.
    126  1.1  rvb  *
    127  1.1  rvb  *
    128  1.1  rvb  */
    129  1.1  rvb #ifndef _CFSNC_HEADER_
    130  1.1  rvb #define _CFSNC_HEADER_
    131  1.1  rvb 
    132  1.1  rvb /*
    133  1.1  rvb  * Cfs constants
    134  1.1  rvb  */
    135  1.1  rvb #define CFSNC_NAMELEN	15		/* longest name stored in cache */
    136  1.1  rvb #define CFSNC_CACHESIZE 256		/* Default cache size */
    137  1.1  rvb #define CFSNC_HASHSIZE	64		/* Must be multiple of 2 */
    138  1.1  rvb 
    139  1.1  rvb /*
    140  1.1  rvb  * Hash function for the primary hash.
    141  1.1  rvb  */
    142  1.1  rvb 
    143  1.1  rvb /*
    144  1.1  rvb  * First try -- (first + last letters + length + (int)cp) mod size
    145  1.1  rvb  * 2nd try -- same, except dir fid.vnode instead of cp
    146  1.1  rvb  */
    147  1.1  rvb 
    148  1.1  rvb #ifdef	oldhash
    149  1.1  rvb #define CFSNC_HASH(name, namelen, cp) \
    150  1.1  rvb 	((name[0] + name[namelen-1] + namelen + (int)(cp)) & (cfsnc_hashsize-1))
    151  1.1  rvb #else
    152  1.1  rvb #define CFSNC_HASH(name, namelen, cp) \
    153  1.1  rvb 	((name[0] + (name[namelen-1]<<4) + namelen + (((int)cp)>>8)) & (cfsnc_hashsize-1))
    154  1.1  rvb #endif
    155  1.1  rvb 
    156  1.1  rvb #define CFS_NAMEMATCH(cp, name, namelen, dcp) \
    157  1.1  rvb 	((namelen == cp->namelen) && (dcp == cp->dcp) && \
    158  1.1  rvb 		 (bcmp(cp->name,name,namelen) == 0))
    159  1.1  rvb 
    160  1.1  rvb /*
    161  1.1  rvb  * Functions to modify the hash and lru chains.
    162  1.1  rvb  * insque and remque assume that the pointers are the first thing
    163  1.1  rvb  * in the list node, thus the trickery for lru.
    164  1.1  rvb  */
    165  1.1  rvb 
    166  1.1  rvb #define CFSNC_HSHINS(elem, pred)	insque(elem,pred)
    167  1.1  rvb #define CFSNC_HSHREM(elem)		remque(elem)
    168  1.1  rvb #define CFSNC_HSHNUL(elem)		(elem)->hash_next = \
    169  1.1  rvb 					(elem)->hash_prev = (elem)
    170  1.1  rvb 
    171  1.1  rvb #define CFSNC_LRUINS(elem, pred)	insque(LRU_PART(elem), LRU_PART(pred))
    172  1.1  rvb #define CFSNC_LRUREM(elem)		remque(LRU_PART(elem));
    173  1.1  rvb #define CFSNC_LRUGET(lruhead)		LRU_TOP((lruhead).lru_prev)
    174  1.1  rvb 
    175  1.1  rvb #define CFSNC_VALID(cncp)	(cncp->dcp != (struct cnode *)0)
    176  1.1  rvb 
    177  1.1  rvb #define LRU_PART(cncp)			(struct cfscache *) \
    178  1.1  rvb 				((char *)cncp + (2*sizeof(struct cfscache *)))
    179  1.1  rvb #define LRU_TOP(cncp)				(struct cfscache *) \
    180  1.1  rvb 			((char *)cncp - (2*sizeof(struct cfscache *)))
    181  1.1  rvb #define DATA_PART(cncp)				(struct cfscache *) \
    182  1.1  rvb 			((char *)cncp + (4*sizeof(struct cfscache *)))
    183  1.1  rvb #define DATA_SIZE	(sizeof(struct cfscache)-(4*sizeof(struct cfscache *)))
    184  1.1  rvb 
    185  1.1  rvb /*
    186  1.1  rvb  * Structure for an element in the CFS Name Cache.
    187  1.1  rvb  * NOTE: I use the position of arguments and their size in the
    188  1.1  rvb  * implementation of the functions CFSNC_LRUINS, CFSNC_LRUREM, and
    189  1.1  rvb  * DATA_PART.
    190  1.1  rvb  */
    191  1.1  rvb 
    192  1.1  rvb struct cfscache {
    193  1.1  rvb 	struct cfscache	*hash_next,*hash_prev;	/* Hash list */
    194  1.1  rvb 	struct cfscache	*lru_next, *lru_prev;	/* LRU list */
    195  1.1  rvb 	struct cnode	*cp;			/* vnode of the file */
    196  1.1  rvb 	struct cnode	*dcp;			/* parent's cnode */
    197  1.1  rvb 	struct ucred	*cred;			/* user credentials */
    198  1.1  rvb 	char		name[CFSNC_NAMELEN];	/* segment name */
    199  1.1  rvb 	int		namelen;		/* length of name */
    200  1.1  rvb };
    201  1.1  rvb 
    202  1.1  rvb struct	cfslru {		/* Start of LRU chain */
    203  1.1  rvb 	char *dummy1, *dummy2;			/* place holders */
    204  1.1  rvb 	struct cfscache *lru_next, *lru_prev;   /* position of pointers is important */
    205  1.1  rvb };
    206  1.1  rvb 
    207  1.1  rvb 
    208  1.1  rvb struct cfshash {		/* Start of Hash chain */
    209  1.1  rvb 	struct cfscache *hash_next, *hash_prev; /* NOTE: chain pointers must be first */
    210  1.1  rvb         int length;                             /* used for tuning purposes */
    211  1.1  rvb };
    212  1.1  rvb 
    213  1.1  rvb 
    214  1.1  rvb /*
    215  1.1  rvb  * Symbols to aid in debugging the namecache code. Assumes the existence
    216  1.1  rvb  * of the variable cfsnc_debug, which is defined in cfs_namecache.c
    217  1.1  rvb  */
    218  1.1  rvb #define CFSNC_DEBUG(N, STMT)     { if (cfsnc_debug & (1 <<N)) { STMT } }
    219  1.1  rvb 
    220  1.1  rvb /* Prototypes of functions exported within cfs */
    221  1.1  rvb extern void cfsnc_init(void);
    222  1.1  rvb extern void cfsnc_enter(struct cnode *, const char *, int, struct ucred *, struct cnode *);
    223  1.1  rvb extern struct cnode *cfsnc_lookup(struct cnode *, const char *, int, struct ucred *);
    224  1.1  rvb 
    225  1.1  rvb extern void cfsnc_zapParentfid(ViceFid *, enum dc_status);
    226  1.1  rvb extern void cfsnc_zapfid(ViceFid *, enum dc_status);
    227  1.1  rvb extern void cfsnc_zapvnode(ViceFid *, struct ucred *, enum dc_status);
    228  1.1  rvb extern void cfsnc_zapfile(struct cnode *, const char *, int);
    229  1.1  rvb extern void cfsnc_purge_user(vuid_t, enum dc_status);
    230  1.1  rvb extern void cfsnc_flush(enum dc_status);
    231  1.1  rvb 
    232  1.1  rvb extern void print_cfsnc(void);
    233  1.1  rvb extern void cfsnc_gather_stats(void);
    234  1.1  rvb extern int  cfsnc_resize(int, int, enum dc_status);
    235  1.1  rvb extern void cfsnc_name(struct cnode *cp);
    236  1.1  rvb 
    237  1.1  rvb /*
    238  1.1  rvb  * Structure to contain statistics on the cache usage
    239  1.1  rvb  */
    240  1.1  rvb 
    241  1.1  rvb struct cfsnc_statistics {
    242  1.1  rvb 	unsigned	hits;
    243  1.1  rvb 	unsigned	misses;
    244  1.1  rvb 	unsigned	enters;
    245  1.1  rvb 	unsigned	dbl_enters;
    246  1.1  rvb 	unsigned	long_name_enters;
    247  1.1  rvb 	unsigned	long_name_lookups;
    248  1.1  rvb 	unsigned	long_remove;
    249  1.1  rvb 	unsigned	lru_rm;
    250  1.1  rvb 	unsigned	zapPfids;
    251  1.1  rvb 	unsigned	zapFids;
    252  1.1  rvb 	unsigned	zapFile;
    253  1.1  rvb 	unsigned	zapUsers;
    254  1.1  rvb 	unsigned	Flushes;
    255  1.1  rvb 	unsigned        Sum_bucket_len;
    256  1.1  rvb 	unsigned        Sum2_bucket_len;
    257  1.1  rvb 	unsigned        Max_bucket_len;
    258  1.1  rvb 	unsigned        Num_zero_len;
    259  1.1  rvb 	unsigned        Search_len;
    260  1.1  rvb };
    261  1.1  rvb 
    262  1.1  rvb #define CFSNC_FIND		((u_long) 1)
    263  1.1  rvb #define CFSNC_REMOVE		((u_long) 2)
    264  1.1  rvb #define CFSNC_INIT		((u_long) 3)
    265  1.1  rvb #define CFSNC_ENTER		((u_long) 4)
    266  1.1  rvb #define CFSNC_LOOKUP		((u_long) 5)
    267  1.1  rvb #define CFSNC_ZAPPFID		((u_long) 6)
    268  1.1  rvb #define CFSNC_ZAPFID		((u_long) 7)
    269  1.1  rvb #define CFSNC_ZAPVNODE		((u_long) 8)
    270  1.1  rvb #define CFSNC_ZAPFILE		((u_long) 9)
    271  1.1  rvb #define CFSNC_PURGEUSER		((u_long) 10)
    272  1.1  rvb #define CFSNC_FLUSH		((u_long) 11)
    273  1.1  rvb #define CFSNC_PRINTCFSNC	((u_long) 12)
    274           #define CFSNC_PRINTSTATS	((u_long) 13)
    275           
    276           #endif /* _CFSNC_HEADER_ */
    277