sys: FspPropagateTopFlags

This commit is contained in:
Bill Zissimopoulos 2016-03-03 10:46:49 -08:00
parent bb897872a1
commit 6f3f57366a
2 changed files with 28 additions and 13 deletions

View File

@ -24,6 +24,7 @@ BOOLEAN FspAcquireForReadAhead(
BOOLEAN Wait);
VOID FspReleaseFromReadAhead(
PVOID Context);
VOID FspPropagateTopFlags(PIRP Irp, PIRP TopLevelFlags);
#ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGE, FspFastIoCheckIfPossible)
@ -37,6 +38,7 @@ VOID FspReleaseFromReadAhead(
#pragma alloc_text(PAGE, FspReleaseFromLazyWrite)
#pragma alloc_text(PAGE, FspAcquireForReadAhead)
#pragma alloc_text(PAGE, FspReleaseFromReadAhead)
#pragma alloc_text(PAGE, FspPropagateTopFlags)
#endif
BOOLEAN FspFastIoCheckIfPossible(
@ -185,3 +187,27 @@ VOID FspReleaseFromReadAhead(
FSP_LEAVE_VOID("Context=%p", Context);
}
VOID FspPropagateTopFlags(PIRP Irp, PIRP TopLevelIrp)
{
/*
* We place FspPropagateTopFlags in this file, because the top flags
* are related to the resources acquired in FspAcquire*.
*/
PAGED_CODE();
if (FSRTL_MAX_TOP_LEVEL_IRP_FLAG >= (UINT_PTR)TopLevelIrp)
FspIrpSetTopFlags(Irp, FspFileNodeAcquireFull);
else if (IO_TYPE_IRP == TopLevelIrp->Type)
{
PFILE_OBJECT FileObject = IoGetCurrentIrpStackLocation(Irp)->FileObject;
PFILE_OBJECT TopLevelFileObject = IoGetCurrentIrpStackLocation(TopLevelIrp)->FileObject;
if (0 != FileObject && 0 != TopLevelFileObject &&
FileObject->FsContext == TopLevelFileObject->FsContext &&
FspFileNodeIsValid(FileObject->FsContext))
{
FspIrpSetTopFlags(Irp, FspIrpFlags(TopLevelIrp));
}
}
}

View File

@ -130,19 +130,7 @@ extern __declspec(selectany) int fsp_bp = 1;
do \
{ \
if (0 != fsp_top_level_irp) \
{ \
if (FSRTL_MAX_TOP_LEVEL_IRP_FLAG >= (UINT_PTR)fsp_top_level_irp)\
FspIrpSetTopFlags(Irp, FspFileNodeAcquireFull);\
else if (IO_TYPE_IRP == fsp_top_level_irp->Type &&\
0 != IrpSp->FileObject && FspFileNodeIsValid(IrpSp->FileObject->FsContext))\
{ \
PIO_STACK_LOCATION fsp_top_level_irpsp =\
IoGetCurrentIrpStackLocation(fsp_top_level_irp);\
if (0 != fsp_top_level_irpsp->FileObject &&\
IrpSp->FileObject->FsContext == fsp_top_level_irpsp->FileObject->FsContext)\
FspIrpSetTopFlags(Irp, FspIrpFlags(fsp_top_level_irp));\
} \
} \
FspPropagateTopFlags(Irp, fsp_top_level_irp);\
IoSetTopLevelIrp(Irp); \
if (!FspDeviceReference(IrpSp->DeviceObject))\
{ \
@ -300,6 +288,7 @@ BOOLEAN FspAcquireForReadAhead(
BOOLEAN Wait);
VOID FspReleaseFromReadAhead(
PVOID Context);
VOID FspPropagateTopFlags(PIRP Irp, PIRP TopLevelIrp);
/* memory allocation */
#define FspAlloc(Size) ExAllocatePoolWithTag(PagedPool, Size, FSP_ALLOC_INTERNAL_TAG)