From: ftillier Date: Fri, 31 Mar 2006 22:05:19 +0000 (+0000) Subject: [IBAL] Fix race between user-mode PnP deregistration and PnP callbacks. X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=1913e138e1da3ce56b38c5b628f6c668a1ba2993;p=~shefty%2Frdma-win.git [IBAL] Fix race between user-mode PnP deregistration and PnP callbacks. git-svn-id: svn://openib.tc.cornell.edu/gen1@267 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- diff --git a/trunk/core/al/al_pnp.h b/trunk/core/al/al_pnp.h index d77b85a7..5b788ab3 100644 --- a/trunk/core/al/al_pnp.h +++ b/trunk/core/al/al_pnp.h @@ -56,6 +56,7 @@ typedef struct _al_pnp ib_pnp_class_t pnp_class; cl_qmap_t context_map; IRP *p_rearm_irp; + IRP *p_dereg_irp; #else /* defined( CL_KERNEL ) */ ual_rearm_pnp_ioctl_out_t rearm; OVERLAPPED ov; diff --git a/trunk/core/al/kernel/al_pnp.c b/trunk/core/al/kernel/al_pnp.c index 50854c57..b24745d2 100644 --- a/trunk/core/al/kernel/al_pnp.c +++ b/trunk/core/al/kernel/al_pnp.c @@ -312,6 +312,14 @@ __pnp_reg_cleanup( IoCompleteRequest( p_irp, IO_NO_INCREMENT ); } + if( p_reg->p_dereg_irp ) + { + p_reg->p_dereg_irp->IoStatus.Status = STATUS_SUCCESS; + p_reg->p_dereg_irp->IoStatus.Information = 0; + IoCompleteRequest( p_reg->p_dereg_irp, IO_NO_INCREMENT ); + p_reg->p_dereg_irp = NULL; + } + /* Dereference the PnP manager. */ deref_al_obj( &gp_pnp->obj ); diff --git a/trunk/core/al/kernel/al_proxy.c b/trunk/core/al/kernel/al_proxy.c index 9e7b4641..7a9c9c8e 100644 --- a/trunk/core/al/kernel/al_proxy.c +++ b/trunk/core/al/kernel/al_proxy.c @@ -1176,24 +1176,6 @@ proxy_rearm_pnp( } -static void -__proxy_dereg_pnp_cb( - IN void *context ) -{ - IRP *p_irp; - - AL_ENTER( AL_DBG_DEV | AL_DBG_PNP ); - - p_irp = context; - - p_irp->IoStatus.Status = STATUS_SUCCESS; - p_irp->IoStatus.Information = 0; - IoCompleteRequest( p_irp, IO_NO_INCREMENT ); - - AL_EXIT( AL_DBG_DEV | AL_DBG_PNP ); -} - - /* * Process the ioctl UAL_DEREG_PNP: */ @@ -1236,11 +1218,11 @@ proxy_dereg_pnp( return CL_INVALID_PARAMETER; } - h_pnp->obj.context = h_ioctl; + h_pnp->p_dereg_irp = h_ioctl; IoMarkIrpPending( h_ioctl ); - h_pnp->obj.pfn_destroy( &h_pnp->obj, __proxy_dereg_pnp_cb ); + h_pnp->obj.pfn_destroy( &h_pnp->obj, NULL ); AL_EXIT( AL_DBG_DEV | AL_DBG_PNP ); return CL_PENDING;