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
