0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2024-09-19 11:55:21 +00:00

Static: Unlock IGP tables on cleanup to avoid problems with hostentry unlocking

This commit is contained in:
Maria Matejka 2024-03-05 12:17:56 +01:00
parent 233004988b
commit b114aa0073
2 changed files with 9 additions and 6 deletions

View File

@ -4476,10 +4476,7 @@ hostentry_tmp_unlock(resource *r)
{ {
struct hostentry_tmp_lock *l = SKIP_BACK(struct hostentry_tmp_lock, r, r); struct hostentry_tmp_lock *l = SKIP_BACK(struct hostentry_tmp_lock, r, r);
RT_LOCKED(l->tab, tab) RT_LOCKED(l->tab, tab)
{
l->he->uc--; l->he->uc--;
rt_unlock_table(tab);
}
} }
static void static void
@ -4524,7 +4521,6 @@ rt_get_hostentry(struct rtable_private *tab, ip_addr a, ip_addr ll, rtable *dep)
l->he = he; l->he = he;
l->tab = RT_PUB(tab); l->tab = RT_PUB(tab);
l->he->uc++; l->he->uc++;
rt_lock_table(tab);
return he; return he;
} }

View File

@ -564,13 +564,19 @@ static_shutdown(struct proto *P)
WALK_LIST(r, cf->routes) WALK_LIST(r, cf->routes)
static_reset_rte(p, r); static_reset_rte(p, r);
return PS_DOWN;
}
static void
static_cleanup(struct proto *P)
{
struct static_proto *p = (void *) P;
if (p->igp_table_ip4) if (p->igp_table_ip4)
rt_unlock_table(p->igp_table_ip4); rt_unlock_table(p->igp_table_ip4);
if (p->igp_table_ip6) if (p->igp_table_ip6)
rt_unlock_table(p->igp_table_ip6); rt_unlock_table(p->igp_table_ip6);
return PS_DOWN;
} }
static void static void
@ -835,6 +841,7 @@ struct protocol proto_static = {
.dump = static_dump, .dump = static_dump,
.start = static_start, .start = static_start,
.shutdown = static_shutdown, .shutdown = static_shutdown,
.cleanup = static_cleanup,
.reconfigure = static_reconfigure, .reconfigure = static_reconfigure,
.copy_config = static_copy_config, .copy_config = static_copy_config,
}; };