Author: cgutman
Date: Sun Nov  6 23:40:06 2011
New Revision: 54325

URL: http://svn.reactos.org/svn/reactos?rev=54325&view=rev
Log:
[NPFS]
- Make the initial NpfsRead wait uninterruptible since it's really being used 
like a mutex (avoid the kernel stack being paged out during the wait causing 
memory corruption)
- Handle interrupted waits that were missed in certain cases
- Fix a potential deadlock that would happen if more I/O was done on a file 
object after the previous operation was interrupted by an APC or alert

Modified:
    trunk/reactos/drivers/filesystems/npfs/fsctrl.c
    trunk/reactos/drivers/filesystems/npfs/rw.c

Modified: trunk/reactos/drivers/filesystems/npfs/fsctrl.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/npfs/fsctrl.c?rev=54325&r1=54324&r2=54325&view=diff
==============================================================================
--- trunk/reactos/drivers/filesystems/npfs/fsctrl.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/npfs/fsctrl.c [iso-8859-1] Sun Nov  6 
23:40:06 2011
@@ -183,11 +183,13 @@
 
     if (Flags & FO_SYNCHRONOUS_IO)
     {
-        KeWaitForSingleObject(&Ccb->ConnectEvent,
+        Status = KeWaitForSingleObject(&Ccb->ConnectEvent,
             UserRequest,
             Irp->RequestorMode,
             (Flags & FO_ALERTABLE_IO),
             NULL);
+        if ((Status == STATUS_USER_APC) || (Status == STATUS_KERNEL_APC) || 
(Status == STATUS_ALERTED))
+            Status = STATUS_CANCELLED;
     }
 
     DPRINT("NpfsConnectPipe() done (Status %lx)\n", Status);
@@ -403,11 +405,13 @@
         TimeOut = NULL;
     }
 
-     Status = KeWaitForSingleObject(&Ccb->ConnectEvent,
-                                    UserRequest,
-                                    Irp->RequestorMode,
-                                    (Ccb->FileObject->Flags & FO_ALERTABLE_IO),
-                                    TimeOut);
+    Status = KeWaitForSingleObject(&Ccb->ConnectEvent,
+                                   UserRequest,
+                                   Irp->RequestorMode,
+                                   (Ccb->FileObject->Flags & FO_ALERTABLE_IO),
+                                   TimeOut);
+    if ((Status == STATUS_USER_APC) || (Status == STATUS_KERNEL_APC) || 
(Status == STATUS_ALERTED))
+        Status = STATUS_CANCELLED;
 
     DPRINT("KeWaitForSingleObject() returned (Status %lx)\n", Status);
 
@@ -526,6 +530,8 @@
         Irp->RequestorMode,
         (Ccb->FileObject->Flags & FO_ALERTABLE_IO),
         &TimeOut);
+    if ((Status == STATUS_USER_APC) || (Status == STATUS_KERNEL_APC) || 
(Status == STATUS_ALERTED))
+        Status = STATUS_CANCELLED;
 
     DPRINT("KeWaitForSingleObject() returned (Status %lx)\n", Status);
 

Modified: trunk/reactos/drivers/filesystems/npfs/rw.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/npfs/rw.c?rev=54325&r1=54324&r2=54325&view=diff
==============================================================================
--- trunk/reactos/drivers/filesystems/npfs/rw.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/npfs/rw.c [iso-8859-1] Sun Nov  6 
23:40:06 2011
@@ -373,20 +373,11 @@
             KeInitializeEvent(&Event, SynchronizationEvent, FALSE);
             Context->WaitEvent = &Event;
             ExReleaseFastMutex(&Ccb->DataListLock);
-            Status = KeWaitForSingleObject(&Event,
-                UserRequest,
-                Irp->RequestorMode,
-                (FileObject->Flags & FO_ALERTABLE_IO),
+            KeWaitForSingleObject(&Event,
+                Executive,
+                KernelMode,
+                FALSE,
                 NULL);
-            if ((Status == STATUS_USER_APC) || (Status == STATUS_KERNEL_APC) 
|| (Status == STATUS_ALERTED))
-            {
-                Status = STATUS_CANCELLED;
-                goto done;
-            }
-            if (!NT_SUCCESS(Status))
-            {
-                ASSERT(FALSE);
-            }
             ExAcquireFastMutex(&Ccb->DataListLock);
         }
         Irp->IoStatus.Information = 0;
@@ -661,9 +652,6 @@
         Irp->IoStatus.Status = Status;
 
         ASSERT(IoGetCurrentIrpStackLocation(Irp)->FileObject != NULL);
-
-        if (Status == STATUS_CANCELLED)
-            goto done;
 
         if (IoIsOperationSynchronous(Irp))
         {


Reply via email to