Change routine to return success/failure status rather than
depend on debug assert
Also, fix callers of this routine to handle this return status

Signed-off-by: Hal Rosenstock <[email protected]>
---
diff --git a/opensm/include/opensm/osm_path.h b/opensm/include/opensm/osm_path.h
index 8d65d2c..7ef0fc5 100644
--- a/opensm/include/opensm/osm_path.h
+++ b/opensm/include/opensm/osm_path.h
@@ -2,6 +2,7 @@
  * Copyright (c) 2004-2006 Voltaire, Inc. All rights reserved.
  * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
  * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
+ * Copyright (c) 2009 HNR Consulting. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -188,15 +189,18 @@ osm_dr_path_init(IN osm_dr_path_t * const p_path,
 *
 * SYNOPSIS
 */
-static inline void
+static inline boolean_t
 osm_dr_path_extend(IN osm_dr_path_t * const p_path, IN const uint8_t port_num)
 {
        p_path->hop_count++;
-       CL_ASSERT(p_path->hop_count < IB_SUBNET_PATH_HOPS_MAX);
+
+       if (p_path->hop_count >= IB_SUBNET_PATH_HOPS_MAX)
+               return FALSE;
        /*
           Location 0 in the path array is reserved per IB spec.
         */
        p_path->path[p_path->hop_count] = port_num;
+       return TRUE;
 }
 
 /*
@@ -208,7 +212,7 @@ osm_dr_path_extend(IN osm_dr_path_t * const p_path, IN 
const uint8_t port_num)
 *              [in] Additional port to add to the DR path.
 *
 * RETURN VALUE
-*      None.
+*      Boolean indicating whether or not path was extended.
 *
 * NOTES
 *
diff --git a/opensm/opensm/osm_node_info_rcv.c 
b/opensm/opensm/osm_node_info_rcv.c
index bfa5b1f..f5ef1ac 100644
--- a/opensm/opensm/osm_node_info_rcv.c
+++ b/opensm/opensm/osm_node_info_rcv.c
@@ -2,6 +2,7 @@
  * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved.
  * Copyright (c) 2002-2008 Mellanox Technologies LTD. All rights reserved.
  * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
+ * Copyright (c) 2009 HNR Consulting. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -85,7 +86,10 @@ static void report_duplicated_guid(IN osm_sm_t * sm, 
osm_physp_t * p_physp,
                         OSM_LOG_ERROR);
 
        path = *osm_physp_get_dr_path_ptr(p_new);
-       osm_dr_path_extend(&path, port_num);
+       if (!osm_dr_path_extend(&path, port_num))
+               OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0D05: "
+                       "DR path with hop count %d couldn't be extended\n",
+                       path.hop_count);
        osm_dump_dr_path(sm->p_log, &path, OSM_LOG_ERROR);
 
        osm_log(sm->p_log, OSM_LOG_SYS,
@@ -100,7 +104,12 @@ static void requery_dup_node_info(IN osm_sm_t * sm, 
osm_physp_t * p_physp,
        cl_status_t status;
 
        path = *osm_physp_get_dr_path_ptr(p_physp->p_remote_physp);
-       osm_dr_path_extend(&path, p_physp->p_remote_physp->port_num);
+       if (!osm_dr_path_extend(&path, p_physp->p_remote_physp->port_num)) {
+               OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 0D08: "
+                       "DR path with hop count %d couldn't be extended\n",
+                       path.hop_count);
+               return;
+       }
 
        context.ni_context.node_guid =
            p_physp->p_remote_physp->p_node->node_info.port_guid;
diff --git a/opensm/opensm/osm_port_info_rcv.c 
b/opensm/opensm/osm_port_info_rcv.c
index 7b6fb1a..a451de7 100644
--- a/opensm/opensm/osm_port_info_rcv.c
+++ b/opensm/opensm/osm_port_info_rcv.c
@@ -2,6 +2,7 @@
  * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved.
  * Copyright (c) 2002-2008 Mellanox Technologies LTD. All rights reserved.
  * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
+ * Copyright (c) 2009 HNR Consulting. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -246,9 +247,15 @@ static void pi_rcv_process_switch_port(IN osm_sm_t * sm, 
IN osm_node_t * p_node,
                            osm_physp_get_port_num(p_physp)) {
                                path = *osm_physp_get_dr_path_ptr(p_physp);
 
-                               osm_dr_path_extend(&path,
-                                                  osm_physp_get_port_num
-                                                  (p_physp));
+                               if (!osm_dr_path_extend(&path,
+                                                       osm_physp_get_port_num
+                                                       (p_physp))) {
+                                       OSM_LOG(sm->p_log, OSM_LOG_ERROR,
+                                               "ERR 0F08: "
+                                               "DR path with hop count %d 
couldn't be extended\n",
+                                               path.hop_count);
+                                       break;
+                               }
 
                                memset(&context, 0, sizeof(context));
                                context.ni_context.node_guid =
diff --git a/opensm/opensm/osm_state_mgr.c b/opensm/opensm/osm_state_mgr.c
index adc39a0..44b0f6c 100644
--- a/opensm/opensm/osm_state_mgr.c
+++ b/opensm/opensm/osm_state_mgr.c
@@ -2,6 +2,7 @@
  * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved.
  * Copyright (c) 2002-2008 Mellanox Technologies LTD. All rights reserved.
  * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
+ * Copyright (c) 2009 HNR Consulting. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -166,7 +167,13 @@ static void state_mgr_get_remote_port_info(IN osm_sm_t * 
sm,
        /* generate a dr path leaving on the physp to the remote node */
        p_dr_path = osm_physp_get_dr_path_ptr(p_physp);
        memcpy(&rem_node_dr_path, p_dr_path, sizeof(osm_dr_path_t));
-       osm_dr_path_extend(&rem_node_dr_path, osm_physp_get_port_num(p_physp));
+       if (!osm_dr_path_extend(&rem_node_dr_path, 
osm_physp_get_port_num(p_physp))) {
+               OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 332D: "
+                       "DR path with hop count %d couldn't be extended "
+                       "so skipping PortInfo query\n",
+                       p_dr_path->hop_count);
+               goto Exit;
+       }
 
        memset(&mad_context, 0, sizeof(mad_context));
 
@@ -187,6 +194,7 @@ static void state_mgr_get_remote_port_info(IN osm_sm_t * sm,
                OSM_LOG(sm->p_log, OSM_LOG_ERROR, "ERR 332E: "
                        "Request for PortInfo failed\n");
 
+Exit:
        OSM_LOG_EXIT(sm->p_log);
 }
 
_______________________________________________
general mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to