From 25911a808c08f81ed9019f5b6d73957be377ebab Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Fri, 8 Apr 2016 23:33:30 -0700 Subject: [PATCH] sys: FspAcquireForCcFlush, FspReleaseForCcFlush --- src/sys/callbacks.c | 17 +++++++++-------- src/sys/driver.h | 8 ++++++-- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/sys/callbacks.c b/src/sys/callbacks.c index 37068ed1..273db084 100644 --- a/src/sys/callbacks.c +++ b/src/sys/callbacks.c @@ -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); } diff --git a/src/sys/driver.h b/src/sys/driver.h index 9dd6f430..350c3b29 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -874,10 +874,14 @@ typedef struct ULONG DirInfoChangeNumber; BOOLEAN TruncateOnClose; FILE_LOCK FileLock; - union + struct { PVOID LazyWriteThread; - UINT32 TopFlags; + union + { + PIRP TopLevelIrp; + UINT32 TopFlags; + } CcFlush; } Tls; /* read-only after creation (and insertion in the ContextTable) */ PDEVICE_OBJECT FsvolDeviceObject;