From 746f4783089f0ef1bf082fb5d43b26dac96b23e2 Mon Sep 17 00:00:00 2001 From: leonidk Date: Sun, 1 Jun 2008 14:19:59 +0000 Subject: [PATCH] [SRP] fixes the BSOD when SRPT disconnects. Suggested by: Eleanor Witiak [eleanor.witiak@qlogic.com] git-svn-id: svn://openib.tc.cornell.edu/gen1/trunk@1223 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- ulp/srp/kernel/srp_connection.c | 24 +++++++++++++----------- ulp/srp/kernel/srp_session.c | 8 ++++++++ 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/ulp/srp/kernel/srp_connection.c b/ulp/srp/kernel/srp_connection.c index 303738ad..1cccb7c3 100644 --- a/ulp/srp/kernel/srp_connection.c +++ b/ulp/srp/kernel/srp_connection.c @@ -288,23 +288,25 @@ __srp_cm_dreq_cb( { srp_session_t *p_srp_session = (srp_session_t* VOID_PTR64)p_cm_dreq_rec->qp_context; srp_hba_t *p_hba = p_srp_session->p_hba; - ib_cm_drep_t cm_drep; - ib_api_status_t status; SRP_ENTER( SRP_DBG_PNP ); cl_obj_lock( &p_srp_session->obj ); - p_srp_session->connection.state = SRP_CONNECT_FAILURE; - cl_obj_unlock( &p_srp_session->obj ); - - cm_drep.p_drep_pdata = NULL; - cm_drep.drep_length = 0; - status = p_hba->ifc.cm_drep( p_cm_dreq_rec->h_cm_dreq, &cm_drep ); - if ( status != IB_SUCCESS ) + if (p_srp_session->connection.state == SRP_CONNECTED) { - SRP_PRINT( TRACE_LEVEL_ERROR, SRP_DBG_ERROR, - ("Cannot respond to target disconnect request. Status = %d\n", status) ); + SRP_PRINT( TRACE_LEVEL_VERBOSE, SRP_DBG_PNP, + ("**** SRP_CONNECTED => SRP_CONNECT_FAILURE. \n") ); + p_srp_session->connection.state = SRP_CONNECT_FAILURE; + cl_obj_unlock( &p_srp_session->obj ); + } + else // since the connection is no longer there, just exit + { + cl_obj_unlock( &p_srp_session->obj ); + SRP_PRINT( TRACE_LEVEL_VERBOSE, SRP_DBG_PNP, + ("**** NOT SRP_CONNECTED *****. connection state = %d\n", p_srp_session->connection.state) ); + SRP_EXIT( SRP_DBG_PNP ); + return; } SRP_PRINT( TRACE_LEVEL_WARNING, SRP_DBG_PNP, diff --git a/ulp/srp/kernel/srp_session.c b/ulp/srp/kernel/srp_session.c index 0f547d51..c9dfdd20 100644 --- a/ulp/srp/kernel/srp_session.c +++ b/ulp/srp/kernel/srp_session.c @@ -58,7 +58,15 @@ __srp_destroying_session( p_srp_session = PARENT_STRUCT( p_obj, srp_session_t, obj ); + cl_obj_lock( &p_srp_session->obj ); + if( p_srp_session->connection.state != SRP_CONNECT_FAILURE ) + { + cl_obj_unlock( &p_srp_session->obj ); + return; + } + p_srp_session->connection.state = SRP_CONNECTION_CLOSING; + cl_obj_unlock( &p_srp_session->obj ); SRP_PRINT( TRACE_LEVEL_VERBOSE, SRP_DBG_DEBUG, ("Session Object ref_cnt = %d\n", p_srp_session->obj.ref_cnt) ); -- 2.17.1