From a7adff68fc142ba585e9337d5b7cfcd00b78e7ed Mon Sep 17 00:00:00 2001 From: leonidk Date: Tue, 1 Jul 2008 18:19:33 +0000 Subject: [PATCH] [IBAL] This patch cancels all outstanding UAL_CEP_GET_REQ_CID IRPs queued in a CEP when the CEP is destroyed. Signed-off-by: Fab Tillier git-svn-id: svn://openib.tc.cornell.edu/gen1@1316 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- trunk/core/al/kernel/al_cm_cep.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/trunk/core/al/kernel/al_cm_cep.c b/trunk/core/al/kernel/al_cm_cep.c index e603abf1..29041d4b 100644 --- a/trunk/core/al/kernel/al_cm_cep.c +++ b/trunk/core/al/kernel/al_cm_cep.c @@ -4155,6 +4155,25 @@ al_destroy_cep( /* Cancel any queued IRP */ __cep_complete_irp( p_cep, STATUS_CANCELLED, IO_NO_INCREMENT ); + while( !IsListEmpty( &p_cep->irp_que ) ) + { + LIST_ENTRY* p_list_entry; + IRP* p_irp; + + // get IRP + p_list_entry = RemoveHeadList( &p_cep->irp_que ); + p_irp = (PIRP)CONTAINING_RECORD( p_list_entry, IRP, Tail.Overlay.ListEntry ); + + // complete GetConnectionReq IRP +#pragma warning(push, 3) + IoSetCancelRoutine( p_irp, NULL ); +#pragma warning(pop) + + p_irp->IoStatus.Information = 0; + p_irp->IoStatus.Status = STATUS_CANCELLED; + IoCompleteRequest( p_irp, IO_NETWORK_INCREMENT ); + } + __unbind_cep( p_cep ); ref_cnt = __cleanup_cep( p_cep ); KeReleaseInStackQueuedSpinLock( &hdl ); -- 2.41.0