mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-22 16:33:02 -05:00
sys: file: FspFileNodeCleanupComplete: FlushAndPurgeOnCleanup
This commit is contained in:
parent
9f56a21c7f
commit
5c3549c6eb
@ -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 */
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user