xref: /minix3/external/bsd/bind/dist/lib/dns/dbtable.c (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1*00b67f09SDavid van Moolenbroek /*	$NetBSD: dbtable.c,v 1.5 2014/12/10 04:37:58 christos Exp $	*/
2*00b67f09SDavid van Moolenbroek 
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek  * Copyright (C) 2004, 2005, 2007, 2013  Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek  * Copyright (C) 1999-2001  Internet Software Consortium.
6*00b67f09SDavid van Moolenbroek  *
7*00b67f09SDavid van Moolenbroek  * Permission to use, copy, modify, and/or distribute this software for any
8*00b67f09SDavid van Moolenbroek  * purpose with or without fee is hereby granted, provided that the above
9*00b67f09SDavid van Moolenbroek  * copyright notice and this permission notice appear in all copies.
10*00b67f09SDavid van Moolenbroek  *
11*00b67f09SDavid van Moolenbroek  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
12*00b67f09SDavid van Moolenbroek  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
13*00b67f09SDavid van Moolenbroek  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
14*00b67f09SDavid van Moolenbroek  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15*00b67f09SDavid van Moolenbroek  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
16*00b67f09SDavid van Moolenbroek  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*00b67f09SDavid van Moolenbroek  * PERFORMANCE OF THIS SOFTWARE.
18*00b67f09SDavid van Moolenbroek  */
19*00b67f09SDavid van Moolenbroek 
20*00b67f09SDavid van Moolenbroek /*
21*00b67f09SDavid van Moolenbroek  * Id: dbtable.c,v 1.33 2007/06/19 23:47:16 tbox Exp
22*00b67f09SDavid van Moolenbroek  */
23*00b67f09SDavid van Moolenbroek 
24*00b67f09SDavid van Moolenbroek /*! \file
25*00b67f09SDavid van Moolenbroek  * \author
26*00b67f09SDavid van Moolenbroek  * Principal Author: DCL
27*00b67f09SDavid van Moolenbroek  */
28*00b67f09SDavid van Moolenbroek 
29*00b67f09SDavid van Moolenbroek #include <config.h>
30*00b67f09SDavid van Moolenbroek 
31*00b67f09SDavid van Moolenbroek #include <isc/mem.h>
32*00b67f09SDavid van Moolenbroek #include <isc/rwlock.h>
33*00b67f09SDavid van Moolenbroek #include <isc/util.h>
34*00b67f09SDavid van Moolenbroek 
35*00b67f09SDavid van Moolenbroek #include <dns/dbtable.h>
36*00b67f09SDavid van Moolenbroek #include <dns/db.h>
37*00b67f09SDavid van Moolenbroek #include <dns/rbt.h>
38*00b67f09SDavid van Moolenbroek #include <dns/result.h>
39*00b67f09SDavid van Moolenbroek 
40*00b67f09SDavid van Moolenbroek struct dns_dbtable {
41*00b67f09SDavid van Moolenbroek 	/* Unlocked. */
42*00b67f09SDavid van Moolenbroek 	unsigned int		magic;
43*00b67f09SDavid van Moolenbroek 	isc_mem_t *		mctx;
44*00b67f09SDavid van Moolenbroek 	dns_rdataclass_t	rdclass;
45*00b67f09SDavid van Moolenbroek 	isc_mutex_t		lock;
46*00b67f09SDavid van Moolenbroek 	isc_rwlock_t		tree_lock;
47*00b67f09SDavid van Moolenbroek 	/* Locked by lock. */
48*00b67f09SDavid van Moolenbroek 	unsigned int		references;
49*00b67f09SDavid van Moolenbroek 	/* Locked by tree_lock. */
50*00b67f09SDavid van Moolenbroek 	dns_rbt_t *		rbt;
51*00b67f09SDavid van Moolenbroek 	dns_db_t *		default_db;
52*00b67f09SDavid van Moolenbroek };
53*00b67f09SDavid van Moolenbroek 
54*00b67f09SDavid van Moolenbroek #define DBTABLE_MAGIC		ISC_MAGIC('D', 'B', '-', '-')
55*00b67f09SDavid van Moolenbroek #define VALID_DBTABLE(dbtable)	ISC_MAGIC_VALID(dbtable, DBTABLE_MAGIC)
56*00b67f09SDavid van Moolenbroek 
57*00b67f09SDavid van Moolenbroek static void
dbdetach(void * data,void * arg)58*00b67f09SDavid van Moolenbroek dbdetach(void *data, void *arg) {
59*00b67f09SDavid van Moolenbroek 	dns_db_t *db = data;
60*00b67f09SDavid van Moolenbroek 
61*00b67f09SDavid van Moolenbroek 	UNUSED(arg);
62*00b67f09SDavid van Moolenbroek 
63*00b67f09SDavid van Moolenbroek 	dns_db_detach(&db);
64*00b67f09SDavid van Moolenbroek }
65*00b67f09SDavid van Moolenbroek 
66*00b67f09SDavid van Moolenbroek isc_result_t
dns_dbtable_create(isc_mem_t * mctx,dns_rdataclass_t rdclass,dns_dbtable_t ** dbtablep)67*00b67f09SDavid van Moolenbroek dns_dbtable_create(isc_mem_t *mctx, dns_rdataclass_t rdclass,
68*00b67f09SDavid van Moolenbroek 		   dns_dbtable_t **dbtablep)
69*00b67f09SDavid van Moolenbroek {
70*00b67f09SDavid van Moolenbroek 	dns_dbtable_t *dbtable;
71*00b67f09SDavid van Moolenbroek 	isc_result_t result;
72*00b67f09SDavid van Moolenbroek 
73*00b67f09SDavid van Moolenbroek 	REQUIRE(mctx != NULL);
74*00b67f09SDavid van Moolenbroek 	REQUIRE(dbtablep != NULL && *dbtablep == NULL);
75*00b67f09SDavid van Moolenbroek 
76*00b67f09SDavid van Moolenbroek 	dbtable = (dns_dbtable_t *)isc_mem_get(mctx, sizeof(*dbtable));
77*00b67f09SDavid van Moolenbroek 	if (dbtable == NULL)
78*00b67f09SDavid van Moolenbroek 		return (ISC_R_NOMEMORY);
79*00b67f09SDavid van Moolenbroek 
80*00b67f09SDavid van Moolenbroek 	dbtable->rbt = NULL;
81*00b67f09SDavid van Moolenbroek 	result = dns_rbt_create(mctx, dbdetach, NULL, &dbtable->rbt);
82*00b67f09SDavid van Moolenbroek 	if (result != ISC_R_SUCCESS)
83*00b67f09SDavid van Moolenbroek 		goto clean1;
84*00b67f09SDavid van Moolenbroek 
85*00b67f09SDavid van Moolenbroek 	result = isc_mutex_init(&dbtable->lock);
86*00b67f09SDavid van Moolenbroek 	if (result != ISC_R_SUCCESS)
87*00b67f09SDavid van Moolenbroek 		goto clean2;
88*00b67f09SDavid van Moolenbroek 
89*00b67f09SDavid van Moolenbroek 	result = isc_rwlock_init(&dbtable->tree_lock, 0, 0);
90*00b67f09SDavid van Moolenbroek 	if (result != ISC_R_SUCCESS)
91*00b67f09SDavid van Moolenbroek 		goto clean3;
92*00b67f09SDavid van Moolenbroek 
93*00b67f09SDavid van Moolenbroek 	dbtable->default_db = NULL;
94*00b67f09SDavid van Moolenbroek 	dbtable->mctx = NULL;
95*00b67f09SDavid van Moolenbroek 	isc_mem_attach(mctx, &dbtable->mctx);
96*00b67f09SDavid van Moolenbroek 	dbtable->rdclass = rdclass;
97*00b67f09SDavid van Moolenbroek 	dbtable->magic = DBTABLE_MAGIC;
98*00b67f09SDavid van Moolenbroek 	dbtable->references = 1;
99*00b67f09SDavid van Moolenbroek 
100*00b67f09SDavid van Moolenbroek 	*dbtablep = dbtable;
101*00b67f09SDavid van Moolenbroek 
102*00b67f09SDavid van Moolenbroek 	return (ISC_R_SUCCESS);
103*00b67f09SDavid van Moolenbroek 
104*00b67f09SDavid van Moolenbroek  clean3:
105*00b67f09SDavid van Moolenbroek 	DESTROYLOCK(&dbtable->lock);
106*00b67f09SDavid van Moolenbroek 
107*00b67f09SDavid van Moolenbroek  clean2:
108*00b67f09SDavid van Moolenbroek 	dns_rbt_destroy(&dbtable->rbt);
109*00b67f09SDavid van Moolenbroek 
110*00b67f09SDavid van Moolenbroek  clean1:
111*00b67f09SDavid van Moolenbroek 	isc_mem_putanddetach(&mctx, dbtable, sizeof(*dbtable));
112*00b67f09SDavid van Moolenbroek 
113*00b67f09SDavid van Moolenbroek 	return (result);
114*00b67f09SDavid van Moolenbroek }
115*00b67f09SDavid van Moolenbroek 
116*00b67f09SDavid van Moolenbroek static inline void
dbtable_free(dns_dbtable_t * dbtable)117*00b67f09SDavid van Moolenbroek dbtable_free(dns_dbtable_t *dbtable) {
118*00b67f09SDavid van Moolenbroek 	/*
119*00b67f09SDavid van Moolenbroek 	 * Caller must ensure that it is safe to call.
120*00b67f09SDavid van Moolenbroek 	 */
121*00b67f09SDavid van Moolenbroek 
122*00b67f09SDavid van Moolenbroek 	RWLOCK(&dbtable->tree_lock, isc_rwlocktype_write);
123*00b67f09SDavid van Moolenbroek 
124*00b67f09SDavid van Moolenbroek 	if (dbtable->default_db != NULL)
125*00b67f09SDavid van Moolenbroek 		dns_db_detach(&dbtable->default_db);
126*00b67f09SDavid van Moolenbroek 
127*00b67f09SDavid van Moolenbroek 	dns_rbt_destroy(&dbtable->rbt);
128*00b67f09SDavid van Moolenbroek 
129*00b67f09SDavid van Moolenbroek 	RWUNLOCK(&dbtable->tree_lock, isc_rwlocktype_write);
130*00b67f09SDavid van Moolenbroek 
131*00b67f09SDavid van Moolenbroek 	isc_rwlock_destroy(&dbtable->tree_lock);
132*00b67f09SDavid van Moolenbroek 
133*00b67f09SDavid van Moolenbroek 	dbtable->magic = 0;
134*00b67f09SDavid van Moolenbroek 
135*00b67f09SDavid van Moolenbroek 	isc_mem_putanddetach(&dbtable->mctx, dbtable, sizeof(*dbtable));
136*00b67f09SDavid van Moolenbroek }
137*00b67f09SDavid van Moolenbroek 
138*00b67f09SDavid van Moolenbroek void
dns_dbtable_attach(dns_dbtable_t * source,dns_dbtable_t ** targetp)139*00b67f09SDavid van Moolenbroek dns_dbtable_attach(dns_dbtable_t *source, dns_dbtable_t **targetp) {
140*00b67f09SDavid van Moolenbroek 	REQUIRE(VALID_DBTABLE(source));
141*00b67f09SDavid van Moolenbroek 	REQUIRE(targetp != NULL && *targetp == NULL);
142*00b67f09SDavid van Moolenbroek 
143*00b67f09SDavid van Moolenbroek 	LOCK(&source->lock);
144*00b67f09SDavid van Moolenbroek 
145*00b67f09SDavid van Moolenbroek 	INSIST(source->references > 0);
146*00b67f09SDavid van Moolenbroek 	source->references++;
147*00b67f09SDavid van Moolenbroek 	INSIST(source->references != 0);
148*00b67f09SDavid van Moolenbroek 
149*00b67f09SDavid van Moolenbroek 	UNLOCK(&source->lock);
150*00b67f09SDavid van Moolenbroek 
151*00b67f09SDavid van Moolenbroek 	*targetp = source;
152*00b67f09SDavid van Moolenbroek }
153*00b67f09SDavid van Moolenbroek 
154*00b67f09SDavid van Moolenbroek void
dns_dbtable_detach(dns_dbtable_t ** dbtablep)155*00b67f09SDavid van Moolenbroek dns_dbtable_detach(dns_dbtable_t **dbtablep) {
156*00b67f09SDavid van Moolenbroek 	dns_dbtable_t *dbtable;
157*00b67f09SDavid van Moolenbroek 	isc_boolean_t free_dbtable = ISC_FALSE;
158*00b67f09SDavid van Moolenbroek 
159*00b67f09SDavid van Moolenbroek 	REQUIRE(dbtablep != NULL);
160*00b67f09SDavid van Moolenbroek 	dbtable = *dbtablep;
161*00b67f09SDavid van Moolenbroek 	REQUIRE(VALID_DBTABLE(dbtable));
162*00b67f09SDavid van Moolenbroek 
163*00b67f09SDavid van Moolenbroek 	LOCK(&dbtable->lock);
164*00b67f09SDavid van Moolenbroek 
165*00b67f09SDavid van Moolenbroek 	INSIST(dbtable->references > 0);
166*00b67f09SDavid van Moolenbroek 	dbtable->references--;
167*00b67f09SDavid van Moolenbroek 	if (dbtable->references == 0)
168*00b67f09SDavid van Moolenbroek 		free_dbtable = ISC_TRUE;
169*00b67f09SDavid van Moolenbroek 
170*00b67f09SDavid van Moolenbroek 	UNLOCK(&dbtable->lock);
171*00b67f09SDavid van Moolenbroek 
172*00b67f09SDavid van Moolenbroek 	if (free_dbtable)
173*00b67f09SDavid van Moolenbroek 		dbtable_free(dbtable);
174*00b67f09SDavid van Moolenbroek 
175*00b67f09SDavid van Moolenbroek 	*dbtablep = NULL;
176*00b67f09SDavid van Moolenbroek }
177*00b67f09SDavid van Moolenbroek 
178*00b67f09SDavid van Moolenbroek isc_result_t
dns_dbtable_add(dns_dbtable_t * dbtable,dns_db_t * db)179*00b67f09SDavid van Moolenbroek dns_dbtable_add(dns_dbtable_t *dbtable, dns_db_t *db) {
180*00b67f09SDavid van Moolenbroek 	isc_result_t result;
181*00b67f09SDavid van Moolenbroek 	dns_db_t *clone;
182*00b67f09SDavid van Moolenbroek 
183*00b67f09SDavid van Moolenbroek 	REQUIRE(VALID_DBTABLE(dbtable));
184*00b67f09SDavid van Moolenbroek 	REQUIRE(dns_db_class(db) == dbtable->rdclass);
185*00b67f09SDavid van Moolenbroek 
186*00b67f09SDavid van Moolenbroek 	clone = NULL;
187*00b67f09SDavid van Moolenbroek 	dns_db_attach(db, &clone);
188*00b67f09SDavid van Moolenbroek 
189*00b67f09SDavid van Moolenbroek 	RWLOCK(&dbtable->tree_lock, isc_rwlocktype_write);
190*00b67f09SDavid van Moolenbroek 	result = dns_rbt_addname(dbtable->rbt, dns_db_origin(clone), clone);
191*00b67f09SDavid van Moolenbroek 	RWUNLOCK(&dbtable->tree_lock, isc_rwlocktype_write);
192*00b67f09SDavid van Moolenbroek 
193*00b67f09SDavid van Moolenbroek 	return (result);
194*00b67f09SDavid van Moolenbroek }
195*00b67f09SDavid van Moolenbroek 
196*00b67f09SDavid van Moolenbroek void
dns_dbtable_remove(dns_dbtable_t * dbtable,dns_db_t * db)197*00b67f09SDavid van Moolenbroek dns_dbtable_remove(dns_dbtable_t *dbtable, dns_db_t *db) {
198*00b67f09SDavid van Moolenbroek 	dns_db_t *stored_data = NULL;
199*00b67f09SDavid van Moolenbroek 	isc_result_t result;
200*00b67f09SDavid van Moolenbroek 	dns_name_t *name;
201*00b67f09SDavid van Moolenbroek 
202*00b67f09SDavid van Moolenbroek 	REQUIRE(VALID_DBTABLE(dbtable));
203*00b67f09SDavid van Moolenbroek 
204*00b67f09SDavid van Moolenbroek 	name = dns_db_origin(db);
205*00b67f09SDavid van Moolenbroek 
206*00b67f09SDavid van Moolenbroek 	/*
207*00b67f09SDavid van Moolenbroek 	 * There is a requirement that the association of name with db
208*00b67f09SDavid van Moolenbroek 	 * be verified.  With the current rbt.c this is expensive to do,
209*00b67f09SDavid van Moolenbroek 	 * because effectively two find operations are being done, but
210*00b67f09SDavid van Moolenbroek 	 * deletion is relatively infrequent.
211*00b67f09SDavid van Moolenbroek 	 * XXXDCL ... this could be cheaper now with dns_rbt_deletenode.
212*00b67f09SDavid van Moolenbroek 	 */
213*00b67f09SDavid van Moolenbroek 
214*00b67f09SDavid van Moolenbroek 	RWLOCK(&dbtable->tree_lock, isc_rwlocktype_write);
215*00b67f09SDavid van Moolenbroek 
216*00b67f09SDavid van Moolenbroek 	result = dns_rbt_findname(dbtable->rbt, name, 0, NULL,
217*00b67f09SDavid van Moolenbroek 				  (void **) (void *)&stored_data);
218*00b67f09SDavid van Moolenbroek 
219*00b67f09SDavid van Moolenbroek 	if (result == ISC_R_SUCCESS) {
220*00b67f09SDavid van Moolenbroek 		INSIST(stored_data == db);
221*00b67f09SDavid van Moolenbroek 
222*00b67f09SDavid van Moolenbroek 		(void)dns_rbt_deletename(dbtable->rbt, name, ISC_FALSE);
223*00b67f09SDavid van Moolenbroek 	}
224*00b67f09SDavid van Moolenbroek 
225*00b67f09SDavid van Moolenbroek 	RWUNLOCK(&dbtable->tree_lock, isc_rwlocktype_write);
226*00b67f09SDavid van Moolenbroek }
227*00b67f09SDavid van Moolenbroek 
228*00b67f09SDavid van Moolenbroek void
dns_dbtable_adddefault(dns_dbtable_t * dbtable,dns_db_t * db)229*00b67f09SDavid van Moolenbroek dns_dbtable_adddefault(dns_dbtable_t *dbtable, dns_db_t *db) {
230*00b67f09SDavid van Moolenbroek 	REQUIRE(VALID_DBTABLE(dbtable));
231*00b67f09SDavid van Moolenbroek 	REQUIRE(dbtable->default_db == NULL);
232*00b67f09SDavid van Moolenbroek 	REQUIRE(dns_name_compare(dns_db_origin(db), dns_rootname) == 0);
233*00b67f09SDavid van Moolenbroek 
234*00b67f09SDavid van Moolenbroek 	RWLOCK(&dbtable->tree_lock, isc_rwlocktype_write);
235*00b67f09SDavid van Moolenbroek 
236*00b67f09SDavid van Moolenbroek 	dbtable->default_db = NULL;
237*00b67f09SDavid van Moolenbroek 	dns_db_attach(db, &dbtable->default_db);
238*00b67f09SDavid van Moolenbroek 
239*00b67f09SDavid van Moolenbroek 	RWUNLOCK(&dbtable->tree_lock, isc_rwlocktype_write);
240*00b67f09SDavid van Moolenbroek }
241*00b67f09SDavid van Moolenbroek 
242*00b67f09SDavid van Moolenbroek void
dns_dbtable_getdefault(dns_dbtable_t * dbtable,dns_db_t ** dbp)243*00b67f09SDavid van Moolenbroek dns_dbtable_getdefault(dns_dbtable_t *dbtable, dns_db_t **dbp) {
244*00b67f09SDavid van Moolenbroek 	REQUIRE(VALID_DBTABLE(dbtable));
245*00b67f09SDavid van Moolenbroek 	REQUIRE(dbp != NULL && *dbp == NULL);
246*00b67f09SDavid van Moolenbroek 
247*00b67f09SDavid van Moolenbroek 	RWLOCK(&dbtable->tree_lock, isc_rwlocktype_read);
248*00b67f09SDavid van Moolenbroek 
249*00b67f09SDavid van Moolenbroek 	dns_db_attach(dbtable->default_db, dbp);
250*00b67f09SDavid van Moolenbroek 
251*00b67f09SDavid van Moolenbroek 	RWUNLOCK(&dbtable->tree_lock, isc_rwlocktype_read);
252*00b67f09SDavid van Moolenbroek }
253*00b67f09SDavid van Moolenbroek 
254*00b67f09SDavid van Moolenbroek void
dns_dbtable_removedefault(dns_dbtable_t * dbtable)255*00b67f09SDavid van Moolenbroek dns_dbtable_removedefault(dns_dbtable_t *dbtable) {
256*00b67f09SDavid van Moolenbroek 	REQUIRE(VALID_DBTABLE(dbtable));
257*00b67f09SDavid van Moolenbroek 
258*00b67f09SDavid van Moolenbroek 	RWLOCK(&dbtable->tree_lock, isc_rwlocktype_write);
259*00b67f09SDavid van Moolenbroek 
260*00b67f09SDavid van Moolenbroek 	dns_db_detach(&dbtable->default_db);
261*00b67f09SDavid van Moolenbroek 
262*00b67f09SDavid van Moolenbroek 	RWUNLOCK(&dbtable->tree_lock, isc_rwlocktype_write);
263*00b67f09SDavid van Moolenbroek }
264*00b67f09SDavid van Moolenbroek 
265*00b67f09SDavid van Moolenbroek isc_result_t
dns_dbtable_find(dns_dbtable_t * dbtable,dns_name_t * name,unsigned int options,dns_db_t ** dbp)266*00b67f09SDavid van Moolenbroek dns_dbtable_find(dns_dbtable_t *dbtable, dns_name_t *name,
267*00b67f09SDavid van Moolenbroek 		 unsigned int options, dns_db_t **dbp)
268*00b67f09SDavid van Moolenbroek {
269*00b67f09SDavid van Moolenbroek 	dns_db_t *stored_data = NULL;
270*00b67f09SDavid van Moolenbroek 	isc_result_t result;
271*00b67f09SDavid van Moolenbroek 	unsigned int rbtoptions = 0;
272*00b67f09SDavid van Moolenbroek 
273*00b67f09SDavid van Moolenbroek 	REQUIRE(dbp != NULL && *dbp == NULL);
274*00b67f09SDavid van Moolenbroek 
275*00b67f09SDavid van Moolenbroek 	if ((options & DNS_DBTABLEFIND_NOEXACT) != 0)
276*00b67f09SDavid van Moolenbroek 		rbtoptions |= DNS_RBTFIND_NOEXACT;
277*00b67f09SDavid van Moolenbroek 
278*00b67f09SDavid van Moolenbroek 	RWLOCK(&dbtable->tree_lock, isc_rwlocktype_read);
279*00b67f09SDavid van Moolenbroek 
280*00b67f09SDavid van Moolenbroek 	result = dns_rbt_findname(dbtable->rbt, name, rbtoptions, NULL,
281*00b67f09SDavid van Moolenbroek 				  (void **) (void *)&stored_data);
282*00b67f09SDavid van Moolenbroek 
283*00b67f09SDavid van Moolenbroek 	if (result == ISC_R_SUCCESS || result == DNS_R_PARTIALMATCH)
284*00b67f09SDavid van Moolenbroek 		dns_db_attach(stored_data, dbp);
285*00b67f09SDavid van Moolenbroek 	else if (dbtable->default_db != NULL) {
286*00b67f09SDavid van Moolenbroek 		dns_db_attach(dbtable->default_db, dbp);
287*00b67f09SDavid van Moolenbroek 		result = DNS_R_PARTIALMATCH;
288*00b67f09SDavid van Moolenbroek 	} else
289*00b67f09SDavid van Moolenbroek 		result = ISC_R_NOTFOUND;
290*00b67f09SDavid van Moolenbroek 
291*00b67f09SDavid van Moolenbroek 	RWUNLOCK(&dbtable->tree_lock, isc_rwlocktype_read);
292*00b67f09SDavid van Moolenbroek 
293*00b67f09SDavid van Moolenbroek 	return (result);
294*00b67f09SDavid van Moolenbroek }
295