- Nicer solution for the problem fixed in r36102
authorCameron Gutman <aicommander@gmail.com>
Thu, 11 Sep 2008 18:17:11 +0000 (18:17 +0000)
committerCameron Gutman <aicommander@gmail.com>
Thu, 11 Sep 2008 18:17:11 +0000 (18:17 +0000)
svn path=/branches/aicom-network-fixes/; revision=36141

drivers/network/afd/afd/select.c

index bfa040b..d02e19c 100644 (file)
@@ -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;
     }