From 8e9ec3d6487cc8ee4380e307ff9bc046c82259b1 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 11 Sep 2008 18:17:11 +0000 Subject: [PATCH] - Nicer solution for the problem fixed in r36102 svn path=/branches/aicom-network-fixes/; revision=36141 --- drivers/network/afd/afd/select.c | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/drivers/network/afd/afd/select.c b/drivers/network/afd/afd/select.c index bfa040bce1c..d02e19c4178 100644 --- a/drivers/network/afd/afd/select.c +++ b/drivers/network/afd/afd/select.c @@ -57,7 +57,9 @@ static VOID SignalSocket( PAFD_ACTIVE_POLL Poll OPTIONAL, PIRP _Irp OPTIONAL, PAFD_POLL_INFO PollReq, - NTSTATUS Status + NTSTATUS Status, + KSPIN_LOCK Lock, + KIRQL OldIrql ) { UINT i; @@ -86,6 +88,10 @@ static VOID SignalSocket( } UnlockHandles( AFD_HANDLES(PollReq), PollReq->HandleCount ); if( Irp->MdlAddress ) UnlockRequest( Irp, IoGetCurrentIrpStackLocation( Irp ) ); + AFD_DbgPrint(MID_TRACE,("Completing\n")); + KeReleaseSpinLock(&Lock, OldIrql); + IoCompleteRequest( Irp, IO_NETWORK_INCREMENT ); + KeAcquireSpinLock(&Lock, &OldIrql); AFD_DbgPrint(MID_TRACE,("Done\n")); } @@ -108,11 +114,9 @@ static VOID SelectTimeout( PKDPC Dpc, ZeroEvents( PollReq->Handles, PollReq->HandleCount ); KeAcquireSpinLock( &DeviceExt->Lock, &OldIrql ); - SignalSocket( Poll, NULL, PollReq, STATUS_TIMEOUT ); + SignalSocket( Poll, NULL, PollReq, STATUS_TIMEOUT, DeviceExt->Lock, OldIrql ); KeReleaseSpinLock( &DeviceExt->Lock, OldIrql ); - IoCompleteRequest( Irp, IO_NETWORK_INCREMENT ); - AFD_DbgPrint(MID_TRACE,("Timeout\n")); } @@ -145,10 +149,7 @@ VOID KillSelectsForFCB( PAFD_DEVICE_EXTENSION DeviceExt, if( (PVOID)HandleArray[i].Handle == FileObject && (!OnlyExclusive || (OnlyExclusive && Poll->Exclusive)) ) { ZeroEvents( PollReq->Handles, PollReq->HandleCount ); - SignalSocket( Poll, NULL, PollReq, STATUS_SUCCESS ); - KeReleaseSpinLock( &DeviceExt->Lock, OldIrql ); - IoCompleteRequest( Irp, IO_NETWORK_INCREMENT ); - KeAcquireSpinLock( &DeviceExt->Lock, &OldIrql ); + SignalSocket( Poll, NULL, PollReq, STATUS_SUCCESS, DeviceExt->Lock, OldIrql ); } } } @@ -232,10 +233,7 @@ AfdSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp, if( Signalled ) { Status = STATUS_SUCCESS; Irp->IoStatus.Status = Status; - SignalSocket( NULL, Irp, PollReq, Status ); - KeReleaseSpinLock( &DeviceExt->Lock, OldIrql ); - IoCompleteRequest( Irp, IO_NETWORK_INCREMENT ); - return Status; + SignalSocket( NULL, Irp, PollReq, Status, DeviceExt->Lock, OldIrql ); } else { PAFD_ACTIVE_POLL Poll = NULL; @@ -426,10 +424,7 @@ VOID PollReeval( PAFD_DEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject ) { if( UpdatePollWithFCB( Poll, FileObject ) ) { ThePollEnt = ThePollEnt->Flink; AFD_DbgPrint(MID_TRACE,("Signalling socket\n")); - SignalSocket( Poll, NULL, PollReq, STATUS_SUCCESS ); - KeReleaseSpinLock( &DeviceExt->Lock, OldIrql ); - IoCompleteRequest( Irp, IO_NETWORK_INCREMENT ); - KeAcquireSpinLock( &DeviceExt->Lock, &OldIrql ); + SignalSocket( Poll, NULL, PollReq, STATUS_SUCCESS, DeviceExt->Lock, OldIrql ); } else ThePollEnt = ThePollEnt->Flink; }