Add dns_view_delzone

dns_view_delzone performs the rcu locking required around accessing
view->zonetable.
This commit is contained in:
Mark Andrews 2023-05-31 12:59:03 +10:00 committed by Ondřej Surý
parent ad747976bb
commit e0f41259bd
No known key found for this signature in database
GPG key ID: 2820F37E873DEA41
3 changed files with 34 additions and 5 deletions

View file

@ -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 */

View file

@ -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);
/*%<

View file

@ -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) {