From: Yu Watanabe Date: Mon, 11 Nov 2024 03:26:48 +0000 (+0900) Subject: network/nexthop: forget dependent routes without trying to remove X-Git-Tag: v257-rc2~39^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fd2ea787bd6e80d9cccfe4a061d8b5267d9ae83d;p=thirdparty%2Fsystemd.git network/nexthop: forget dependent routes without trying to remove When a nexthop is removed, routes depend on the removed nexthop are already removed. It is not necessary to remove them, as already commented. Let's forget them without trying to remove. --- diff --git a/src/network/networkd-nexthop.c b/src/network/networkd-nexthop.c index 76f2371bd8e..94df608222f 100644 --- a/src/network/networkd-nexthop.c +++ b/src/network/networkd-nexthop.c @@ -485,21 +485,23 @@ static void log_nexthop_debug(const NextHop *nexthop, const char *str, Manager * yes_no(nexthop->blackhole), strna(group), strna(flags)); } -static int nexthop_remove_dependents(NextHop *nexthop, Manager *manager) { - int r = 0; - +static void nexthop_forget_dependents(NextHop *nexthop, Manager *manager) { assert(nexthop); assert(manager); /* If a nexthop is removed, the kernel silently removes routes that depend on the removed nexthop. - * Let's remove them for safety (though, they are already removed in the kernel, hence that should - * fail), and forget them. */ + * Let's forget them. */ Route *route; - SET_FOREACH(route, nexthop->routes) - RET_GATHER(r, route_remove(route, manager)); - - return r; + SET_FOREACH(route, nexthop->routes) { + Request *req; + if (route_get_request(manager, route, &req) >= 0) + route_enter_removed(req->userdata); + + route_enter_removed(route); + log_route_debug(route, "Forgetting silently removed", manager); + route_detach(route); + } } static int nexthop_remove_handler(sd_netlink *rtnl, sd_netlink_message *m, RemoveRequest *rreq) { @@ -517,7 +519,7 @@ static int nexthop_remove_handler(sd_netlink *rtnl, sd_netlink_message *m, Remov (r == -ENOENT || !nexthop->manager) ? LOG_DEBUG : LOG_WARNING, r, "Could not drop nexthop, ignoring"); - (void) nexthop_remove_dependents(nexthop, manager); + nexthop_forget_dependents(nexthop, manager); if (nexthop->manager) { /* If the nexthop cannot be removed, then assume the nexthop is already removed. */ @@ -1022,7 +1024,7 @@ int manager_rtnl_process_nexthop(sd_netlink *rtnl, sd_netlink_message *message, if (nexthop) { nexthop_enter_removed(nexthop); log_nexthop_debug(nexthop, "Forgetting removed", m); - (void) nexthop_remove_dependents(nexthop, m); + nexthop_forget_dependents(nexthop, m); nexthop_detach(nexthop); } else log_nexthop_debug(&(const NextHop) { .id = id }, "Kernel removed unknown", m); diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c index 8317a5894c1..3f775fc13ce 100644 --- a/src/network/networkd-route.c +++ b/src/network/networkd-route.c @@ -47,7 +47,7 @@ static Route* route_detach_impl(Route *route) { return NULL; } -static void route_detach(Route *route) { +void route_detach(Route *route) { route_unref(route_detach_impl(route)); } diff --git a/src/network/networkd-route.h b/src/network/networkd-route.h index b0da5d80c73..bfe52ca3373 100644 --- a/src/network/networkd-route.h +++ b/src/network/networkd-route.h @@ -89,6 +89,8 @@ Route* route_ref(Route *route); Route* route_unref(Route *route); DEFINE_SECTION_CLEANUP_FUNCTIONS(Route, route_unref); +void route_detach(Route *route); + int route_new(Route **ret); int route_new_static(Network *network, const char *filename, unsigned section_line, Route **ret); int route_dup(const Route *src, const RouteNextHop *nh, Route **ret);