sys: file: FspFileNodeCleanupComplete: FlushAndPurgeOnCleanup

This commit is contained in:
Bill Zissimopoulos 2018-04-18 20:58:19 -07:00
parent 9f56a21c7f
commit 5c3549c6eb
No known key found for this signature in database
GPG Key ID: 3D4F95D52C7B3EA3
2 changed files with 15 additions and 6 deletions

View File

@ -154,7 +154,8 @@ typedef struct
UINT32 PassQueryDirectoryPattern:1; /* pass Pattern during QueryDirectory operations */ UINT32 PassQueryDirectoryPattern:1; /* pass Pattern during QueryDirectory operations */
UINT32 AlwaysUseDoubleBuffering:1; UINT32 AlwaysUseDoubleBuffering:1;
UINT32 PassQueryDirectoryFileName:1; /* pass FileName during QueryDirectory (GetDirInfoByName) */ UINT32 PassQueryDirectoryFileName:1; /* pass FileName during QueryDirectory (GetDirInfoByName) */
UINT32 KmReservedFlags:2; UINT32 FlushAndPurgeOnCleanup:1; /* keeps file off "standby" list */
UINT32 KmReservedFlags:1;
/* user-mode flags */ /* user-mode flags */
UINT32 UmFileContextIsUserContext2:1; /* user mode: FileContext parameter is UserContext2 */ UINT32 UmFileContextIsUserContext2:1; /* user mode: FileContext parameter is UserContext2 */
UINT32 UmFileContextIsFullContext:1; /* user mode: FileContext parameter is FullContext */ UINT32 UmFileContextIsFullContext:1; /* user mode: FileContext parameter is FullContext */

View File

@ -789,9 +789,9 @@ VOID FspFileNodeCleanupComplete(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject
PAGED_CODE(); PAGED_CODE();
PDEVICE_OBJECT FsvolDeviceObject = FileNode->FsvolDeviceObject; PDEVICE_OBJECT FsvolDeviceObject = FileNode->FsvolDeviceObject;
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(FsvolDeviceObject);
LARGE_INTEGER TruncateSize, *PTruncateSize = 0; LARGE_INTEGER TruncateSize, *PTruncateSize = 0;
BOOLEAN DeletePending; BOOLEAN DeletePending, DeletedFromContextTable = FALSE, SingleHandle = FALSE;
BOOLEAN DeletedFromContextTable = FALSE;
FspFsvolDeviceLockContextTable(FsvolDeviceObject); FspFsvolDeviceLockContextTable(FsvolDeviceObject);
@ -816,6 +816,8 @@ VOID FspFileNodeCleanupComplete(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject
ASSERT(0 < FileNode->HandleCount); ASSERT(0 < FileNode->HandleCount);
if (0 == --FileNode->HandleCount) if (0 == --FileNode->HandleCount)
{ {
SingleHandle = TRUE;
DeletePending = 0 != FileNode->DeletePending; DeletePending = 0 != FileNode->DeletePending;
MemoryBarrier(); MemoryBarrier();
@ -832,7 +834,7 @@ VOID FspFileNodeCleanupComplete(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject
* We now have to deal with the scenario where there are cleaned up, * We now have to deal with the scenario where there are cleaned up,
* but unclosed streams for this file still in the context table. * but unclosed streams for this file still in the context table.
*/ */
if (FspFsvolDeviceExtension(FsvolDeviceObject)->VolumeParams.NamedStreams && if (FsvolDeviceExtension->VolumeParams.NamedStreams &&
0 == FileNode->MainFileNode) 0 == FileNode->MainFileNode)
{ {
BOOLEAN StreamDeletedFromContextTable; BOOLEAN StreamDeletedFromContextTable;
@ -869,8 +871,6 @@ VOID FspFileNodeCleanupComplete(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject
if (DeletePending || FileNode->TruncateOnClose) if (DeletePending || FileNode->TruncateOnClose)
{ {
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension =
FspFsvolDeviceExtension(FsvolDeviceObject);
UINT64 AllocationUnit = UINT64 AllocationUnit =
FsvolDeviceExtension->VolumeParams.SectorSize * FsvolDeviceExtension->VolumeParams.SectorSize *
FsvolDeviceExtension->VolumeParams.SectorsPerAllocationUnit; FsvolDeviceExtension->VolumeParams.SectorsPerAllocationUnit;
@ -891,6 +891,14 @@ VOID FspFileNodeCleanupComplete(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject
FspFsvolDeviceUnlockContextTable(FsvolDeviceObject); FspFsvolDeviceUnlockContextTable(FsvolDeviceObject);
if (SingleHandle && FsvolDeviceExtension->VolumeParams.FlushAndPurgeOnCleanup)
{
IO_STATUS_BLOCK IoStatus;
FspCcFlushCache(FileObject->SectionObjectPointer, 0, 0, &IoStatus);
CcPurgeCacheSection(FileObject->SectionObjectPointer, 0, 0, TRUE);
}
CcUninitializeCacheMap(FileObject, PTruncateSize, 0); CcUninitializeCacheMap(FileObject, PTruncateSize, 0);
if (DeletedFromContextTable) if (DeletedFromContextTable)