int
lnet_add_route (__u32 net, unsigned int hops, lnet_nid_t gateway)
{
- struct list_head zombies;
struct list_head *e;
lnet_remotenet_t *rnet;
lnet_remotenet_t *rnet2;
lnet_route_t *route;
- lnet_route_t *route2;
lnet_ni_t *ni;
int add_route;
int rc;
CFS_INIT_LIST_HEAD(&rnet->lrn_routes);
rnet->lrn_net = net;
- rnet->lrn_hops = hops;
+ route->lr_hops = hops;
LNET_LOCK();
}
LASSERT (!the_lnet.ln_shutdown);
- CFS_INIT_LIST_HEAD(&zombies);
rnet2 = lnet_find_net_locked(net);
if (rnet2 == NULL) {
rnet2 = rnet;
}
- if (hops > rnet2->lrn_hops) {
- /* New route is longer; ignore it */
- add_route = 0;
- } else if (hops < rnet2->lrn_hops) {
- /* new route supercedes all currently known routes to this
- * net */
- list_add(&zombies, &rnet2->lrn_routes);
- list_del_init(&rnet2->lrn_routes);
- add_route = 1;
- } else {
- add_route = 1;
- /* New route has the same hopcount as existing routes; search
- * for a duplicate route (it's a NOOP if it is) */
- list_for_each (e, &rnet2->lrn_routes) {
- route2 = list_entry(e, lnet_route_t, lr_list);
-
- if (route2->lr_gateway == route->lr_gateway) {
- add_route = 0;
- break;
- }
+ /* Search for a duplicate route (it's a NOOP if it is) */
+ add_route = 1;
+ list_for_each (e, &rnet2->lrn_routes) {
+ lnet_route_t *route2 = list_entry(e, lnet_route_t, lr_list);
- /* our loopups must be true */
- LASSERT (route2->lr_gateway->lp_nid != gateway);
+ if (route2->lr_gateway == route->lr_gateway) {
+ add_route = 0;
+ break;
}
+
+ /* our lookups must be true */
+ LASSERT (route2->lr_gateway->lp_nid != gateway);
}
if (add_route) {
ni = route->lr_gateway->lp_ni;
lnet_ni_addref_locked(ni);
- LASSERT (rc == 0);
list_add_tail(&route->lr_list, &rnet2->lrn_routes);
the_lnet.ln_remote_nets_version++;
if (rnet != rnet2)
LIBCFS_FREE(rnet, sizeof(*rnet));
- while (!list_empty(&zombies)) {
- route = list_entry(zombies.next, lnet_route_t, lr_list);
- list_del(&route->lr_list);
-
- LNET_LOCK();
- lnet_rtr_decref_locked(route->lr_gateway);
- lnet_peer_decref_locked(route->lr_gateway);
- LNET_UNLOCK();
- LIBCFS_FREE(route, sizeof(*route));
- }
-
- return rc;
+ return 0;
}
int
if (idx-- == 0) {
*net = rnet->lrn_net;
- *hops = rnet->lrn_hops;
+ *hops = route->lr_hops;
*gateway = route->lr_gateway->lp_nid;
*alive = route->lr_gateway->lp_alive;
LNET_UNLOCK();