From 26f63e401fa622890535cfbea88dd95618278981 Mon Sep 17 00:00:00 2001 From: ftillier Date: Tue, 19 Jul 2005 00:21:49 +0000 Subject: [PATCH] Fixed bug where IOU objects where quasi-leaked (but still freed on unload of the drivers) if they didn't have any IOCs. git-svn-id: svn://openib.tc.cornell.edu/gen1@41 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- trunk/core/al/kernel/al_ioc_pnp.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/trunk/core/al/kernel/al_ioc_pnp.c b/trunk/core/al/kernel/al_ioc_pnp.c index a017b659..59b0d57f 100644 --- a/trunk/core/al/kernel/al_ioc_pnp.c +++ b/trunk/core/al/kernel/al_ioc_pnp.c @@ -2337,15 +2337,16 @@ __query_ioc_profiles( AL_ENTER( AL_DBG_PNP ); - for( p_item = cl_fmap_head( &p_results->iou_map ); - p_item != cl_fmap_end( &p_results->iou_map ); - p_item = cl_fmap_next( p_item ) ) + p_item = cl_fmap_head( &p_results->iou_map ); + while( p_item != cl_fmap_end( &p_results->iou_map ) ) { p_iou = PARENT_STRUCT( p_item, iou_node_t, map_item ); CL_ASSERT( p_iou->info.max_controllers ); CL_ASSERT( cl_fmap_count( &p_iou->path_map ) ); CL_ASSERT( p_iou->p_config_path ); + p_item = cl_fmap_next( p_item ); + p_mad = NULL; for( slot = 1; slot <= p_iou->info.max_controllers; slot++ ) { if( ioc_at_slot( &p_iou->info, slot ) == IOC_INSTALLED ) @@ -2365,6 +2366,12 @@ __query_ioc_profiles( cl_atomic_inc( &p_results->p_svc->query_cnt ); } } + if( !p_mad ) + { + /* No IOCs installed in this IOU, or failed to get MAD. */ + cl_fmap_remove_item( &p_results->iou_map, &p_iou->map_item ); + __put_iou( gp_ioc_pnp, p_iou ); + } } /* Trap the case where there are no queries to send. */ -- 2.41.0