From 4fcaa99d638f3cbc15e5a3fa106657a6f37a8a7e Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Mon, 23 Apr 2018 00:33:00 -0700 Subject: [PATCH] sys: FspFileNodeCleanupComplete: FlushAndPurgeOnCleanup: - handle DeletePending and non-zero PTruncateSize better --- src/sys/file.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/sys/file.c b/src/sys/file.c index 67fe8e72..e8dc5a22 100644 --- a/src/sys/file.c +++ b/src/sys/file.c @@ -791,7 +791,7 @@ VOID FspFileNodeCleanupComplete(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject PDEVICE_OBJECT FsvolDeviceObject = FileNode->FsvolDeviceObject; FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(FsvolDeviceObject); LARGE_INTEGER TruncateSize, *PTruncateSize = 0; - BOOLEAN DeletePending, DeletedFromContextTable = FALSE, SingleHandle = FALSE; + BOOLEAN DeletePending = FALSE, DeletedFromContextTable = FALSE, SingleHandle = FALSE; FspFsvolDeviceLockContextTable(FsvolDeviceObject); @@ -896,9 +896,19 @@ VOID FspFileNodeCleanupComplete(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject { /* NOTE: Do not use FspFileNodeFlushAndPurgeCache. It does not seem to work well! */ - IO_STATUS_BLOCK IoStatus; + if (!DeletePending) + { + IO_STATUS_BLOCK IoStatus; + LARGE_INTEGER ZeroOffset = { 0 }; + + if (0 != PTruncateSize && 0 == PTruncateSize->HighPart) + FspCcFlushCache(FileObject->SectionObjectPointer, &ZeroOffset, PTruncateSize->LowPart, + &IoStatus); + else + FspCcFlushCache(FileObject->SectionObjectPointer, 0, 0, + &IoStatus); + } - FspCcFlushCache(FileObject->SectionObjectPointer, 0, 0, &IoStatus); CcPurgeCacheSection(FileObject->SectionObjectPointer, 0, 0, TRUE); }