xref: /titanic_44/usr/src/cmd/fs.d/cachefs/cfsd/cfsd_maptbl.c (revision 7c478bd95313f5f23a4c958a745db2134aa03244)
1*7c478bd9Sstevel@tonic-gate /*
2*7c478bd9Sstevel@tonic-gate  * CDDL HEADER START
3*7c478bd9Sstevel@tonic-gate  *
4*7c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5*7c478bd9Sstevel@tonic-gate  * Common Development and Distribution License, Version 1.0 only
6*7c478bd9Sstevel@tonic-gate  * (the "License").  You may not use this file except in compliance
7*7c478bd9Sstevel@tonic-gate  * with the License.
8*7c478bd9Sstevel@tonic-gate  *
9*7c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*7c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
11*7c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
12*7c478bd9Sstevel@tonic-gate  * and limitations under the License.
13*7c478bd9Sstevel@tonic-gate  *
14*7c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
15*7c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*7c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
17*7c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
18*7c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
19*7c478bd9Sstevel@tonic-gate  *
20*7c478bd9Sstevel@tonic-gate  * CDDL HEADER END
21*7c478bd9Sstevel@tonic-gate  */
22*7c478bd9Sstevel@tonic-gate /*
23*7c478bd9Sstevel@tonic-gate  * Copyright 1994-2002 Sun Microsystems, Inc.  All rights reserved.
24*7c478bd9Sstevel@tonic-gate  * Use is subject to license terms.
25*7c478bd9Sstevel@tonic-gate  */
26*7c478bd9Sstevel@tonic-gate 
27*7c478bd9Sstevel@tonic-gate #pragma ident	"%Z%%M%	%I%	%E% SMI"
28*7c478bd9Sstevel@tonic-gate 
29*7c478bd9Sstevel@tonic-gate /*
30*7c478bd9Sstevel@tonic-gate  * Methods of the cfsd_maptbl classes.
31*7c478bd9Sstevel@tonic-gate  */
32*7c478bd9Sstevel@tonic-gate 
33*7c478bd9Sstevel@tonic-gate #include <stdio.h>
34*7c478bd9Sstevel@tonic-gate #include <stdlib.h>
35*7c478bd9Sstevel@tonic-gate #include <stddef.h>
36*7c478bd9Sstevel@tonic-gate #include <string.h>
37*7c478bd9Sstevel@tonic-gate #include <synch.h>
38*7c478bd9Sstevel@tonic-gate #include <unistd.h>
39*7c478bd9Sstevel@tonic-gate #include <fcntl.h>
40*7c478bd9Sstevel@tonic-gate #include <errno.h>
41*7c478bd9Sstevel@tonic-gate #include <sys/utsname.h>
42*7c478bd9Sstevel@tonic-gate #include <sys/vfs.h>
43*7c478bd9Sstevel@tonic-gate #include <sys/cred.h>
44*7c478bd9Sstevel@tonic-gate #include <sys/param.h>
45*7c478bd9Sstevel@tonic-gate #include <sys/types.h>
46*7c478bd9Sstevel@tonic-gate #include <sys/stat.h>
47*7c478bd9Sstevel@tonic-gate #include <sys/mman.h>
48*7c478bd9Sstevel@tonic-gate #include <sys/fs/cachefs_fs.h>
49*7c478bd9Sstevel@tonic-gate #include <sys/fs/cachefs_dlog.h>
50*7c478bd9Sstevel@tonic-gate #include <mdbug/mdbug.h>
51*7c478bd9Sstevel@tonic-gate #include "cfsd.h"
52*7c478bd9Sstevel@tonic-gate #include "cfsd_maptbl.h"
53*7c478bd9Sstevel@tonic-gate 
54*7c478bd9Sstevel@tonic-gate /*
55*7c478bd9Sstevel@tonic-gate  *			cfsd_maptbl_create
56*7c478bd9Sstevel@tonic-gate  *
57*7c478bd9Sstevel@tonic-gate  * Description:
58*7c478bd9Sstevel@tonic-gate  *	Constructor for the cfsd_maptbl class.
59*7c478bd9Sstevel@tonic-gate  *	Just does some setup not much else.
60*7c478bd9Sstevel@tonic-gate  * Arguments:
61*7c478bd9Sstevel@tonic-gate  * Returns:
62*7c478bd9Sstevel@tonic-gate  * Preconditions:
63*7c478bd9Sstevel@tonic-gate  */
64*7c478bd9Sstevel@tonic-gate cfsd_maptbl_object_t *
cfsd_maptbl_create(void)65*7c478bd9Sstevel@tonic-gate cfsd_maptbl_create(void)
66*7c478bd9Sstevel@tonic-gate {
67*7c478bd9Sstevel@tonic-gate 	cfsd_maptbl_object_t *maptbl_object_p;
68*7c478bd9Sstevel@tonic-gate 
69*7c478bd9Sstevel@tonic-gate 	dbug_enter("cfsd_maptbl_create");
70*7c478bd9Sstevel@tonic-gate 
71*7c478bd9Sstevel@tonic-gate 	maptbl_object_p = cfsd_calloc(sizeof (cfsd_maptbl_object_t));
72*7c478bd9Sstevel@tonic-gate 
73*7c478bd9Sstevel@tonic-gate 	maptbl_object_p->i_fid = -1;
74*7c478bd9Sstevel@tonic-gate 	maptbl_object_p->i_pa = NULL;
75*7c478bd9Sstevel@tonic-gate 	maptbl_object_p->i_paoff = 0;
76*7c478bd9Sstevel@tonic-gate 	maptbl_object_p->i_paend = 0;
77*7c478bd9Sstevel@tonic-gate 	maptbl_object_p->i_palen = 0;
78*7c478bd9Sstevel@tonic-gate 	dbug_leave("cfsd_maptbl_create");
79*7c478bd9Sstevel@tonic-gate 	return (maptbl_object_p);
80*7c478bd9Sstevel@tonic-gate }
81*7c478bd9Sstevel@tonic-gate 
82*7c478bd9Sstevel@tonic-gate /*
83*7c478bd9Sstevel@tonic-gate  *			cfsd_maptbl_destroy
84*7c478bd9Sstevel@tonic-gate  *
85*7c478bd9Sstevel@tonic-gate  * Description:
86*7c478bd9Sstevel@tonic-gate  *	Destructor for the cfsd_maptbl class.
87*7c478bd9Sstevel@tonic-gate  * Arguments:
88*7c478bd9Sstevel@tonic-gate  * Returns:
89*7c478bd9Sstevel@tonic-gate  * Preconditions:
90*7c478bd9Sstevel@tonic-gate  */
91*7c478bd9Sstevel@tonic-gate void
cfsd_maptbl_destroy(cfsd_maptbl_object_t * maptbl_object_p)92*7c478bd9Sstevel@tonic-gate cfsd_maptbl_destroy(cfsd_maptbl_object_t *maptbl_object_p)
93*7c478bd9Sstevel@tonic-gate {
94*7c478bd9Sstevel@tonic-gate 	dbug_enter("cfsd_maptbl_destroy");
95*7c478bd9Sstevel@tonic-gate 	dbug_precond(maptbl_object_p);
96*7c478bd9Sstevel@tonic-gate 	maptbl_teardown(maptbl_object_p);
97*7c478bd9Sstevel@tonic-gate 	cfsd_free(maptbl_object_p);
98*7c478bd9Sstevel@tonic-gate 	dbug_leave("cfsd_maptbl_destroy");
99*7c478bd9Sstevel@tonic-gate }
100*7c478bd9Sstevel@tonic-gate 
101*7c478bd9Sstevel@tonic-gate /*
102*7c478bd9Sstevel@tonic-gate  *			maptbl_domap
103*7c478bd9Sstevel@tonic-gate  *
104*7c478bd9Sstevel@tonic-gate  * Description:
105*7c478bd9Sstevel@tonic-gate  *	Maps in the specified section of the file.
106*7c478bd9Sstevel@tonic-gate  * Arguments:
107*7c478bd9Sstevel@tonic-gate  *	off	The offset to map in.  Must be i_pagesize aligned.
108*7c478bd9Sstevel@tonic-gate  * Returns:
109*7c478bd9Sstevel@tonic-gate  *	Returns 0 for success or an errno value on failure.
110*7c478bd9Sstevel@tonic-gate  * Preconditions:
111*7c478bd9Sstevel@tonic-gate  */
112*7c478bd9Sstevel@tonic-gate int
maptbl_domap(cfsd_maptbl_object_t * maptbl_object_p,off_t off)113*7c478bd9Sstevel@tonic-gate maptbl_domap(cfsd_maptbl_object_t *maptbl_object_p, off_t off)
114*7c478bd9Sstevel@tonic-gate {
115*7c478bd9Sstevel@tonic-gate 	int xx;
116*7c478bd9Sstevel@tonic-gate 	int len;
117*7c478bd9Sstevel@tonic-gate 
118*7c478bd9Sstevel@tonic-gate 	dbug_enter("maptbl_domap");
119*7c478bd9Sstevel@tonic-gate 	dbug_precond(maptbl_object_p);
120*7c478bd9Sstevel@tonic-gate 	dbug_precond(maptbl_object_p->i_fid >= 0);
121*7c478bd9Sstevel@tonic-gate 
122*7c478bd9Sstevel@tonic-gate 	len = maptbl_object_p->i_maplen;
123*7c478bd9Sstevel@tonic-gate 
124*7c478bd9Sstevel@tonic-gate 	maptbl_object_p->i_stat_mapmove++;
125*7c478bd9Sstevel@tonic-gate 
126*7c478bd9Sstevel@tonic-gate 	/* destroy old mapping if it exists */
127*7c478bd9Sstevel@tonic-gate 	if (maptbl_object_p->i_pa) {
128*7c478bd9Sstevel@tonic-gate 		/* determine how far we have to move the map */
129*7c478bd9Sstevel@tonic-gate 		maptbl_object_p->i_stat_mapdist +=
130*7c478bd9Sstevel@tonic-gate 		    abs(maptbl_object_p->i_paoff - off);
131*7c478bd9Sstevel@tonic-gate 
132*7c478bd9Sstevel@tonic-gate 		/* remove the map */
133*7c478bd9Sstevel@tonic-gate 		xx = munmap(maptbl_object_p->i_pa, maptbl_object_p->i_palen);
134*7c478bd9Sstevel@tonic-gate 		if (xx == -1) {
135*7c478bd9Sstevel@tonic-gate 			xx = errno;
136*7c478bd9Sstevel@tonic-gate 			dbug_print(("error", "Could not unmap %s, %d, %p, %d",
137*7c478bd9Sstevel@tonic-gate 			    maptbl_object_p->i_name, xx, maptbl_object_p->i_pa,
138*7c478bd9Sstevel@tonic-gate 			    maptbl_object_p->i_palen));
139*7c478bd9Sstevel@tonic-gate 		}
140*7c478bd9Sstevel@tonic-gate 		maptbl_object_p->i_pa = NULL;
141*7c478bd9Sstevel@tonic-gate 		maptbl_object_p->i_palen = 0;
142*7c478bd9Sstevel@tonic-gate 		maptbl_object_p->i_paoff = 0;
143*7c478bd9Sstevel@tonic-gate 		maptbl_object_p->i_paend = 0;
144*7c478bd9Sstevel@tonic-gate 	}
145*7c478bd9Sstevel@tonic-gate 
146*7c478bd9Sstevel@tonic-gate 	/* do the mapping */
147*7c478bd9Sstevel@tonic-gate 	maptbl_object_p->i_pa =
148*7c478bd9Sstevel@tonic-gate 	    mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED,
149*7c478bd9Sstevel@tonic-gate 	    maptbl_object_p->i_fid, off);
150*7c478bd9Sstevel@tonic-gate 	if (maptbl_object_p->i_pa == MAP_FAILED) {
151*7c478bd9Sstevel@tonic-gate 		xx = errno;
152*7c478bd9Sstevel@tonic-gate 		dbug_print(("error",
153*7c478bd9Sstevel@tonic-gate 		    "Could not map %s, error %d, off %d, len %d",
154*7c478bd9Sstevel@tonic-gate 		    maptbl_object_p->i_name, xx, off, len));
155*7c478bd9Sstevel@tonic-gate 		maptbl_object_p->i_pa = NULL;
156*7c478bd9Sstevel@tonic-gate 		dbug_leave("maptbl_domap");
157*7c478bd9Sstevel@tonic-gate 		return (xx);
158*7c478bd9Sstevel@tonic-gate 	}
159*7c478bd9Sstevel@tonic-gate 
160*7c478bd9Sstevel@tonic-gate 	maptbl_object_p->i_palen = len;
161*7c478bd9Sstevel@tonic-gate 	maptbl_object_p->i_paoff = off;
162*7c478bd9Sstevel@tonic-gate 	maptbl_object_p->i_paend = off + len - 1;
163*7c478bd9Sstevel@tonic-gate 	dbug_leave("maptbl_domap");
164*7c478bd9Sstevel@tonic-gate 	return (0);
165*7c478bd9Sstevel@tonic-gate }
166*7c478bd9Sstevel@tonic-gate 
167*7c478bd9Sstevel@tonic-gate /*
168*7c478bd9Sstevel@tonic-gate  *			maptbl_getaddr
169*7c478bd9Sstevel@tonic-gate  *
170*7c478bd9Sstevel@tonic-gate  * Description:
171*7c478bd9Sstevel@tonic-gate  *	Returns an address of a particular entry in the file.
172*7c478bd9Sstevel@tonic-gate  * Arguments:
173*7c478bd9Sstevel@tonic-gate  *	index
174*7c478bd9Sstevel@tonic-gate  * Returns:
175*7c478bd9Sstevel@tonic-gate  *	Returns NULL for a failure with the mapping file.
176*7c478bd9Sstevel@tonic-gate  * Preconditions:
177*7c478bd9Sstevel@tonic-gate  */
178*7c478bd9Sstevel@tonic-gate caddr_t
maptbl_getaddr(cfsd_maptbl_object_t * maptbl_object_p,int index)179*7c478bd9Sstevel@tonic-gate maptbl_getaddr(cfsd_maptbl_object_t *maptbl_object_p, int index)
180*7c478bd9Sstevel@tonic-gate {
181*7c478bd9Sstevel@tonic-gate 	off_t start;
182*7c478bd9Sstevel@tonic-gate 	off_t end;
183*7c478bd9Sstevel@tonic-gate 	caddr_t pa;
184*7c478bd9Sstevel@tonic-gate 
185*7c478bd9Sstevel@tonic-gate 	dbug_enter("maptbl_getaddr");
186*7c478bd9Sstevel@tonic-gate 	dbug_precond(maptbl_object_p);
187*7c478bd9Sstevel@tonic-gate 	dbug_precond(index < maptbl_object_p->i_entries);
188*7c478bd9Sstevel@tonic-gate 
189*7c478bd9Sstevel@tonic-gate 	/* find the boundaries of the entry */
190*7c478bd9Sstevel@tonic-gate 	start = index * sizeof (struct cfs_dlog_mapping_space);
191*7c478bd9Sstevel@tonic-gate 	end = start + sizeof (struct cfs_dlog_mapping_space) - 1;
192*7c478bd9Sstevel@tonic-gate 
193*7c478bd9Sstevel@tonic-gate 	/* map the entry in if necessary */
194*7c478bd9Sstevel@tonic-gate 	if ((start < maptbl_object_p->i_paoff) ||
195*7c478bd9Sstevel@tonic-gate 		(maptbl_object_p->i_paend < end)) {
196*7c478bd9Sstevel@tonic-gate 		if (maptbl_domap(maptbl_object_p,
197*7c478bd9Sstevel@tonic-gate 		    start & maptbl_object_p->i_pagemask)) {
198*7c478bd9Sstevel@tonic-gate 			dbug_leave("maptbl_getaddr");
199*7c478bd9Sstevel@tonic-gate 			return (NULL);
200*7c478bd9Sstevel@tonic-gate 		}
201*7c478bd9Sstevel@tonic-gate 	}
202*7c478bd9Sstevel@tonic-gate 
203*7c478bd9Sstevel@tonic-gate 	/* make an address and return it */
204*7c478bd9Sstevel@tonic-gate 	pa = maptbl_object_p->i_pa + (start - maptbl_object_p->i_paoff);
205*7c478bd9Sstevel@tonic-gate 	dbug_leave("maptbl_getaddr");
206*7c478bd9Sstevel@tonic-gate 	return (pa);
207*7c478bd9Sstevel@tonic-gate }
208*7c478bd9Sstevel@tonic-gate 
209*7c478bd9Sstevel@tonic-gate /*
210*7c478bd9Sstevel@tonic-gate  *			maptbl_cidhashaddr
211*7c478bd9Sstevel@tonic-gate  *
212*7c478bd9Sstevel@tonic-gate  * Description:
213*7c478bd9Sstevel@tonic-gate  *	Finds the address of the specified cid by hashing to
214*7c478bd9Sstevel@tonic-gate  *	the appropriate entry.  If the cid does not already
215*7c478bd9Sstevel@tonic-gate  *	exist in the file, then the address of where it should
216*7c478bd9Sstevel@tonic-gate  *	reside is returned.
217*7c478bd9Sstevel@tonic-gate  * Arguments:
218*7c478bd9Sstevel@tonic-gate  *	cid
219*7c478bd9Sstevel@tonic-gate  *	addrp
220*7c478bd9Sstevel@tonic-gate  * Returns:
221*7c478bd9Sstevel@tonic-gate  *	Returns 0 for success, 1 if entry not found, -1 if an
222*7c478bd9Sstevel@tonic-gate  *	error occurs in the mapping file.
223*7c478bd9Sstevel@tonic-gate  * Preconditions:
224*7c478bd9Sstevel@tonic-gate  */
225*7c478bd9Sstevel@tonic-gate int
maptbl_cidhashaddr(cfsd_maptbl_object_t * maptbl_object_p,cfs_cid_t cid,caddr_t * addrp)226*7c478bd9Sstevel@tonic-gate maptbl_cidhashaddr(cfsd_maptbl_object_t *maptbl_object_p,
227*7c478bd9Sstevel@tonic-gate 	cfs_cid_t cid,
228*7c478bd9Sstevel@tonic-gate 	caddr_t *addrp)
229*7c478bd9Sstevel@tonic-gate {
230*7c478bd9Sstevel@tonic-gate 	ino64_t *pa;
231*7c478bd9Sstevel@tonic-gate 	int index;
232*7c478bd9Sstevel@tonic-gate 	ino64_t fileno;
233*7c478bd9Sstevel@tonic-gate 	int start_index;
234*7c478bd9Sstevel@tonic-gate 
235*7c478bd9Sstevel@tonic-gate 	dbug_enter("maptbl_cidhashaddr");
236*7c478bd9Sstevel@tonic-gate 	dbug_precond(maptbl_object_p);
237*7c478bd9Sstevel@tonic-gate 	dbug_precond(addrp);
238*7c478bd9Sstevel@tonic-gate 
239*7c478bd9Sstevel@tonic-gate 	maptbl_object_p->i_stat_requests++;
240*7c478bd9Sstevel@tonic-gate 
241*7c478bd9Sstevel@tonic-gate 	/* get the index from the first hash function */
242*7c478bd9Sstevel@tonic-gate 	index = maptbl_hash1(maptbl_object_p, cid);
243*7c478bd9Sstevel@tonic-gate 
244*7c478bd9Sstevel@tonic-gate 	maptbl_object_p->i_stat_probes++;
245*7c478bd9Sstevel@tonic-gate 
246*7c478bd9Sstevel@tonic-gate 	/* get the address of the entry */
247*7c478bd9Sstevel@tonic-gate 	pa = (ino64_t *)maptbl_getaddr(maptbl_object_p, index);
248*7c478bd9Sstevel@tonic-gate 	if (pa == NULL) {
249*7c478bd9Sstevel@tonic-gate 		dbug_leave("maptbl_cidhashaddr");
250*7c478bd9Sstevel@tonic-gate 		return (-1);
251*7c478bd9Sstevel@tonic-gate 	}
252*7c478bd9Sstevel@tonic-gate 	fileno = *pa;
253*7c478bd9Sstevel@tonic-gate 
254*7c478bd9Sstevel@tonic-gate 	/* check for match */
255*7c478bd9Sstevel@tonic-gate 	if (fileno == cid.cid_fileno) {
256*7c478bd9Sstevel@tonic-gate 		*addrp = (caddr_t)pa;
257*7c478bd9Sstevel@tonic-gate 		dbug_leave("maptbl_cidhashaddr");
258*7c478bd9Sstevel@tonic-gate 		return (0);
259*7c478bd9Sstevel@tonic-gate 	}
260*7c478bd9Sstevel@tonic-gate 
261*7c478bd9Sstevel@tonic-gate 	/* check for not found */
262*7c478bd9Sstevel@tonic-gate 	if (fileno == 0) {
263*7c478bd9Sstevel@tonic-gate 		*addrp = (caddr_t)pa;
264*7c478bd9Sstevel@tonic-gate 		dbug_leave("maptbl_cidhashaddr");
265*7c478bd9Sstevel@tonic-gate 		return (1);
266*7c478bd9Sstevel@tonic-gate 	}
267*7c478bd9Sstevel@tonic-gate 
268*7c478bd9Sstevel@tonic-gate 	/* get the index from the second hash function */
269*7c478bd9Sstevel@tonic-gate 	index = maptbl_hash2(maptbl_object_p, cid, index);
270*7c478bd9Sstevel@tonic-gate 
271*7c478bd9Sstevel@tonic-gate 	/* do a linear search for a match or empty entry */
272*7c478bd9Sstevel@tonic-gate 	start_index = index;
273*7c478bd9Sstevel@tonic-gate 	do {
274*7c478bd9Sstevel@tonic-gate 		maptbl_object_p->i_stat_probes++;
275*7c478bd9Sstevel@tonic-gate 
276*7c478bd9Sstevel@tonic-gate 		/* get the address of the entry */
277*7c478bd9Sstevel@tonic-gate 		pa = (ino64_t *)maptbl_getaddr(maptbl_object_p, index);
278*7c478bd9Sstevel@tonic-gate 		if (pa == NULL) {
279*7c478bd9Sstevel@tonic-gate 			dbug_leave("maptbl_cidhashaddr");
280*7c478bd9Sstevel@tonic-gate 			return (-1);
281*7c478bd9Sstevel@tonic-gate 		}
282*7c478bd9Sstevel@tonic-gate 		fileno = *pa;
283*7c478bd9Sstevel@tonic-gate 
284*7c478bd9Sstevel@tonic-gate 		/* check for match */
285*7c478bd9Sstevel@tonic-gate 		if (fileno == cid.cid_fileno) {
286*7c478bd9Sstevel@tonic-gate 			*addrp = (caddr_t)pa;
287*7c478bd9Sstevel@tonic-gate 			dbug_leave("maptbl_cidhashaddr");
288*7c478bd9Sstevel@tonic-gate 			return (0);
289*7c478bd9Sstevel@tonic-gate 		}
290*7c478bd9Sstevel@tonic-gate 
291*7c478bd9Sstevel@tonic-gate 		/* check for not found */
292*7c478bd9Sstevel@tonic-gate 		if (fileno == 0) {
293*7c478bd9Sstevel@tonic-gate 			*addrp = (caddr_t)pa;
294*7c478bd9Sstevel@tonic-gate 			dbug_leave("maptbl_cidhashaddr");
295*7c478bd9Sstevel@tonic-gate 			return (1);
296*7c478bd9Sstevel@tonic-gate 		}
297*7c478bd9Sstevel@tonic-gate 
298*7c478bd9Sstevel@tonic-gate 		/* move to the next entry */
299*7c478bd9Sstevel@tonic-gate 		index++;
300*7c478bd9Sstevel@tonic-gate 		index = index % maptbl_object_p->i_entries;
301*7c478bd9Sstevel@tonic-gate 	} while (start_index != index);
302*7c478bd9Sstevel@tonic-gate 
303*7c478bd9Sstevel@tonic-gate 	/* table full, this is bad */
304*7c478bd9Sstevel@tonic-gate 	dbug_print(("error", "Table is full"));
305*7c478bd9Sstevel@tonic-gate 	dbug_leave("maptbl_cidhashaddr");
306*7c478bd9Sstevel@tonic-gate 	return (-1);
307*7c478bd9Sstevel@tonic-gate }
308*7c478bd9Sstevel@tonic-gate 
309*7c478bd9Sstevel@tonic-gate /*
310*7c478bd9Sstevel@tonic-gate  *			maptbl_hash1
311*7c478bd9Sstevel@tonic-gate  *
312*7c478bd9Sstevel@tonic-gate  * Description:
313*7c478bd9Sstevel@tonic-gate  *	Hashes a cid into an index into the table.
314*7c478bd9Sstevel@tonic-gate  * Arguments:
315*7c478bd9Sstevel@tonic-gate  *	cid
316*7c478bd9Sstevel@tonic-gate  * Returns:
317*7c478bd9Sstevel@tonic-gate  *	Returns the index.
318*7c478bd9Sstevel@tonic-gate  * Preconditions:
319*7c478bd9Sstevel@tonic-gate  */
320*7c478bd9Sstevel@tonic-gate int
maptbl_hash1(cfsd_maptbl_object_t * maptbl_object_p,cfs_cid_t cid)321*7c478bd9Sstevel@tonic-gate maptbl_hash1(cfsd_maptbl_object_t *maptbl_object_p, cfs_cid_t cid)
322*7c478bd9Sstevel@tonic-gate {
323*7c478bd9Sstevel@tonic-gate 	unsigned int xx;
324*7c478bd9Sstevel@tonic-gate 	unsigned int a, b;
325*7c478bd9Sstevel@tonic-gate 
326*7c478bd9Sstevel@tonic-gate 	dbug_precond(maptbl_object_p);
327*7c478bd9Sstevel@tonic-gate #if 0
328*7c478bd9Sstevel@tonic-gate 	xx = cid.cid_fileno % i_entries;
329*7c478bd9Sstevel@tonic-gate #else
330*7c478bd9Sstevel@tonic-gate 	a = cid.cid_fileno >> 16;
331*7c478bd9Sstevel@tonic-gate 	b = a ^ cid.cid_fileno;
332*7c478bd9Sstevel@tonic-gate 	xx = b % maptbl_object_p->i_entries;
333*7c478bd9Sstevel@tonic-gate #endif
334*7c478bd9Sstevel@tonic-gate 	return (xx);
335*7c478bd9Sstevel@tonic-gate }
336*7c478bd9Sstevel@tonic-gate 
337*7c478bd9Sstevel@tonic-gate /*
338*7c478bd9Sstevel@tonic-gate  *			maptbl_hash2
339*7c478bd9Sstevel@tonic-gate  *
340*7c478bd9Sstevel@tonic-gate  * Description:
341*7c478bd9Sstevel@tonic-gate  *	Hashes a cid into an index into the table.
342*7c478bd9Sstevel@tonic-gate  * Arguments:
343*7c478bd9Sstevel@tonic-gate  *	cid
344*7c478bd9Sstevel@tonic-gate  *	index
345*7c478bd9Sstevel@tonic-gate  * Returns:
346*7c478bd9Sstevel@tonic-gate  *	Returns the index.
347*7c478bd9Sstevel@tonic-gate  * Preconditions:
348*7c478bd9Sstevel@tonic-gate  */
349*7c478bd9Sstevel@tonic-gate int
maptbl_hash2(cfsd_maptbl_object_t * maptbl_object_p,cfs_cid_t cid,int index)350*7c478bd9Sstevel@tonic-gate maptbl_hash2(cfsd_maptbl_object_t *maptbl_object_p, cfs_cid_t cid, int index)
351*7c478bd9Sstevel@tonic-gate {
352*7c478bd9Sstevel@tonic-gate 	unsigned int xx;
353*7c478bd9Sstevel@tonic-gate 	unsigned int a, b, c, d;
354*7c478bd9Sstevel@tonic-gate 
355*7c478bd9Sstevel@tonic-gate 	dbug_precond(maptbl_object_p);
356*7c478bd9Sstevel@tonic-gate #if 0
357*7c478bd9Sstevel@tonic-gate 	a = cid.cid_fileno & 0x0ff;
358*7c478bd9Sstevel@tonic-gate 	b = (cid.cid_fileno >> 8) & 0x0ff;
359*7c478bd9Sstevel@tonic-gate 	b = cid.cid_fileno ^ a ^ b;
360*7c478bd9Sstevel@tonic-gate 	xx = b % maptbl_object_p->i_hash2mod;
361*7c478bd9Sstevel@tonic-gate #else
362*7c478bd9Sstevel@tonic-gate 	a = cid.cid_fileno & 0x0ff;
363*7c478bd9Sstevel@tonic-gate 	b = (cid.cid_fileno >> 8) & 0x0ff;
364*7c478bd9Sstevel@tonic-gate 	c = (cid.cid_fileno >> 16) & 0x0ff;
365*7c478bd9Sstevel@tonic-gate 	d = (cid.cid_fileno >> 24) & 0x0ff;
366*7c478bd9Sstevel@tonic-gate 	xx = cid.cid_fileno ^ (a << 8) ^ b ^ c ^ d;
367*7c478bd9Sstevel@tonic-gate 	xx = xx % maptbl_object_p->i_hash2mod;
368*7c478bd9Sstevel@tonic-gate #endif
369*7c478bd9Sstevel@tonic-gate 	xx = (index + xx) % maptbl_object_p->i_entries;
370*7c478bd9Sstevel@tonic-gate 	return (xx);
371*7c478bd9Sstevel@tonic-gate }
372*7c478bd9Sstevel@tonic-gate 
373*7c478bd9Sstevel@tonic-gate /*
374*7c478bd9Sstevel@tonic-gate  *			maptbl_setup
375*7c478bd9Sstevel@tonic-gate  *
376*7c478bd9Sstevel@tonic-gate  * Description:
377*7c478bd9Sstevel@tonic-gate  *	Performs setup for the cfsd_maptbl class.
378*7c478bd9Sstevel@tonic-gate  *	This routine must be called before other routines are used.
379*7c478bd9Sstevel@tonic-gate  * Arguments:
380*7c478bd9Sstevel@tonic-gate  *	filename
381*7c478bd9Sstevel@tonic-gate  * Returns:
382*7c478bd9Sstevel@tonic-gate  *	Returns 0 for success or an errno value.
383*7c478bd9Sstevel@tonic-gate  * Preconditions:
384*7c478bd9Sstevel@tonic-gate  *	precond(filename)
385*7c478bd9Sstevel@tonic-gate  */
386*7c478bd9Sstevel@tonic-gate int
maptbl_setup(cfsd_maptbl_object_t * maptbl_object_p,const char * filename)387*7c478bd9Sstevel@tonic-gate maptbl_setup(cfsd_maptbl_object_t *maptbl_object_p, const char *filename)
388*7c478bd9Sstevel@tonic-gate {
389*7c478bd9Sstevel@tonic-gate 	int xx;
390*7c478bd9Sstevel@tonic-gate 	struct stat sinfo;
391*7c478bd9Sstevel@tonic-gate 	off_t offset;
392*7c478bd9Sstevel@tonic-gate 	long *lp;
393*7c478bd9Sstevel@tonic-gate 	size_t cnt;
394*7c478bd9Sstevel@tonic-gate 	off_t size;
395*7c478bd9Sstevel@tonic-gate 
396*7c478bd9Sstevel@tonic-gate 	dbug_enter("maptbl_setup");
397*7c478bd9Sstevel@tonic-gate 	dbug_precond(maptbl_object_p);
398*7c478bd9Sstevel@tonic-gate 	dbug_precond(filename);
399*7c478bd9Sstevel@tonic-gate 
400*7c478bd9Sstevel@tonic-gate 	/* clean up from a previous setup */
401*7c478bd9Sstevel@tonic-gate 	maptbl_teardown(maptbl_object_p);
402*7c478bd9Sstevel@tonic-gate 
403*7c478bd9Sstevel@tonic-gate 	strlcpy(maptbl_object_p->i_name, filename,
404*7c478bd9Sstevel@tonic-gate 	    sizeof (maptbl_object_p->i_name));
405*7c478bd9Sstevel@tonic-gate 	dbug_print(("info", "filename %s", maptbl_object_p->i_name));
406*7c478bd9Sstevel@tonic-gate 
407*7c478bd9Sstevel@tonic-gate 	/* get the page info */
408*7c478bd9Sstevel@tonic-gate 	maptbl_object_p->i_pagesize = PAGESIZE;
409*7c478bd9Sstevel@tonic-gate 	maptbl_object_p->i_pagemask = PAGEMASK;
410*7c478bd9Sstevel@tonic-gate 	maptbl_object_p->i_maplen = maptbl_object_p->i_pagesize * 100;
411*7c478bd9Sstevel@tonic-gate 
412*7c478bd9Sstevel@tonic-gate 	/* open the file */
413*7c478bd9Sstevel@tonic-gate 	maptbl_object_p->i_fid = open(maptbl_object_p->i_name,
414*7c478bd9Sstevel@tonic-gate 	    O_RDWR | O_NONBLOCK);
415*7c478bd9Sstevel@tonic-gate 	if (maptbl_object_p->i_fid == -1) {
416*7c478bd9Sstevel@tonic-gate 		xx = errno;
417*7c478bd9Sstevel@tonic-gate 		dbug_print(("error",
418*7c478bd9Sstevel@tonic-gate 		    "Could not open %s, %d", maptbl_object_p->i_name, xx));
419*7c478bd9Sstevel@tonic-gate 		dbug_leave("maptbl_setup");
420*7c478bd9Sstevel@tonic-gate 		return (xx);
421*7c478bd9Sstevel@tonic-gate 	}
422*7c478bd9Sstevel@tonic-gate 
423*7c478bd9Sstevel@tonic-gate 	/* get the size and type of file */
424*7c478bd9Sstevel@tonic-gate 	xx = fstat(maptbl_object_p->i_fid, &sinfo);
425*7c478bd9Sstevel@tonic-gate 	if (xx) {
426*7c478bd9Sstevel@tonic-gate 		xx = errno;
427*7c478bd9Sstevel@tonic-gate 		dbug_print(("error",
428*7c478bd9Sstevel@tonic-gate 		    "Could not stat %s, %d", maptbl_object_p->i_name, xx));
429*7c478bd9Sstevel@tonic-gate 		dbug_leave("maptbl_setup");
430*7c478bd9Sstevel@tonic-gate 		return (xx);
431*7c478bd9Sstevel@tonic-gate 	}
432*7c478bd9Sstevel@tonic-gate 	maptbl_object_p->i_size = sinfo.st_size;
433*7c478bd9Sstevel@tonic-gate 
434*7c478bd9Sstevel@tonic-gate 	/* sanity check, better be a regular file */
435*7c478bd9Sstevel@tonic-gate 	if (!S_ISREG(sinfo.st_mode)) {
436*7c478bd9Sstevel@tonic-gate 		xx = ENOTSUP;
437*7c478bd9Sstevel@tonic-gate 		dbug_print(("error",
438*7c478bd9Sstevel@tonic-gate 		    "%s Not a regular file.", maptbl_object_p->i_name));
439*7c478bd9Sstevel@tonic-gate 		dbug_leave("maptbl_setup");
440*7c478bd9Sstevel@tonic-gate 		return (xx);
441*7c478bd9Sstevel@tonic-gate 	}
442*7c478bd9Sstevel@tonic-gate 
443*7c478bd9Sstevel@tonic-gate 	/* determine number of entries */
444*7c478bd9Sstevel@tonic-gate 	maptbl_object_p->i_entries =
445*7c478bd9Sstevel@tonic-gate 	    maptbl_object_p->i_size / sizeof (struct cfs_dlog_mapping_space);
446*7c478bd9Sstevel@tonic-gate 
447*7c478bd9Sstevel@tonic-gate 	/* set up modulo value for second hash function */
448*7c478bd9Sstevel@tonic-gate 	maptbl_object_p->i_hash2mod = (maptbl_object_p->i_entries / 2) + 1;
449*7c478bd9Sstevel@tonic-gate 
450*7c478bd9Sstevel@tonic-gate 	/* initialize statistic gathering */
451*7c478bd9Sstevel@tonic-gate 	maptbl_object_p->i_stat_requests = 0;
452*7c478bd9Sstevel@tonic-gate 	maptbl_object_p->i_stat_probes = 0;
453*7c478bd9Sstevel@tonic-gate 	maptbl_object_p->i_stat_mapmove = 0;
454*7c478bd9Sstevel@tonic-gate 	maptbl_object_p->i_stat_mapdist = 0;
455*7c478bd9Sstevel@tonic-gate 	maptbl_object_p->i_stat_filled = 0;
456*7c478bd9Sstevel@tonic-gate 
457*7c478bd9Sstevel@tonic-gate 	/* zero the file */
458*7c478bd9Sstevel@tonic-gate 	for (offset = 0; offset < maptbl_object_p->i_size;
459*7c478bd9Sstevel@tonic-gate 		offset += maptbl_object_p->i_maplen) {
460*7c478bd9Sstevel@tonic-gate 		/* map in a section of the file */
461*7c478bd9Sstevel@tonic-gate 		xx = maptbl_domap(maptbl_object_p, offset);
462*7c478bd9Sstevel@tonic-gate 		if (xx) {
463*7c478bd9Sstevel@tonic-gate 			dbug_leave("maptbl_setup");
464*7c478bd9Sstevel@tonic-gate 			return (xx);
465*7c478bd9Sstevel@tonic-gate 		}
466*7c478bd9Sstevel@tonic-gate 		/* zero this section of the file */
467*7c478bd9Sstevel@tonic-gate 		lp = (long *)maptbl_object_p->i_pa;
468*7c478bd9Sstevel@tonic-gate 		size = maptbl_object_p->i_size - offset;
469*7c478bd9Sstevel@tonic-gate 		if (size < maptbl_object_p->i_palen) {
470*7c478bd9Sstevel@tonic-gate 			cnt = size / sizeof (long);
471*7c478bd9Sstevel@tonic-gate 		} else {
472*7c478bd9Sstevel@tonic-gate 			cnt = maptbl_object_p->i_palen / sizeof (long);
473*7c478bd9Sstevel@tonic-gate 			dbug_assert((cnt * sizeof (long)) ==
474*7c478bd9Sstevel@tonic-gate 			    maptbl_object_p->i_palen);
475*7c478bd9Sstevel@tonic-gate 		}
476*7c478bd9Sstevel@tonic-gate 		memset(lp, 0, cnt * sizeof (*lp));
477*7c478bd9Sstevel@tonic-gate 	}
478*7c478bd9Sstevel@tonic-gate 
479*7c478bd9Sstevel@tonic-gate 	/* return success */
480*7c478bd9Sstevel@tonic-gate 	dbug_leave("maptbl_setup");
481*7c478bd9Sstevel@tonic-gate 	return (0);
482*7c478bd9Sstevel@tonic-gate }
483*7c478bd9Sstevel@tonic-gate 
484*7c478bd9Sstevel@tonic-gate /*
485*7c478bd9Sstevel@tonic-gate  *			maptbl_teardown
486*7c478bd9Sstevel@tonic-gate  *
487*7c478bd9Sstevel@tonic-gate  * Description:
488*7c478bd9Sstevel@tonic-gate  * Arguments:
489*7c478bd9Sstevel@tonic-gate  * Returns:
490*7c478bd9Sstevel@tonic-gate  * Preconditions:
491*7c478bd9Sstevel@tonic-gate  */
492*7c478bd9Sstevel@tonic-gate void
maptbl_teardown(cfsd_maptbl_object_t * maptbl_object_p)493*7c478bd9Sstevel@tonic-gate maptbl_teardown(cfsd_maptbl_object_t *maptbl_object_p)
494*7c478bd9Sstevel@tonic-gate {
495*7c478bd9Sstevel@tonic-gate 	int xx;
496*7c478bd9Sstevel@tonic-gate 
497*7c478bd9Sstevel@tonic-gate 	dbug_enter("maptbl_teardown");
498*7c478bd9Sstevel@tonic-gate 	dbug_precond(maptbl_object_p);
499*7c478bd9Sstevel@tonic-gate 
500*7c478bd9Sstevel@tonic-gate 	if (maptbl_object_p->i_pa) {
501*7c478bd9Sstevel@tonic-gate 		xx = munmap(maptbl_object_p->i_pa, maptbl_object_p->i_palen);
502*7c478bd9Sstevel@tonic-gate 		if (xx == -1) {
503*7c478bd9Sstevel@tonic-gate 			xx = errno;
504*7c478bd9Sstevel@tonic-gate 			dbug_print(("error", "Could not unmap %s, %d, %p, %d",
505*7c478bd9Sstevel@tonic-gate 			    maptbl_object_p->i_name, xx, maptbl_object_p->i_pa,
506*7c478bd9Sstevel@tonic-gate 			    maptbl_object_p->i_palen));
507*7c478bd9Sstevel@tonic-gate 		}
508*7c478bd9Sstevel@tonic-gate 		maptbl_object_p->i_pa = NULL;
509*7c478bd9Sstevel@tonic-gate 	}
510*7c478bd9Sstevel@tonic-gate 	maptbl_object_p->i_paoff = 0;
511*7c478bd9Sstevel@tonic-gate 	maptbl_object_p->i_paend = 0;
512*7c478bd9Sstevel@tonic-gate 	maptbl_object_p->i_palen = 0;
513*7c478bd9Sstevel@tonic-gate 
514*7c478bd9Sstevel@tonic-gate 	if (maptbl_object_p->i_fid != -1) {
515*7c478bd9Sstevel@tonic-gate 		if (close(maptbl_object_p->i_fid))
516*7c478bd9Sstevel@tonic-gate 			dbug_print(("err", "cannot close maptbl fd, error %d",
517*7c478bd9Sstevel@tonic-gate 			    errno));
518*7c478bd9Sstevel@tonic-gate 		maptbl_object_p->i_fid = -1;
519*7c478bd9Sstevel@tonic-gate 	}
520*7c478bd9Sstevel@tonic-gate 	dbug_leave("maptbl_teardown");
521*7c478bd9Sstevel@tonic-gate }
522*7c478bd9Sstevel@tonic-gate 
523*7c478bd9Sstevel@tonic-gate /*
524*7c478bd9Sstevel@tonic-gate  *			maptbl_get
525*7c478bd9Sstevel@tonic-gate  *
526*7c478bd9Sstevel@tonic-gate  * Description:
527*7c478bd9Sstevel@tonic-gate  *	Gets the mapping info for the specified cid.
528*7c478bd9Sstevel@tonic-gate  * Arguments:
529*7c478bd9Sstevel@tonic-gate  *	cid
530*7c478bd9Sstevel@tonic-gate  *	valuep
531*7c478bd9Sstevel@tonic-gate  * Returns:
532*7c478bd9Sstevel@tonic-gate  *	Returns 0 for success, 1 if entry not found, -1 if an
533*7c478bd9Sstevel@tonic-gate  *	error occurs in the mapping file.
534*7c478bd9Sstevel@tonic-gate  * Preconditions:
535*7c478bd9Sstevel@tonic-gate  *	precond(valuep)
536*7c478bd9Sstevel@tonic-gate  */
537*7c478bd9Sstevel@tonic-gate int
maptbl_get(cfsd_maptbl_object_t * maptbl_object_p,cfs_cid_t cid,struct cfs_dlog_mapping_space * valuep)538*7c478bd9Sstevel@tonic-gate maptbl_get(cfsd_maptbl_object_t *maptbl_object_p,
539*7c478bd9Sstevel@tonic-gate 	cfs_cid_t cid,
540*7c478bd9Sstevel@tonic-gate 	struct cfs_dlog_mapping_space *valuep)
541*7c478bd9Sstevel@tonic-gate {
542*7c478bd9Sstevel@tonic-gate 	int xx;
543*7c478bd9Sstevel@tonic-gate 	struct cfs_dlog_mapping_space *pa;
544*7c478bd9Sstevel@tonic-gate 
545*7c478bd9Sstevel@tonic-gate 	dbug_enter("maptbl_get");
546*7c478bd9Sstevel@tonic-gate 	dbug_precond(maptbl_object_p);
547*7c478bd9Sstevel@tonic-gate 	dbug_precond(valuep);
548*7c478bd9Sstevel@tonic-gate 
549*7c478bd9Sstevel@tonic-gate 	if (maptbl_object_p->i_entries == 0) {
550*7c478bd9Sstevel@tonic-gate 		dbug_leave("maptbl_get");
551*7c478bd9Sstevel@tonic-gate 		return (1);
552*7c478bd9Sstevel@tonic-gate 	}
553*7c478bd9Sstevel@tonic-gate 	xx = maptbl_cidhashaddr(maptbl_object_p, cid, (caddr_t *)&pa);
554*7c478bd9Sstevel@tonic-gate 	if (xx == 0)
555*7c478bd9Sstevel@tonic-gate 		*valuep = *pa;
556*7c478bd9Sstevel@tonic-gate 	dbug_leave("maptbl_get");
557*7c478bd9Sstevel@tonic-gate 	return (xx);
558*7c478bd9Sstevel@tonic-gate }
559*7c478bd9Sstevel@tonic-gate 
560*7c478bd9Sstevel@tonic-gate /*
561*7c478bd9Sstevel@tonic-gate  *			maptbl_set
562*7c478bd9Sstevel@tonic-gate  *
563*7c478bd9Sstevel@tonic-gate  * Description:
564*7c478bd9Sstevel@tonic-gate  *	Sets the mapping info for the cid.
565*7c478bd9Sstevel@tonic-gate  *	If insert is 1 then if the entry is not found it is put in the
566*7c478bd9Sstevel@tonic-gate  *	table.
567*7c478bd9Sstevel@tonic-gate  * Arguments:
568*7c478bd9Sstevel@tonic-gate  *	valuep
569*7c478bd9Sstevel@tonic-gate  *	insert
570*7c478bd9Sstevel@tonic-gate  * Returns:
571*7c478bd9Sstevel@tonic-gate  *	Returns 0 if mapping info placed in the table, 1 if entry
572*7c478bd9Sstevel@tonic-gate  *	is not found an insert is 0, -1 if an error occurs in the
573*7c478bd9Sstevel@tonic-gate  *	mapping file.
574*7c478bd9Sstevel@tonic-gate  * Preconditions:
575*7c478bd9Sstevel@tonic-gate  *	precond(valuep)
576*7c478bd9Sstevel@tonic-gate  */
577*7c478bd9Sstevel@tonic-gate int
maptbl_set(cfsd_maptbl_object_t * maptbl_object_p,struct cfs_dlog_mapping_space * valuep,int insert)578*7c478bd9Sstevel@tonic-gate maptbl_set(cfsd_maptbl_object_t *maptbl_object_p,
579*7c478bd9Sstevel@tonic-gate 	struct cfs_dlog_mapping_space *valuep,
580*7c478bd9Sstevel@tonic-gate 	int insert)
581*7c478bd9Sstevel@tonic-gate {
582*7c478bd9Sstevel@tonic-gate 	int xx;
583*7c478bd9Sstevel@tonic-gate 	struct cfs_dlog_mapping_space *pa;
584*7c478bd9Sstevel@tonic-gate 
585*7c478bd9Sstevel@tonic-gate 	dbug_enter("maptbl_set");
586*7c478bd9Sstevel@tonic-gate 	dbug_precond(maptbl_object_p);
587*7c478bd9Sstevel@tonic-gate 	dbug_precond(valuep);
588*7c478bd9Sstevel@tonic-gate 
589*7c478bd9Sstevel@tonic-gate 	dbug_assert(maptbl_object_p->i_entries > 0);
590*7c478bd9Sstevel@tonic-gate 
591*7c478bd9Sstevel@tonic-gate 	xx = maptbl_cidhashaddr(maptbl_object_p, valuep->ms_cid,
592*7c478bd9Sstevel@tonic-gate 	    (caddr_t *)&pa);
593*7c478bd9Sstevel@tonic-gate 	if ((xx == 0) || ((xx == 1) && insert)) {
594*7c478bd9Sstevel@tonic-gate 		*pa = *valuep;
595*7c478bd9Sstevel@tonic-gate 		if (xx == 1)
596*7c478bd9Sstevel@tonic-gate 			maptbl_object_p->i_stat_filled++;
597*7c478bd9Sstevel@tonic-gate 		xx = 0;
598*7c478bd9Sstevel@tonic-gate 	}
599*7c478bd9Sstevel@tonic-gate 	dbug_leave("maptbl_set");
600*7c478bd9Sstevel@tonic-gate 	return (xx);
601*7c478bd9Sstevel@tonic-gate }
602*7c478bd9Sstevel@tonic-gate 
603*7c478bd9Sstevel@tonic-gate /*
604*7c478bd9Sstevel@tonic-gate  *			maptbl_dumpstats
605*7c478bd9Sstevel@tonic-gate  *
606*7c478bd9Sstevel@tonic-gate  * Description:
607*7c478bd9Sstevel@tonic-gate  *	Prints out various stats about the hashing.
608*7c478bd9Sstevel@tonic-gate  * Arguments:
609*7c478bd9Sstevel@tonic-gate  * Returns:
610*7c478bd9Sstevel@tonic-gate  * Preconditions:
611*7c478bd9Sstevel@tonic-gate  */
612*7c478bd9Sstevel@tonic-gate void
maptbl_dumpstats(cfsd_maptbl_object_t * maptbl_object_p)613*7c478bd9Sstevel@tonic-gate maptbl_dumpstats(cfsd_maptbl_object_t *maptbl_object_p)
614*7c478bd9Sstevel@tonic-gate {
615*7c478bd9Sstevel@tonic-gate 	int xx;
616*7c478bd9Sstevel@tonic-gate 	double dd;
617*7c478bd9Sstevel@tonic-gate 
618*7c478bd9Sstevel@tonic-gate 	dbug_enter("maptbl_dumpstats");
619*7c478bd9Sstevel@tonic-gate 	dbug_precond(maptbl_object_p);
620*7c478bd9Sstevel@tonic-gate 
621*7c478bd9Sstevel@tonic-gate 	dbug_print(("dump", "Total Entries %d", maptbl_object_p->i_entries));
622*7c478bd9Sstevel@tonic-gate 	dbug_print(("dump", "Filled Entries %d",
623*7c478bd9Sstevel@tonic-gate 	    maptbl_object_p->i_stat_filled));
624*7c478bd9Sstevel@tonic-gate 	dbug_print(("dump", "Requests %d", maptbl_object_p->i_stat_requests));
625*7c478bd9Sstevel@tonic-gate 	dbug_print(("dump", "Probes %d", maptbl_object_p->i_stat_probes));
626*7c478bd9Sstevel@tonic-gate 	dbug_print(("dump", "Map Moves %d", maptbl_object_p->i_stat_mapmove));
627*7c478bd9Sstevel@tonic-gate 	dbug_print(("dump", "Mapping Size %d", maptbl_object_p->i_maplen));
628*7c478bd9Sstevel@tonic-gate 	dbug_print(("dump", "File Size %d", maptbl_object_p->i_size));
629*7c478bd9Sstevel@tonic-gate 	if (maptbl_object_p->i_stat_requests == 0) {
630*7c478bd9Sstevel@tonic-gate 		dbug_leave("maptbl_dumpstats");
631*7c478bd9Sstevel@tonic-gate 		return;
632*7c478bd9Sstevel@tonic-gate 	}
633*7c478bd9Sstevel@tonic-gate 	dd = (double)maptbl_object_p->i_stat_probes /
634*7c478bd9Sstevel@tonic-gate 	    maptbl_object_p->i_stat_requests;
635*7c478bd9Sstevel@tonic-gate 	dbug_print(("dump", "Probes per Request %.2f", dd));
636*7c478bd9Sstevel@tonic-gate 
637*7c478bd9Sstevel@tonic-gate 	dd = (double)maptbl_object_p->i_stat_mapmove /
638*7c478bd9Sstevel@tonic-gate 	    maptbl_object_p->i_stat_requests;
639*7c478bd9Sstevel@tonic-gate 	dbug_print(("dump", "Mmap moves per Request %.2f", dd));
640*7c478bd9Sstevel@tonic-gate 
641*7c478bd9Sstevel@tonic-gate 	xx = maptbl_object_p->i_stat_mapdist / maptbl_object_p->i_stat_mapmove;
642*7c478bd9Sstevel@tonic-gate 	dbug_print(("dump", "Average distance per mmap moves %d", xx));
643*7c478bd9Sstevel@tonic-gate 
644*7c478bd9Sstevel@tonic-gate 	xx = ((100.0 * maptbl_object_p->i_stat_filled) /
645*7c478bd9Sstevel@tonic-gate 	    maptbl_object_p->i_entries) + .5;
646*7c478bd9Sstevel@tonic-gate 	dbug_print(("dump", "Table filled %d%%", xx));
647*7c478bd9Sstevel@tonic-gate 
648*7c478bd9Sstevel@tonic-gate 	dbug_leave("maptbl_dumpstats");
649*7c478bd9Sstevel@tonic-gate }
650