From: leonidk Date: Sun, 1 Jun 2008 14:19:59 +0000 (+0000) Subject: [SRP] fixes the BSOD when SRPT disconnects. X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=b0c3d886f1813bcd3bb28dc042d2729f40b47bfe;p=~shefty%2Frdma-win.git [SRP] fixes the BSOD when SRPT disconnects. Suggested by: Eleanor Witiak [eleanor.witiak@qlogic.com] git-svn-id: svn://openib.tc.cornell.edu/gen1@1223 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- diff --git a/trunk/ulp/srp/kernel/srp_connection.c b/trunk/ulp/srp/kernel/srp_connection.c index 303738ad..1cccb7c3 100644 --- a/trunk/ulp/srp/kernel/srp_connection.c +++ b/trunk/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/trunk/ulp/srp/kernel/srp_session.c b/trunk/ulp/srp/kernel/srp_session.c index 0f547d51..c9dfdd20 100644 --- a/trunk/ulp/srp/kernel/srp_session.c +++ b/trunk/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) );