https://git.reactos.org/?p=reactos.git;a=commitdiff;h=b4363068d10d05e395818…
commit b4363068d10d05e39581874a5aa10fe0183b4948
Author: Pierre Schweitzer <pierre(a)reactos.org>
AuthorDate: Tue May 22 21:29:10 2018 +0200
Commit: Pierre Schweitzer <pierre(a)reactos.org>
CommitDate: Tue May 22 21:30:08 2018 +0200
[FASTFAT] Properly handle IRPs that can wait and these that cannot.
CORE-14634
---
drivers/filesystems/fastfat/cleanup.c | 26 +++-----------------------
drivers/filesystems/fastfat/create.c | 5 -----
drivers/filesystems/fastfat/misc.c | 35 ++++++++++++++++++++++++++++-------
3 files changed, 31 insertions(+), 35 deletions(-)
diff --git a/drivers/filesystems/fastfat/cleanup.c
b/drivers/filesystems/fastfat/cleanup.c
index f611a69def..d19fa94703 100644
--- a/drivers/filesystems/fastfat/cleanup.c
+++ b/drivers/filesystems/fastfat/cleanup.c
@@ -50,17 +50,8 @@ VfatCleanupFile(
}
else
{
- if(!ExAcquireResourceExclusiveLite(&pFcb->MainResource,
- BooleanFlagOn(IrpContext->Flags,
IRPCONTEXT_CANWAIT)))
- {
- return STATUS_PENDING;
- }
- if(!ExAcquireResourceExclusiveLite(&pFcb->PagingIoResource,
- BooleanFlagOn(IrpContext->Flags,
IRPCONTEXT_CANWAIT)))
- {
- ExReleaseResourceLite(&pFcb->MainResource);
- return STATUS_PENDING;
- }
+ ExAcquireResourceExclusiveLite(&pFcb->MainResource, TRUE);
+ ExAcquireResourceExclusiveLite(&pFcb->PagingIoResource, TRUE);
pCcb = FileObject->FsContext2;
if (BooleanFlagOn(pCcb->Flags, CCB_DELETE_ON_CLOSE))
@@ -173,21 +164,10 @@ VfatCleanup(
return STATUS_SUCCESS;
}
- if (!ExAcquireResourceExclusiveLite(&IrpContext->DeviceExt->DirResource,
- BooleanFlagOn(IrpContext->Flags,
IRPCONTEXT_CANWAIT)))
- {
- return VfatMarkIrpContextForQueue(IrpContext);
- }
-
+ ExAcquireResourceExclusiveLite(&IrpContext->DeviceExt->DirResource, TRUE);
Status = VfatCleanupFile(IrpContext);
-
ExReleaseResourceLite(&IrpContext->DeviceExt->DirResource);
- if (Status == STATUS_PENDING)
- {
- return VfatMarkIrpContextForQueue(IrpContext);
- }
-
IrpContext->Irp->IoStatus.Information = 0;
return Status;
}
diff --git a/drivers/filesystems/fastfat/create.c b/drivers/filesystems/fastfat/create.c
index 84751c2595..e2fbccaf9c 100644
--- a/drivers/filesystems/fastfat/create.c
+++ b/drivers/filesystems/fastfat/create.c
@@ -1059,11 +1059,6 @@ VfatCreate(
return STATUS_SUCCESS;
}
- if (!BooleanFlagOn(IrpContext->Flags, IRPCONTEXT_CANWAIT))
- {
- return VfatMarkIrpContextForQueue(IrpContext);
- }
-
IrpContext->Irp->IoStatus.Information = 0;
ExAcquireResourceExclusiveLite(&IrpContext->DeviceExt->DirResource, TRUE);
Status = VfatCreateFile(IrpContext->DeviceObject, IrpContext->Irp);
diff --git a/drivers/filesystems/fastfat/misc.c b/drivers/filesystems/fastfat/misc.c
index 0d291776b5..ad5f4bcec3 100644
--- a/drivers/filesystems/fastfat/misc.c
+++ b/drivers/filesystems/fastfat/misc.c
@@ -287,18 +287,39 @@ VfatAllocateIrpContext(
IrpContext->MinorFunction = IrpContext->Stack->MinorFunction;
IrpContext->FileObject = IrpContext->Stack->FileObject;
IrpContext->Flags = IRPCONTEXT_COMPLETE;
- if (MajorFunction == IRP_MJ_FILE_SYSTEM_CONTROL ||
- MajorFunction == IRP_MJ_DEVICE_CONTROL ||
- MajorFunction == IRP_MJ_SHUTDOWN)
+
+ /* Easy cases that can wait */
+ if (MajorFunction == IRP_MJ_CLEANUP ||
+ MajorFunction == IRP_MJ_CREATE ||
+ MajorFunction == IRP_MJ_SHUTDOWN ||
+ MajorFunction == IRP_MJ_CLOSE /* likely to be fixed */)
{
- IrpContext->Flags |= IRPCONTEXT_CANWAIT;
+ SetFlag(IrpContext->Flags, IRPCONTEXT_CANWAIT);
}
- else if (MajorFunction != IRP_MJ_CLEANUP &&
- MajorFunction != IRP_MJ_CLOSE &&
+ /* Cases that can wait if synchronous IRP */
+ else if ((MajorFunction == IRP_MJ_DEVICE_CONTROL ||
+ MajorFunction == IRP_MJ_QUERY_INFORMATION ||
+ MajorFunction == IRP_MJ_SET_INFORMATION ||
+ MajorFunction == IRP_MJ_FLUSH_BUFFERS ||
+ MajorFunction == IRP_MJ_LOCK_CONTROL ||
+ MajorFunction == IRP_MJ_QUERY_VOLUME_INFORMATION ||
+ MajorFunction == IRP_MJ_SET_VOLUME_INFORMATION ||
+ MajorFunction == IRP_MJ_DIRECTORY_CONTROL ||
+ MajorFunction == IRP_MJ_WRITE ||
+ MajorFunction == IRP_MJ_READ) &&
IoIsOperationSynchronous(Irp))
{
- IrpContext->Flags |= IRPCONTEXT_CANWAIT;
+ SetFlag(IrpContext->Flags, IRPCONTEXT_CANWAIT);
+ }
+ /* Cases that can wait if synchronous or if no FO */
+ else if ((MajorFunction == IRP_MJ_FILE_SYSTEM_CONTROL ||
+ MajorFunction == IRP_MJ_PNP) &&
+ (IoGetCurrentIrpStackLocation(Irp)->FileObject == NULL ||
+ IoIsOperationSynchronous(Irp)))
+ {
+ SetFlag(IrpContext->Flags, IRPCONTEXT_CANWAIT);
}
+
KeInitializeEvent(&IrpContext->Event, NotificationEvent, FALSE);
IrpContext->RefCount = 0;
IrpContext->PriorityBoost = IO_NO_INCREMENT;