static void lnet_add_route_to_rnet(struct lnet_remotenet *rnet,
struct lnet_route *route);
-static void lnet_del_route_from_rnet(lnet_nid_t gw_nid,
- struct list_head *route_list,
+static void lnet_del_route_from_rnet(lnet_nid_t gw_nid, struct list_head *route_list,
struct list_head *zombies);
static int
return 0;
}
-static inline void
-lnet_move_route(struct lnet_route *route, struct lnet_peer *lp)
+void
+lnet_move_route(struct lnet_route *route, struct lnet_peer *lp,
+ struct list_head *rt_list)
{
struct lnet_remotenet *rnet;
struct list_head zombies;
+ struct list_head *l;
INIT_LIST_HEAD(&zombies);
+ if (rt_list)
+ l = rt_list;
+ else
+ l = &zombies;
+
rnet = lnet_find_rnet_locked(route->lr_net);
LASSERT(rnet);
- lnet_del_route_from_rnet(route->lr_nid, &rnet->lrn_routes,
- &zombies);
+ CDEBUG(D_NET, "deleting route %s->%s\n",
+ libcfs_net2str(route->lr_net),
+ libcfs_nid2str(route->lr_nid));
+
+ /*
+ * use the gateway's lp_primary_nid to delete the route as the
+ * lr_nid can be a constituent NID of the peer
+ */
+ lnet_del_route_from_rnet(route->lr_gateway->lp_primary_nid,
+ &rnet->lrn_routes, l);
if (lp) {
- route = list_first_entry(&zombies, struct lnet_route,
+ route = list_first_entry(l, struct lnet_route,
lr_list);
route->lr_gateway = lp;
lnet_add_route_to_rnet(rnet, route);
} else {
- while (!list_empty(&zombies)) {
- route = list_first_entry(&zombies, struct lnet_route,
+ while (!list_empty(l) && !rt_list) {
+ route = list_first_entry(l, struct lnet_route,
lr_list);
list_del(&route->lr_list);
LIBCFS_FREE(route, sizeof(*route));
}
}
-
}
void
else if (route->lr_hops >= r2->lr_hops)
present = true;
else
- lnet_move_route(r2, NULL);
+ lnet_move_route(r2, NULL, NULL);
}
}
if (present)
- lnet_move_route(route, NULL);
+ lnet_move_route(route, NULL, NULL);
else
- lnet_move_route(route, target);
+ lnet_move_route(route, target, NULL);
}
if (list_empty(&target->lp_rtr_list)) {
return rc;
}
-static void
+void
lnet_del_route_from_rnet(lnet_nid_t gw_nid, struct list_head *route_list,
struct list_head *zombies)
{