xref: /titanic_41/usr/src/cmd/isns/isnsd/cache.c (revision fcf3ce441efd61da9bb2884968af01cb7c1452cc)
1*fcf3ce44SJohn Forte /*
2*fcf3ce44SJohn Forte  * CDDL HEADER START
3*fcf3ce44SJohn Forte  *
4*fcf3ce44SJohn Forte  * The contents of this file are subject to the terms of the
5*fcf3ce44SJohn Forte  * Common Development and Distribution License (the "License").
6*fcf3ce44SJohn Forte  * You may not use this file except in compliance with the License.
7*fcf3ce44SJohn Forte  *
8*fcf3ce44SJohn Forte  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*fcf3ce44SJohn Forte  * or http://www.opensolaris.org/os/licensing.
10*fcf3ce44SJohn Forte  * See the License for the specific language governing permissions
11*fcf3ce44SJohn Forte  * and limitations under the License.
12*fcf3ce44SJohn Forte  *
13*fcf3ce44SJohn Forte  * When distributing Covered Code, include this CDDL HEADER in each
14*fcf3ce44SJohn Forte  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*fcf3ce44SJohn Forte  * If applicable, add the following below this CDDL HEADER, with the
16*fcf3ce44SJohn Forte  * fields enclosed by brackets "[]" replaced with your own identifying
17*fcf3ce44SJohn Forte  * information: Portions Copyright [yyyy] [name of copyright owner]
18*fcf3ce44SJohn Forte  *
19*fcf3ce44SJohn Forte  * CDDL HEADER END
20*fcf3ce44SJohn Forte  */
21*fcf3ce44SJohn Forte 
22*fcf3ce44SJohn Forte /*
23*fcf3ce44SJohn Forte  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
24*fcf3ce44SJohn Forte  * Use is subject to license terms.
25*fcf3ce44SJohn Forte  */
26*fcf3ce44SJohn Forte 
27*fcf3ce44SJohn Forte #include <stdio.h>
28*fcf3ce44SJohn Forte #include <stdlib.h>
29*fcf3ce44SJohn Forte #include <string.h>
30*fcf3ce44SJohn Forte 
31*fcf3ce44SJohn Forte #include "isns_server.h"
32*fcf3ce44SJohn Forte #include "isns_cache.h"
33*fcf3ce44SJohn Forte #include "isns_msgq.h"
34*fcf3ce44SJohn Forte #include "isns_obj.h"
35*fcf3ce44SJohn Forte #include "isns_htab.h"
36*fcf3ce44SJohn Forte 
37*fcf3ce44SJohn Forte /*
38*fcf3ce44SJohn Forte  * external variables
39*fcf3ce44SJohn Forte  */
40*fcf3ce44SJohn Forte extern msg_queue_t *sys_q;
41*fcf3ce44SJohn Forte 
42*fcf3ce44SJohn Forte #ifdef DEBUG
43*fcf3ce44SJohn Forte extern int verbose_lock;
44*fcf3ce44SJohn Forte #endif
45*fcf3ce44SJohn Forte 
46*fcf3ce44SJohn Forte /*
47*fcf3ce44SJohn Forte  * global data
48*fcf3ce44SJohn Forte  */
49*fcf3ce44SJohn Forte int cache_flag = 0;
50*fcf3ce44SJohn Forte 
51*fcf3ce44SJohn Forte /*
52*fcf3ce44SJohn Forte  * local variables
53*fcf3ce44SJohn Forte  */
54*fcf3ce44SJohn Forte static cache_t *imc;
55*fcf3ce44SJohn Forte 
56*fcf3ce44SJohn Forte /*
57*fcf3ce44SJohn Forte  * local functions.
58*fcf3ce44SJohn Forte  */
59*fcf3ce44SJohn Forte 
60*fcf3ce44SJohn Forte /*
61*fcf3ce44SJohn Forte  * ****************************************************************************
62*fcf3ce44SJohn Forte  * cache_init:
63*fcf3ce44SJohn Forte  *	create the cache data initially, including to invoke individual
64*fcf3ce44SJohn Forte  *	functions for creating the hash tables for object storage and
65*fcf3ce44SJohn Forte  *	discovery domain membership matrix.
66*fcf3ce44SJohn Forte  *
67*fcf3ce44SJohn Forte  * return - 0: no error; 1: otherwise.
68*fcf3ce44SJohn Forte  *
69*fcf3ce44SJohn Forte  * ****************************************************************************
70*fcf3ce44SJohn Forte  */
71*fcf3ce44SJohn Forte int
cache_init()72*fcf3ce44SJohn Forte cache_init(
73*fcf3ce44SJohn Forte )
74*fcf3ce44SJohn Forte {
75*fcf3ce44SJohn Forte 	/*
76*fcf3ce44SJohn Forte 	 * allocate global cache memory.
77*fcf3ce44SJohn Forte 	 */
78*fcf3ce44SJohn Forte 	imc = (cache_t *)calloc(sizeof (cache_t), 1);
79*fcf3ce44SJohn Forte 	if (imc == NULL ||
80*fcf3ce44SJohn Forte 	    obj_tab_init(imc) != 0 ||
81*fcf3ce44SJohn Forte 	    dd_matrix_init(imc) != 0) {
82*fcf3ce44SJohn Forte 		cache_destroy();
83*fcf3ce44SJohn Forte 		return (1); /* no memory */
84*fcf3ce44SJohn Forte 	}
85*fcf3ce44SJohn Forte 
86*fcf3ce44SJohn Forte 	/*
87*fcf3ce44SJohn Forte 	 * initialize global cache rwlock.
88*fcf3ce44SJohn Forte 	 */
89*fcf3ce44SJohn Forte 	(void) rwlock_init(&imc->l, NULL, NULL);
90*fcf3ce44SJohn Forte 
91*fcf3ce44SJohn Forte 	/*
92*fcf3ce44SJohn Forte 	 * inintialize global cache functions.
93*fcf3ce44SJohn Forte 	 */
94*fcf3ce44SJohn Forte 	imc->get_hval = obj_hval;
95*fcf3ce44SJohn Forte 	imc->get_uid = get_obj_uid;
96*fcf3ce44SJohn Forte 	imc->set_uid = set_obj_uid;
97*fcf3ce44SJohn Forte 	imc->timestamp = get_timestamp;
98*fcf3ce44SJohn Forte 	imc->add_hook = add_object;
99*fcf3ce44SJohn Forte 	imc->replace_hook = replace_object;
100*fcf3ce44SJohn Forte 	imc->cmp = obj_cmp;
101*fcf3ce44SJohn Forte 	imc->clone = assoc_clone;
102*fcf3ce44SJohn Forte 	imc->ddd = update_ddd;
103*fcf3ce44SJohn Forte #ifdef DEBUG
104*fcf3ce44SJohn Forte 	imc->dump = obj_dump;
105*fcf3ce44SJohn Forte #endif
106*fcf3ce44SJohn Forte 
107*fcf3ce44SJohn Forte 	return (0);
108*fcf3ce44SJohn Forte }
109*fcf3ce44SJohn Forte 
110*fcf3ce44SJohn Forte /*
111*fcf3ce44SJohn Forte  * ****************************************************************************
112*fcf3ce44SJohn Forte  * cache_destroy:
113*fcf3ce44SJohn Forte  *	destroy the cache data.
114*fcf3ce44SJohn Forte  *
115*fcf3ce44SJohn Forte  * ****************************************************************************
116*fcf3ce44SJohn Forte  */
117*fcf3ce44SJohn Forte void
cache_destroy()118*fcf3ce44SJohn Forte cache_destroy(
119*fcf3ce44SJohn Forte )
120*fcf3ce44SJohn Forte {
121*fcf3ce44SJohn Forte 	/* do nothing */
122*fcf3ce44SJohn Forte }
123*fcf3ce44SJohn Forte 
124*fcf3ce44SJohn Forte /*
125*fcf3ce44SJohn Forte  * ****************************************************************************
126*fcf3ce44SJohn Forte  * cache_lock:
127*fcf3ce44SJohn Forte  *	grab the lock on the cache data.
128*fcf3ce44SJohn Forte  *
129*fcf3ce44SJohn Forte  * mode - the read/write mode of the lock.
130*fcf3ce44SJohn Forte  * return - error code.
131*fcf3ce44SJohn Forte  *
132*fcf3ce44SJohn Forte  * ****************************************************************************
133*fcf3ce44SJohn Forte  */
134*fcf3ce44SJohn Forte int
cache_lock(int mode)135*fcf3ce44SJohn Forte cache_lock(
136*fcf3ce44SJohn Forte 	int mode
137*fcf3ce44SJohn Forte )
138*fcf3ce44SJohn Forte {
139*fcf3ce44SJohn Forte 	int ret = 0;
140*fcf3ce44SJohn Forte 
141*fcf3ce44SJohn Forte 	switch (mode) {
142*fcf3ce44SJohn Forte 	case CACHE_WRITE:
143*fcf3ce44SJohn Forte 		ret = rw_wrlock(&imc->l);
144*fcf3ce44SJohn Forte #ifdef DEBUG
145*fcf3ce44SJohn Forte 		if (verbose_lock) {
146*fcf3ce44SJohn Forte 			printf("cache locked for writing.\n");
147*fcf3ce44SJohn Forte 		}
148*fcf3ce44SJohn Forte #endif
149*fcf3ce44SJohn Forte 		break;
150*fcf3ce44SJohn Forte 	case CACHE_READ:
151*fcf3ce44SJohn Forte 		ret = rw_rdlock(&imc->l);
152*fcf3ce44SJohn Forte #ifdef DEBUG
153*fcf3ce44SJohn Forte 		if (verbose_lock) {
154*fcf3ce44SJohn Forte 			printf("cache locked for reading.\n");
155*fcf3ce44SJohn Forte 		}
156*fcf3ce44SJohn Forte #endif
157*fcf3ce44SJohn Forte 		break;
158*fcf3ce44SJohn Forte 	case CACHE_TRY_READ:
159*fcf3ce44SJohn Forte 		ret = rw_tryrdlock(&imc->l);
160*fcf3ce44SJohn Forte #ifdef DEBUG
161*fcf3ce44SJohn Forte 		if (verbose_lock) {
162*fcf3ce44SJohn Forte 			if (ret == 0) {
163*fcf3ce44SJohn Forte 				printf("cache locked for reading.\n");
164*fcf3ce44SJohn Forte 			} else {
165*fcf3ce44SJohn Forte 				printf("cache locked for reading failed.\n");
166*fcf3ce44SJohn Forte 			}
167*fcf3ce44SJohn Forte 		}
168*fcf3ce44SJohn Forte #endif
169*fcf3ce44SJohn Forte 		break;
170*fcf3ce44SJohn Forte 	default:
171*fcf3ce44SJohn Forte 		break;
172*fcf3ce44SJohn Forte 	}
173*fcf3ce44SJohn Forte 
174*fcf3ce44SJohn Forte 	return (ret);
175*fcf3ce44SJohn Forte }
176*fcf3ce44SJohn Forte 
177*fcf3ce44SJohn Forte /*
178*fcf3ce44SJohn Forte  * ****************************************************************************
179*fcf3ce44SJohn Forte  * cache_unlock:
180*fcf3ce44SJohn Forte  *	release the lock on the cache data.
181*fcf3ce44SJohn Forte  *	if the cache was locked for writing, a synchronization between
182*fcf3ce44SJohn Forte  *	the cache and persistent data store needs to be performed.
183*fcf3ce44SJohn Forte  *
184*fcf3ce44SJohn Forte  * mode - the read/write mode which the cache data was locked for.
185*fcf3ce44SJohn Forte  * ec - 0: commit the cache update; otherwise retreat it.
186*fcf3ce44SJohn Forte  * return - error code.
187*fcf3ce44SJohn Forte  *
188*fcf3ce44SJohn Forte  * ****************************************************************************
189*fcf3ce44SJohn Forte  */
190*fcf3ce44SJohn Forte int
cache_unlock(int mode,int ec)191*fcf3ce44SJohn Forte cache_unlock(
192*fcf3ce44SJohn Forte 	int mode,
193*fcf3ce44SJohn Forte 	int ec
194*fcf3ce44SJohn Forte )
195*fcf3ce44SJohn Forte {
196*fcf3ce44SJohn Forte 	if (mode != CACHE_NO_ACTION) {
197*fcf3ce44SJohn Forte 		/* sync between cache and data store */
198*fcf3ce44SJohn Forte 		if (mode == CACHE_WRITE) {
199*fcf3ce44SJohn Forte 			if (sys_q) {
200*fcf3ce44SJohn Forte 				ec = data_sync(ec);
201*fcf3ce44SJohn Forte 			}
202*fcf3ce44SJohn Forte 
203*fcf3ce44SJohn Forte 			/* rest the cache update flag */
204*fcf3ce44SJohn Forte 			RESET_CACHE_UPDATED();
205*fcf3ce44SJohn Forte 		}
206*fcf3ce44SJohn Forte 
207*fcf3ce44SJohn Forte 		ASSERT(!IS_CACHE_UPDATED());
208*fcf3ce44SJohn Forte 
209*fcf3ce44SJohn Forte 		/* unlock it */
210*fcf3ce44SJohn Forte 		(void) rw_unlock(&imc->l);
211*fcf3ce44SJohn Forte #ifdef DEBUG
212*fcf3ce44SJohn Forte 		if (verbose_lock) {
213*fcf3ce44SJohn Forte 			printf("cache unlocked.\n");
214*fcf3ce44SJohn Forte 		}
215*fcf3ce44SJohn Forte #endif
216*fcf3ce44SJohn Forte 	}
217*fcf3ce44SJohn Forte 
218*fcf3ce44SJohn Forte 	return (ec);
219*fcf3ce44SJohn Forte }
220*fcf3ce44SJohn Forte 
221*fcf3ce44SJohn Forte /*
222*fcf3ce44SJohn Forte  * ****************************************************************************
223*fcf3ce44SJohn Forte  * cache_lock_read:
224*fcf3ce44SJohn Forte  *	grab the read lock on the cache.
225*fcf3ce44SJohn Forte  *
226*fcf3ce44SJohn Forte  * return - error code.
227*fcf3ce44SJohn Forte  *
228*fcf3ce44SJohn Forte  * ****************************************************************************
229*fcf3ce44SJohn Forte  */
230*fcf3ce44SJohn Forte int
cache_lock_read()231*fcf3ce44SJohn Forte cache_lock_read(
232*fcf3ce44SJohn Forte )
233*fcf3ce44SJohn Forte {
234*fcf3ce44SJohn Forte 	return (cache_lock(CACHE_READ));
235*fcf3ce44SJohn Forte }
236*fcf3ce44SJohn Forte 
237*fcf3ce44SJohn Forte /*
238*fcf3ce44SJohn Forte  * ****************************************************************************
239*fcf3ce44SJohn Forte  * cache_lock_write:
240*fcf3ce44SJohn Forte  *	grab the write lock on the cache.
241*fcf3ce44SJohn Forte  *
242*fcf3ce44SJohn Forte  * return - error code.
243*fcf3ce44SJohn Forte  *
244*fcf3ce44SJohn Forte  * ****************************************************************************
245*fcf3ce44SJohn Forte  */
246*fcf3ce44SJohn Forte int
cache_lock_write()247*fcf3ce44SJohn Forte cache_lock_write(
248*fcf3ce44SJohn Forte )
249*fcf3ce44SJohn Forte {
250*fcf3ce44SJohn Forte 	return (cache_lock(CACHE_WRITE));
251*fcf3ce44SJohn Forte }
252*fcf3ce44SJohn Forte 
253*fcf3ce44SJohn Forte /*
254*fcf3ce44SJohn Forte  * ****************************************************************************
255*fcf3ce44SJohn Forte  * cache_unlock_sync:
256*fcf3ce44SJohn Forte  *	synchronize the cache with persistent data store and
257*fcf3ce44SJohn Forte  *	release the lock.
258*fcf3ce44SJohn Forte  *
259*fcf3ce44SJohn Forte  * ec - 0: commit the cache update; otherwise retreat it.
260*fcf3ce44SJohn Forte  * return - error code.
261*fcf3ce44SJohn Forte  *
262*fcf3ce44SJohn Forte  * ****************************************************************************
263*fcf3ce44SJohn Forte  */
264*fcf3ce44SJohn Forte int
cache_unlock_sync(int ec)265*fcf3ce44SJohn Forte cache_unlock_sync(
266*fcf3ce44SJohn Forte 	int ec
267*fcf3ce44SJohn Forte )
268*fcf3ce44SJohn Forte {
269*fcf3ce44SJohn Forte 	return (cache_unlock(CACHE_WRITE, ec));
270*fcf3ce44SJohn Forte }
271*fcf3ce44SJohn Forte 
272*fcf3ce44SJohn Forte /*
273*fcf3ce44SJohn Forte  * ****************************************************************************
274*fcf3ce44SJohn Forte  * cache_unlock_nosync:
275*fcf3ce44SJohn Forte  *	release the lock, no need to sync the data between cache and
276*fcf3ce44SJohn Forte  *	data store.
277*fcf3ce44SJohn Forte  *	if the cache has been updated, do not call this function, call
278*fcf3ce44SJohn Forte  *	cache_unlock_sync() with non-zero error code to indicate the
279*fcf3ce44SJohn Forte  *	sync action.
280*fcf3ce44SJohn Forte  *
281*fcf3ce44SJohn Forte  * return - error code.
282*fcf3ce44SJohn Forte  *
283*fcf3ce44SJohn Forte  * ****************************************************************************
284*fcf3ce44SJohn Forte  */
285*fcf3ce44SJohn Forte int
cache_unlock_nosync()286*fcf3ce44SJohn Forte cache_unlock_nosync(
287*fcf3ce44SJohn Forte )
288*fcf3ce44SJohn Forte {
289*fcf3ce44SJohn Forte 	return (cache_unlock(CACHE_READ, 0));
290*fcf3ce44SJohn Forte }
291*fcf3ce44SJohn Forte 
292*fcf3ce44SJohn Forte /*
293*fcf3ce44SJohn Forte  * ****************************************************************************
294*fcf3ce44SJohn Forte  * cache_get_htab:
295*fcf3ce44SJohn Forte  *	get the hash table for individual type of object.
296*fcf3ce44SJohn Forte  *
297*fcf3ce44SJohn Forte  * type - the object type.
298*fcf3ce44SJohn Forte  * return - the hash table.
299*fcf3ce44SJohn Forte  *
300*fcf3ce44SJohn Forte  * ****************************************************************************
301*fcf3ce44SJohn Forte  */
302*fcf3ce44SJohn Forte htab_t *
cache_get_htab(isns_type_t type)303*fcf3ce44SJohn Forte cache_get_htab(
304*fcf3ce44SJohn Forte 	isns_type_t type
305*fcf3ce44SJohn Forte )
306*fcf3ce44SJohn Forte {
307*fcf3ce44SJohn Forte 	if (type > 0 && type < MAX_OBJ_TYPE) {
308*fcf3ce44SJohn Forte 		return (imc->t[type]);
309*fcf3ce44SJohn Forte 	}
310*fcf3ce44SJohn Forte 
311*fcf3ce44SJohn Forte 	return (NULL);
312*fcf3ce44SJohn Forte }
313*fcf3ce44SJohn Forte 
314*fcf3ce44SJohn Forte /*
315*fcf3ce44SJohn Forte  * ****************************************************************************
316*fcf3ce44SJohn Forte  * cache_get_matrix:
317*fcf3ce44SJohn Forte  *	get the membership matrix for a discovery domain or a
318*fcf3ce44SJohn Forte  *	discovery domain set.
319*fcf3ce44SJohn Forte  *
320*fcf3ce44SJohn Forte  * type - the discovery domain or discovery domain set object type.
321*fcf3ce44SJohn Forte  * return - the matrix.
322*fcf3ce44SJohn Forte  *
323*fcf3ce44SJohn Forte  * ****************************************************************************
324*fcf3ce44SJohn Forte  */
325*fcf3ce44SJohn Forte matrix_t *
cache_get_matrix(isns_type_t type)326*fcf3ce44SJohn Forte cache_get_matrix(
327*fcf3ce44SJohn Forte 	isns_type_t type
328*fcf3ce44SJohn Forte )
329*fcf3ce44SJohn Forte {
330*fcf3ce44SJohn Forte 	matrix_t *x = NULL;
331*fcf3ce44SJohn Forte 
332*fcf3ce44SJohn Forte 	switch (type) {
333*fcf3ce44SJohn Forte 	case OBJ_DD:
334*fcf3ce44SJohn Forte 		x = imc->x[0];
335*fcf3ce44SJohn Forte 		break;
336*fcf3ce44SJohn Forte 	case OBJ_DDS:
337*fcf3ce44SJohn Forte 		x = imc->x[1];
338*fcf3ce44SJohn Forte 		break;
339*fcf3ce44SJohn Forte 	default:
340*fcf3ce44SJohn Forte 		break;
341*fcf3ce44SJohn Forte 	}
342*fcf3ce44SJohn Forte 
343*fcf3ce44SJohn Forte 	return (x);
344*fcf3ce44SJohn Forte }
345*fcf3ce44SJohn Forte 
346*fcf3ce44SJohn Forte /*
347*fcf3ce44SJohn Forte  * ****************************************************************************
348*fcf3ce44SJohn Forte  * cache_lookup:
349*fcf3ce44SJohn Forte  *	invoke the hash table lookup for looking up a specific object and
350*fcf3ce44SJohn Forte  *	perform the callback function on the object.
351*fcf3ce44SJohn Forte  *
352*fcf3ce44SJohn Forte  * lcp - the object lookup control data.
353*fcf3ce44SJohn Forte  * uid_p - the pointer of object UID for returning.
354*fcf3ce44SJohn Forte  * callback - the callback function for the object.
355*fcf3ce44SJohn Forte  * return - error code.
356*fcf3ce44SJohn Forte  *
357*fcf3ce44SJohn Forte  * ****************************************************************************
358*fcf3ce44SJohn Forte  */
359*fcf3ce44SJohn Forte int
cache_lookup(lookup_ctrl_t * lcp,uint32_t * uid_p,int (* callback)(void *,void *))360*fcf3ce44SJohn Forte cache_lookup(
361*fcf3ce44SJohn Forte 	lookup_ctrl_t *lcp,
362*fcf3ce44SJohn Forte 	uint32_t *uid_p,
363*fcf3ce44SJohn Forte 	int (*callback)(void *, void *)
364*fcf3ce44SJohn Forte )
365*fcf3ce44SJohn Forte {
366*fcf3ce44SJohn Forte 	return (htab_lookup(imc->t[lcp->type],
367*fcf3ce44SJohn Forte 	    lcp,
368*fcf3ce44SJohn Forte 	    (lcp->op[0] == OP_INTEGER) ? lcp->data[0].ui : 0,
369*fcf3ce44SJohn Forte 	    uid_p,
370*fcf3ce44SJohn Forte 	    callback,
371*fcf3ce44SJohn Forte 	    0));
372*fcf3ce44SJohn Forte }
373*fcf3ce44SJohn Forte 
374*fcf3ce44SJohn Forte /*
375*fcf3ce44SJohn Forte  * ****************************************************************************
376*fcf3ce44SJohn Forte  * cache_lookup:
377*fcf3ce44SJohn Forte  *	invoke the hash table lookup for looking up a specific object,
378*fcf3ce44SJohn Forte  *	the callback function is going to change the key of the object.
379*fcf3ce44SJohn Forte  *
380*fcf3ce44SJohn Forte  * lcp - the object lookup control data.
381*fcf3ce44SJohn Forte  * uid_p - the pointer of object UID for returning.
382*fcf3ce44SJohn Forte  * callback - the callback function for the object.
383*fcf3ce44SJohn Forte  * return - error code.
384*fcf3ce44SJohn Forte  *
385*fcf3ce44SJohn Forte  * ****************************************************************************
386*fcf3ce44SJohn Forte  */
387*fcf3ce44SJohn Forte int
cache_rekey(lookup_ctrl_t * lcp,uint32_t * uid_p,int (* callback)(void *,void *))388*fcf3ce44SJohn Forte cache_rekey(
389*fcf3ce44SJohn Forte 	lookup_ctrl_t *lcp,
390*fcf3ce44SJohn Forte 	uint32_t *uid_p,
391*fcf3ce44SJohn Forte 	int (*callback)(void *, void *)
392*fcf3ce44SJohn Forte )
393*fcf3ce44SJohn Forte {
394*fcf3ce44SJohn Forte 	return (htab_lookup(imc->t[lcp->type],
395*fcf3ce44SJohn Forte 	    lcp,
396*fcf3ce44SJohn Forte 	    (lcp->op[0] == OP_INTEGER) ? lcp->data[0].ui : 0,
397*fcf3ce44SJohn Forte 	    uid_p,
398*fcf3ce44SJohn Forte 	    callback,
399*fcf3ce44SJohn Forte 	    1));
400*fcf3ce44SJohn Forte }
401*fcf3ce44SJohn Forte 
402*fcf3ce44SJohn Forte /*
403*fcf3ce44SJohn Forte  * ****************************************************************************
404*fcf3ce44SJohn Forte  * cache_add:
405*fcf3ce44SJohn Forte  *	invoke hash table add to add an object.
406*fcf3ce44SJohn Forte  *
407*fcf3ce44SJohn Forte  * obj - the object being added.
408*fcf3ce44SJohn Forte  * flag - 0: a real object;
409*fcf3ce44SJohn Forte  *	  otherwise an association object for discovery domain membership.
410*fcf3ce44SJohn Forte  * uid_p - the pointer of object UID for returning.
411*fcf3ce44SJohn Forte  * update_p - the pointer of flag (update object or newly register)
412*fcf3ce44SJohn Forte  *		for returning.
413*fcf3ce44SJohn Forte  * return - error code.
414*fcf3ce44SJohn Forte  *
415*fcf3ce44SJohn Forte  * ****************************************************************************
416*fcf3ce44SJohn Forte  */
417*fcf3ce44SJohn Forte int
cache_add(isns_obj_t * obj,int flag,uint32_t * uid_p,int * update_p)418*fcf3ce44SJohn Forte cache_add(
419*fcf3ce44SJohn Forte 	isns_obj_t *obj,
420*fcf3ce44SJohn Forte 	int flag,
421*fcf3ce44SJohn Forte 	uint32_t *uid_p,
422*fcf3ce44SJohn Forte 	int *update_p
423*fcf3ce44SJohn Forte )
424*fcf3ce44SJohn Forte {
425*fcf3ce44SJohn Forte 	return (htab_add(imc->t[obj->type], obj, flag, uid_p, update_p));
426*fcf3ce44SJohn Forte }
427*fcf3ce44SJohn Forte 
428*fcf3ce44SJohn Forte /*
429*fcf3ce44SJohn Forte  * ****************************************************************************
430*fcf3ce44SJohn Forte  * cache_remove:
431*fcf3ce44SJohn Forte  *	invoke hash table remove to remove an object.
432*fcf3ce44SJohn Forte  *
433*fcf3ce44SJohn Forte  * lcp - the lookup control data for the object being removed.
434*fcf3ce44SJohn Forte  * flag - 0: a real object;
435*fcf3ce44SJohn Forte  *	  otherwise an association object for discovery domain membership.
436*fcf3ce44SJohn Forte  * return - the removed object.
437*fcf3ce44SJohn Forte  *
438*fcf3ce44SJohn Forte  * ****************************************************************************
439*fcf3ce44SJohn Forte  */
440*fcf3ce44SJohn Forte isns_obj_t *
cache_remove(lookup_ctrl_t * lcp,int flag)441*fcf3ce44SJohn Forte cache_remove(
442*fcf3ce44SJohn Forte 	lookup_ctrl_t *lcp,
443*fcf3ce44SJohn Forte 	int flag
444*fcf3ce44SJohn Forte )
445*fcf3ce44SJohn Forte {
446*fcf3ce44SJohn Forte 	return (htab_remove(imc->t[lcp->type],
447*fcf3ce44SJohn Forte 	    lcp,
448*fcf3ce44SJohn Forte 	    (lcp->op[0] == OP_INTEGER) ? lcp->data[0].ui : 0,
449*fcf3ce44SJohn Forte 	    flag));
450*fcf3ce44SJohn Forte }
451*fcf3ce44SJohn Forte 
452*fcf3ce44SJohn Forte /*
453*fcf3ce44SJohn Forte  * ****************************************************************************
454*fcf3ce44SJohn Forte  * cache_dump_htab:
455*fcf3ce44SJohn Forte  *	dump the hash table for debugging purpose.
456*fcf3ce44SJohn Forte  *
457*fcf3ce44SJohn Forte  * type - the object type.
458*fcf3ce44SJohn Forte  *
459*fcf3ce44SJohn Forte  * ****************************************************************************
460*fcf3ce44SJohn Forte  */
461*fcf3ce44SJohn Forte #ifdef DEBUG
462*fcf3ce44SJohn Forte void
cache_dump_htab(isns_type_t type)463*fcf3ce44SJohn Forte cache_dump_htab(
464*fcf3ce44SJohn Forte 	isns_type_t type
465*fcf3ce44SJohn Forte )
466*fcf3ce44SJohn Forte {
467*fcf3ce44SJohn Forte 	(void) htab_dump(imc->t[type]);
468*fcf3ce44SJohn Forte }
469*fcf3ce44SJohn Forte #endif
470