sys: FspAcquireForCcFlush, FspReleaseForCcFlush

This commit is contained in:
Bill Zissimopoulos 2016-04-08 23:33:30 -07:00
parent f407f65a90
commit 25911a808c
2 changed files with 15 additions and 10 deletions

View File

@ -133,11 +133,11 @@ NTSTATUS FspAcquireForCcFlush(
PIRP TopLevelIrp = IoGetTopLevelIrp();
ULONG TopFlags;
ASSERT(0 == TopLevelIrp ||
(PIRP)FSRTL_MAX_TOP_LEVEL_IRP_FLAG < TopLevelIrp);
if (0 == TopLevelIrp)
if ((PIRP)FSRTL_MAX_TOP_LEVEL_IRP_FLAG >= TopLevelIrp)
{
FspFileNodeAcquireExclusive(FileNode, Full);
ASSERT(0 == FileNode->Tls.CcFlush.TopLevelIrp);
FileNode->Tls.CcFlush.TopLevelIrp = TopLevelIrp;
IoSetTopLevelIrp((PIRP)FSRTL_CACHE_TOP_LEVEL_IRP);
}
else
@ -145,8 +145,8 @@ NTSTATUS FspAcquireForCcFlush(
TopFlags = FspIrpTopFlags(TopLevelIrp);
FspIrpSetTopFlags(TopLevelIrp, FspIrpFlags(TopLevelIrp));
FspFileNodeAcquireExclusive(FileNode, Full);
ASSERT(0 == FileNode->Tls.TopFlags);
FileNode->Tls.TopFlags = TopFlags;
ASSERT(0 == FileNode->Tls.CcFlush.TopFlags);
FileNode->Tls.CcFlush.TopFlags = TopFlags;
}
FSP_LEAVE("FileObject=%p", FileObject);
@ -166,13 +166,14 @@ NTSTATUS FspReleaseForCcFlush(
(PIRP)FSRTL_MAX_TOP_LEVEL_IRP_FLAG < TopLevelIrp);
if ((PIRP)FSRTL_CACHE_TOP_LEVEL_IRP == TopLevelIrp)
{
IoSetTopLevelIrp(0);
IoSetTopLevelIrp(FileNode->Tls.CcFlush.TopLevelIrp);
FileNode->Tls.CcFlush.TopLevelIrp = 0;
FspFileNodeRelease(FileNode, Full);
}
else
{
TopFlags = FileNode->Tls.TopFlags;
FileNode->Tls.TopFlags = 0;
TopFlags = FileNode->Tls.CcFlush.TopFlags;
FileNode->Tls.CcFlush.TopFlags = 0;
FspFileNodeRelease(FileNode, Full);
FspIrpSetTopFlags(TopLevelIrp, TopFlags);
}

View File

@ -874,10 +874,14 @@ typedef struct
ULONG DirInfoChangeNumber;
BOOLEAN TruncateOnClose;
FILE_LOCK FileLock;
union
struct
{
PVOID LazyWriteThread;
union
{
PIRP TopLevelIrp;
UINT32 TopFlags;
} CcFlush;
} Tls;
/* read-only after creation (and insertion in the ContextTable) */
PDEVICE_OBJECT FsvolDeviceObject;