From 4584e3ac402580e2bec7cdf96b4d835af8d6b430 Mon Sep 17 00:00:00 2001
From: Lubos Slovak <lubos.slovak@nic.cz>
Date: Fri, 4 Oct 2013 15:43:11 +0200
Subject: [PATCH] Fixed(?) RCU locks (Added a few more of them)

---
 src/knot/server/xfr-handler.c        | 3 +++
 src/knot/server/zones.c              | 3 +++
 src/libknot/nameserver/name-server.c | 2 ++
 3 files changed, 8 insertions(+)

diff --git a/src/knot/server/xfr-handler.c b/src/knot/server/xfr-handler.c
index eada9f188..57befccba 100644
--- a/src/knot/server/xfr-handler.c
+++ b/src/knot/server/xfr-handler.c
@@ -577,6 +577,7 @@ static int xfr_async_finish(fdset_t *set, unsigned id)
 static int xfr_task_finalize(xfrworker_t *w, knot_ns_xfr_t *rq)
 {
 	int ret = KNOT_EINVAL;
+	rcu_read_lock();
 	knot_nameserver_t *ns = w->master->ns;
 
 	if (rq->type == XFR_TYPE_AIN) {
@@ -614,6 +615,8 @@ static int xfr_task_finalize(xfrworker_t *w, knot_ns_xfr_t *rq)
 		rq->new_contents = NULL; /* Do not free. */
 	}
 
+	rcu_read_unlock();
+
 	return ret;
 }
 
diff --git a/src/knot/server/zones.c b/src/knot/server/zones.c
index 49745ac4b..f36089636 100644
--- a/src/knot/server/zones.c
+++ b/src/knot/server/zones.c
@@ -2941,6 +2941,8 @@ int zones_save_zone(const knot_ns_xfr_t *xfr)
 
 	dbg_xfr("xfr: %s Saving new zone file.\n", xfr->msg);
 
+	rcu_read_lock();
+
 	zonedata_t *zd = (zonedata_t *)knot_zone_data(xfr->zone);
 	knot_zone_contents_t *new_zone = xfr->new_contents;
 
@@ -2961,6 +2963,7 @@ int zones_save_zone(const knot_ns_xfr_t *xfr)
 
 	/* dump the zone into text zone file */
 	int ret = zones_dump_zone_text(new_zone, zonefile);
+	rcu_read_unlock();
 	return ret;
 }
 
diff --git a/src/libknot/nameserver/name-server.c b/src/libknot/nameserver/name-server.c
index 545c81474..7aeeeec57 100644
--- a/src/libknot/nameserver/name-server.c
+++ b/src/libknot/nameserver/name-server.c
@@ -4058,7 +4058,9 @@ int knot_ns_switch_zone(knot_nameserver_t *nameserver,
 		zone->zone = z;
 	}
 
+	rcu_read_unlock();
 	int ret = xfrin_switch_zone(z, zone, xfr->type);
+	rcu_read_lock();
 
 dbg_ns_exec_verb(
 	dbg_ns_verb("Zone db contents: (zone count: %zu)\n",
-- 
GitLab