From 638089e0def9c69e9b0940f6081435a09b68d8ae Mon Sep 17 00:00:00 2001 From: leonidk Date: Wed, 2 Jul 2008 11:12:53 +0000 Subject: [PATCH] [IBAL] Convert ib_api_status_t to NTSTATUS for al_cep_get_pdata to make the IRP handling simpler. Signed-off-by: Fab Tillier git-svn-id: svn://openib.tc.cornell.edu/gen1@1320 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- trunk/core/al/al_cm_cep.h | 2 +- trunk/core/al/kernel/al_cm_cep.c | 36 ++++++++++------------------- trunk/core/al/kernel/al_proxy_cep.c | 35 ++++++++-------------------- 3 files changed, 23 insertions(+), 50 deletions(-) diff --git a/trunk/core/al/al_cm_cep.h b/trunk/core/al/al_cm_cep.h index 4dc4fece..e5001074 100644 --- a/trunk/core/al/al_cm_cep.h +++ b/trunk/core/al/al_cm_cep.h @@ -280,7 +280,7 @@ al_cep_get_cid( IN PIRP h_ioctl ); -ib_api_status_t +NTSTATUS al_cep_get_pdata( IN ib_al_handle_t h_al, IN net32_t cid, diff --git a/trunk/core/al/kernel/al_cm_cep.c b/trunk/core/al/kernel/al_cm_cep.c index 83609506..3d232ef5 100644 --- a/trunk/core/al/kernel/al_cm_cep.c +++ b/trunk/core/al/kernel/al_cm_cep.c @@ -6365,7 +6365,7 @@ exit: } -ib_api_status_t +NTSTATUS al_cep_get_pdata( IN ib_al_handle_t h_al, IN net32_t cid, @@ -6374,7 +6374,7 @@ al_cep_get_pdata( { kcep_t *p_cep; KLOCK_QUEUE_HANDLE hdl; - uint8_t remainder; + uint8_t copy_len; AL_ENTER( AL_DBG_CM ); @@ -6387,34 +6387,22 @@ al_cep_get_pdata( KeReleaseInStackQueuedSpinLock( &hdl ); AL_PRINT_EXIT( TRACE_LEVEL_ERROR, AL_DBG_ERROR, ("CEP not found for cid %d, h_al %p\n", cid, h_al )); - return IB_INVALID_HANDLE; + return STATUS_CONNECTION_INVALID; } - if ( *p_psize < p_cep->psize ) - { - KeReleaseInStackQueuedSpinLock( &hdl ); - AL_PRINT_EXIT( TRACE_LEVEL_ERROR, AL_DBG_ERROR, - ("Insufficient size: *p_psize %d, max %d, cid %d, h_al %p\n", - *p_psize, p_cep->psize, cid, h_al )); - return IB_INVALID_PARAMETER; - } - - memcpy( pdata, p_cep->pdata, p_cep->psize ); - remainder = *p_psize - p_cep->psize; - if (remainder) - cl_memclr( &pdata[p_cep->psize], remainder ); - *p_psize = p_cep->psize; - if ( !*p_psize ) - { - AL_PRINT_EXIT( TRACE_LEVEL_ERROR, AL_DBG_ERROR, - ("p_cep->psize is zero for cid %d, h_al %p\n", cid, h_al )); - } + copy_len = min( *p_psize, p_cep->psize ); + + if( copy_len ) + RtlCopyMemory( pdata, p_cep->pdata, copy_len ); + + // Always report the maximum available user private data. + *p_psize = p_cep->psize; AL_PRINT(TRACE_LEVEL_INFORMATION ,AL_DBG_CM , ("al_cep_get_pdata: get %d of pdata from CEP with cid %d, h_al %p, context %p \n", - p_cep->psize, cid, h_al, p_cep->context )); + copy_len, cid, h_al, p_cep->context )); KeReleaseInStackQueuedSpinLock( &hdl ); AL_EXIT( AL_DBG_CM ); - return IB_SUCCESS; + return STATUS_SUCCESS; } diff --git a/trunk/core/al/kernel/al_proxy_cep.c b/trunk/core/al/kernel/al_proxy_cep.c index a6bd447b..5ff8f775 100644 --- a/trunk/core/al/kernel/al_proxy_cep.c +++ b/trunk/core/al/kernel/al_proxy_cep.c @@ -899,10 +899,8 @@ proxy_cep_get_pdata( { al_dev_open_context_t *p_context; ual_cep_get_pdata_ioctl_t *p_ioctl; - ib_qp_handle_t VOID_PTR64 h_qp = NULL; - net32_t cid; - ib_api_status_t status; - cl_status_t cl_status; + al_conn_qp_t *p_qp; + NTSTATUS status; AL_ENTER( AL_DBG_CM ); @@ -921,47 +919,34 @@ proxy_cep_get_pdata( return CL_INVALID_PARAMETER; } - *p_ret_bytes = sizeof(struct _ual_cep_get_pdata_ioctl_out); - if ( p_ioctl->in.h_qp ) { /* Get the kernel QP handle. */ - h_qp = (ib_qp_handle_t VOID_PTR64)al_hdl_ref( + p_qp = (al_conn_qp_t*)al_hdl_ref( p_context->h_al, p_ioctl->in.h_qp, AL_OBJ_TYPE_H_QP ); - if( !h_qp ) + if( !p_qp ) { AL_PRINT_EXIT( TRACE_LEVEL_ERROR, AL_DBG_ERROR, ("Invalid QP handle\n")); return CL_CONNECTION_INVALID; } - cid = ((al_conn_qp_t*)h_qp)->cid; - } - else - { - cid = p_ioctl->in.cid; + p_ioctl->in.cid = p_qp->cid; + deref_al_obj( &p_qp->qp.obj ); } p_ioctl->out.pdata_len = sizeof(p_ioctl->out.pdata); - status = al_cep_get_pdata( p_context->h_al, cid, + status = al_cep_get_pdata( p_context->h_al, p_ioctl->in.cid, (uint8_t*)&p_ioctl->out.pdata_len, p_ioctl->out.pdata ); - if ( status == IB_SUCCESS ) + if( NT_SUCCESS( status ) ) { - cl_status = CL_SUCCESS; - *p_ret_bytes = p_ioctl->out.pdata_len; + *p_ret_bytes = sizeof(struct _ual_cep_get_pdata_ioctl_out); AL_PRINT(TRACE_LEVEL_INFORMATION ,AL_DBG_CM , ("proxy_cep_get_pdata: get %d of pdata \n", (int)*p_ret_bytes )); } - else - { - cl_status = CL_CONNECTION_INVALID; - } - - if ( h_qp ) - deref_al_obj( &h_qp->obj ); AL_EXIT( AL_DBG_CM ); - return cl_status; + return status; } cl_status_t cep_ioctl( -- 2.46.0