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

View File

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