summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bgpd/bgp_route.c2
-rw-r--r--bgpd/bgp_table.h4
-rw-r--r--lib/table.h8
3 files changed, 9 insertions, 5 deletions
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index 7fbc6d9a65..9ba9eb1e59 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -188,7 +188,7 @@ static void bgp_info_extra_free(struct bgp_info_extra **extra)
struct bgp_info *bi = (struct bgp_info *)e->parent;
if (bi->net)
- bgp_unlock_node((struct bgp_node *)bi->net);
+ bi->net = bgp_unlock_node((struct bgp_node *)bi->net);
bgp_info_unlock(e->parent);
e->parent = NULL;
}
diff --git a/bgpd/bgp_table.h b/bgpd/bgp_table.h
index 60c2cbd4a4..f7eac09546 100644
--- a/bgpd/bgp_table.h
+++ b/bgpd/bgp_table.h
@@ -128,9 +128,9 @@ static inline struct bgp_node *bgp_node_parent_nolock(struct bgp_node *node)
/*
* bgp_unlock_node
*/
-static inline void bgp_unlock_node(struct bgp_node *node)
+static inline struct bgp_node *bgp_unlock_node(struct bgp_node *node)
{
- route_unlock_node(bgp_node_to_rnode(node));
+ return (struct bgp_node *)route_unlock_node(bgp_node_to_rnode(node));
}
/*
diff --git a/lib/table.h b/lib/table.h
index a9d788b35a..f58a6025e2 100644
--- a/lib/table.h
+++ b/lib/table.h
@@ -233,13 +233,17 @@ static inline struct route_node *route_lock_node(struct route_node *node)
}
/* Unlock node. */
-static inline void route_unlock_node(struct route_node *node)
+static inline struct route_node *route_unlock_node(struct route_node *node)
{
assert(node->lock > 0);
(*(unsigned *)&node->lock)--;
- if (node->lock == 0)
+ if (node->lock == 0) {
route_node_delete(node);
+ return NULL;
+ }
+
+ return node;
}
/*