diff --git a/bin/named/server.c b/bin/named/server.c index 071fe0c511..425fdcc871 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -2856,7 +2856,7 @@ catz_addmodzone_cb(void *arg) { } /* Remove the zone from the zone table */ - dns_zt_unmount(cz->view->zonetable, zone); + dns_view_delzone(cz->view, zone); goto cleanup; } @@ -2925,7 +2925,7 @@ catz_delzone_cb(void *arg) { dns_zone_unload(zone); } - CHECK(dns_zt_unmount(cz->view->zonetable, zone)); + CHECK(dns_view_delzone(cz->view, zone)); file = dns_zone_getfile(zone); if (file != NULL) { isc_file_remove(file); @@ -13551,7 +13551,7 @@ do_addzone(named_server_t *server, ns_cfgctx_t *cfg, dns_view_t *view, } /* Remove the zone from the zone table */ - dns_zt_unmount(view->zonetable, zone); + dns_view_delzone(view, zone); goto cleanup; } @@ -13759,7 +13759,7 @@ do_modzone(named_server_t *server, ns_cfgctx_t *cfg, dns_view_t *view, } /* Remove the zone from the zone table */ - dns_zt_unmount(view->zonetable, zone); + dns_view_delzone(view, zone); goto cleanup; } @@ -14147,7 +14147,7 @@ named_server_delzone(named_server_t *server, isc_lex_t *lex, if (dns_zone_gettype(zone) == dns_zone_redirect) { dns_zone_detach(&view->redirect); } else { - CHECK(dns_zt_unmount(view->zonetable, zone)); + CHECK(dns_view_delzone(view, zone)); } /* Send cleanup event */ diff --git a/lib/dns/include/dns/view.h b/lib/dns/include/dns/view.h index e801b3a30f..aa0a650f0b 100644 --- a/lib/dns/include/dns/view.h +++ b/lib/dns/include/dns/view.h @@ -493,6 +493,16 @@ dns_view_addzone(dns_view_t *view, dns_zone_t *zone); *\li 'zone' is a valid zone. */ +isc_result_t +dns_view_delzone(dns_view_t *view, dns_zone_t *zone); +/*%< + * Removes zone 'zone' from 'view'. + * + * Requires: + * + *\li 'zone' is a valid zone. + */ + void dns_view_freeze(dns_view_t *view); /*%< diff --git a/lib/dns/view.c b/lib/dns/view.c index 7349ae6f82..809223f67d 100644 --- a/lib/dns/view.c +++ b/lib/dns/view.c @@ -787,6 +787,25 @@ dns_view_addzone(dns_view_t *view, dns_zone_t *zone) { return (result); } +isc_result_t +dns_view_delzone(dns_view_t *view, dns_zone_t *zone) { + isc_result_t result; + dns_zt_t *zonetable = NULL; + + REQUIRE(DNS_VIEW_VALID(view)); + + rcu_read_lock(); + zonetable = rcu_dereference(view->zonetable); + if (zonetable != NULL) { + result = dns_zt_unmount(zonetable, zone); + } else { + result = ISC_R_SUCCESS; + } + rcu_read_unlock(); + + return (result); +} + isc_result_t dns_view_findzone(dns_view_t *view, const dns_name_t *name, dns_zone_t **zonep) {