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