Whamcloud - gitweb
LU-3095 build: fix 'memory corruption' errors
[fs/lustre-release.git] / lnet / lnet / router_proc.c
index f64bea2..d07ba78 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  *
- * Copyright (c) 2011, Whamcloud, Inc.
+ * Copyright (c) 2011, 2013, Intel Corporation.
  *
  *   This file is part of Portals
  *   http://sourceforge.net/projects/sandiaportals/
@@ -58,7 +58,7 @@ enum {
 /*
  * NB: max allowed LNET_CPT_BITS is 8 on 64-bit system and 2 on 32-bit system
  */
-#define LNET_PROC_CPT_BITS     LNET_CPT_BITS
+#define LNET_PROC_CPT_BITS     (LNET_CPT_BITS + 1)
 /* change version, 16 bits or 8 bits */
 #define LNET_PROC_VER_BITS     MAX(((MIN(LNET_LOFFT_BITS, 64)) / 4), 8)
 
@@ -199,37 +199,45 @@ int LL_PROC_PROTO(proc_lnet_routes)
                lnet_route_t            *route = NULL;
                lnet_remotenet_t        *rnet  = NULL;
                int                     skip  = off - 1;
+               cfs_list_t              *rn_list;
+               int                     i;
 
                lnet_net_lock(0);
 
                if (ver != LNET_PROC_VERSION(the_lnet.ln_remote_nets_version)) {
                        lnet_net_unlock(0);
-                        LIBCFS_FREE(tmpstr, tmpsiz);
-                        return -ESTALE;
-                }
+                       LIBCFS_FREE(tmpstr, tmpsiz);
+                       return -ESTALE;
+               }
 
-                n = the_lnet.ln_remote_nets.next;
+               for (i = 0; i < LNET_REMOTE_NETS_HASH_SIZE && route == NULL;
+                    i++) {
+                       rn_list = &the_lnet.ln_remote_nets_hash[i];
 
-                while (n != &the_lnet.ln_remote_nets && route == NULL) {
-                        rnet = cfs_list_entry(n, lnet_remotenet_t, lrn_list);
+                       n = rn_list->next;
 
-                        r = rnet->lrn_routes.next;
+                       while (n != rn_list && route == NULL) {
+                               rnet = cfs_list_entry(n, lnet_remotenet_t,
+                                                     lrn_list);
 
-                        while (r != &rnet->lrn_routes) {
-                                lnet_route_t *re =
-                                        cfs_list_entry(r, lnet_route_t,
-                                                       lr_list);
-                                if (skip == 0) {
-                                        route = re;
-                                        break;
-                                }
+                               r = rnet->lrn_routes.next;
 
-                                skip--;
-                                r = r->next;
-                        }
+                               while (r != &rnet->lrn_routes) {
+                                       lnet_route_t *re =
+                                               cfs_list_entry(r, lnet_route_t,
+                                                              lr_list);
+                                       if (skip == 0) {
+                                               route = re;
+                                               break;
+                                       }
 
-                        n = n->next;
-                }
+                                       skip--;
+                                       r = r->next;
+                               }
+
+                               n = n->next;
+                       }
+               }
 
                 if (route != NULL) {
                         __u32        net   = rnet->lrn_net;
@@ -413,8 +421,8 @@ int LL_PROC_PROTO(proc_lnet_peers)
        char                    *s;
        int                     cpt  = LNET_PROC_CPT_GET(*ppos);
        int                     ver  = LNET_PROC_VER_GET(*ppos);
-       int                     hoff = LNET_PROC_HOFF_GET(*ppos);
        int                     hash = LNET_PROC_HASH_GET(*ppos);
+       int                     hoff = LNET_PROC_HOFF_GET(*ppos);
        int                     rc = 0;
        int                     len;
 
@@ -424,8 +432,10 @@ int LL_PROC_PROTO(proc_lnet_peers)
        if (*lenp == 0)
                return 0;
 
-       if (cpt >= LNET_CPT_NUMBER)
+       if (cpt >= LNET_CPT_NUMBER) {
+               *lenp = 0;
                return 0;
+       }
 
         LIBCFS_ALLOC(tmpstr, tmpsiz);
         if (tmpstr == NULL)
@@ -442,11 +452,14 @@ int LL_PROC_PROTO(proc_lnet_peers)
 
                hoff++;
        } else {
-               struct lnet_peer        *peer   = NULL;
-               cfs_list_t              *p      = NULL;
-               int                     skip    = hoff - 1;
-
+               struct lnet_peer        *peer;
+               cfs_list_t              *p;
+               int                     skip;
  again:
+               p = NULL;
+               peer = NULL;
+               skip = hoff - 1;
+
                lnet_net_lock(cpt);
                ptable = the_lnet.ln_peer_tables[cpt];
                if (hoff == 1)
@@ -536,14 +549,14 @@ int LL_PROC_PROTO(proc_lnet_peers)
 
                } else { /* peer is NULL */
                        lnet_net_unlock(cpt);
+               }
 
-                       if (hash == LNET_PEER_HASH_SIZE &&
-                           cpt < LNET_CPT_NUMBER - 1) {
-                               cpt++;
-                               hash = 0;
-                               hoff = 1;
+               if (hash == LNET_PEER_HASH_SIZE) {
+                       cpt++;
+                       hash = 0;
+                       hoff = 1;
+                       if (peer == NULL && cpt < LNET_CPT_NUMBER)
                                goto again;
-                       }
                }
         }