mirror of
https://github.com/reactos/reactos.git
synced 2024-10-23 14:36:11 +00:00
[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 svn path=/trunk/; revision=54325
This commit is contained in:
parent
1f8bcd7af2
commit
35a7096ebc
|
@ -183,11 +183,13 @@ NpfsConnectPipe(PIRP Irp,
|
|||
|
||||
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);
|
||||
|
@ -408,6 +410,8 @@ NpfsWaitPipe(PIRP Irp,
|
|||
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 @@ NpfsWaitPipe2(PIRP Irp,
|
|||
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);
|
||||
|
||||
|
|
|
@ -373,20 +373,11 @@ NpfsRead(IN PDEVICE_OBJECT DeviceObject,
|
|||
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;
|
||||
|
@ -662,9 +653,6 @@ NpfsRead(IN PDEVICE_OBJECT DeviceObject,
|
|||
|
||||
ASSERT(IoGetCurrentIrpStackLocation(Irp)->FileObject != NULL);
|
||||
|
||||
if (Status == STATUS_CANCELLED)
|
||||
goto done;
|
||||
|
||||
if (IoIsOperationSynchronous(Irp))
|
||||
{
|
||||
RemoveEntryList(&Context->ListEntry);
|
||||
|
|
Loading…
Reference in a new issue