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