sys: FspFileNodeCleanupComplete: FlushAndPurgeOnCleanup:

- handle DeletePending and non-zero PTruncateSize better
This commit is contained in:
Bill Zissimopoulos 2018-04-23 00:33:00 -07:00
parent d6c3849120
commit 4fcaa99d63
No known key found for this signature in database
GPG Key ID: 3D4F95D52C7B3EA3

View File

@ -791,7 +791,7 @@ VOID FspFileNodeCleanupComplete(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject
PDEVICE_OBJECT FsvolDeviceObject = FileNode->FsvolDeviceObject; PDEVICE_OBJECT FsvolDeviceObject = FileNode->FsvolDeviceObject;
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(FsvolDeviceObject); FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(FsvolDeviceObject);
LARGE_INTEGER TruncateSize, *PTruncateSize = 0; LARGE_INTEGER TruncateSize, *PTruncateSize = 0;
BOOLEAN DeletePending, DeletedFromContextTable = FALSE, SingleHandle = FALSE; BOOLEAN DeletePending = FALSE, DeletedFromContextTable = FALSE, SingleHandle = FALSE;
FspFsvolDeviceLockContextTable(FsvolDeviceObject); 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! */ /* NOTE: Do not use FspFileNodeFlushAndPurgeCache. It does not seem to work well! */
if (!DeletePending)
{
IO_STATUS_BLOCK IoStatus; 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); CcPurgeCacheSection(FileObject->SectionObjectPointer, 0, 0, TRUE);
} }