diff --git a/lib/dns/qpcache.c b/lib/dns/qpcache.c index 74bdba0223..c59d4e0f95 100644 --- a/lib/dns/qpcache.c +++ b/lib/dns/qpcache.c @@ -28,7 +28,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/lib/dns/qpzone.c b/lib/dns/qpzone.c index 97071b6019..a1b7b97a20 100644 --- a/lib/dns/qpzone.c +++ b/lib/dns/qpzone.c @@ -28,7 +28,7 @@ #include #include #include -#include +#include #include #include #include @@ -3939,17 +3939,15 @@ detachnode(dns_db_t *db, dns_dbnode_t **nodep DNS__DB_FLARG) { nlock = &qpdb->buckets[node->locknum].lock; /* - * We can't destroy qpzonedb while holding a nodelock, so - * we need to reference it before acquiring the lock - * and release it afterward. + * qpzone_destroy() uses call_rcu() API to destroy the node locks, + * so it is safe to call it in the middle of NODE_LOCK. */ - qpzonedb_ref(qpdb); + rcu_read_lock(); NODE_RDLOCK(nlock, &nlocktype); qpznode_release(qpdb, node, 0, &nlocktype DNS__DB_FLARG_PASS); NODE_UNLOCK(nlock, &nlocktype); - - qpzonedb_detach(&qpdb); + rcu_read_unlock(); } static unsigned int