From f6828bd9f158870002e8eeeb2325a40eb7ca5041 Mon Sep 17 00:00:00 2001 From: Peter Scott Date: Wed, 18 Jan 2012 18:42:19 -0700 Subject: [PATCH] Windows Asynchronous purging of file content after a DV change Purge all regions of the file surrounding the extents which are to be purged. If a failure occurs on the purge due to an existing mapping, flag for purge during handle close Change-Id: Id8ef81afaa614ea08e03bbd55ec2cdded0d7139f Reviewed-on: http://gerrit.openafs.org/6573 Tested-by: BuildBot Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman --- src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp | 9 +++ src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp | 71 ++++++++++++++++--- .../afsrdr/kernel/lib/Include/AFSDefines.h | 1 + 3 files changed, 72 insertions(+), 9 deletions(-) diff --git a/src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp b/src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp index 5f5be0933..af8c18036 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp @@ -636,6 +636,15 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject, AFSReleaseResource( &pFcb->NPFcb->Resource); + if( BooleanFlagOn( pFcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE)) + { + InterlockedIncrement( &pObjectInfo->ObjectReferenceCount); + ClearFlag( pFcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE); + + AFSPerformObjectInvalidate( pObjectInfo, + AFS_INVALIDATE_DATA_VERSION); + } + lCount = InterlockedDecrement( &pFcb->OpenHandleCount); AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING, diff --git a/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp b/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp index ca071ed2a..59a47e7bc 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp @@ -8565,6 +8565,10 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo, case AFS_INVALIDATE_DATA_VERSION: { + LARGE_INTEGER liCurrentOffset = {0,0}; + LARGE_INTEGER liFlushLength = {0,0}; + ULONG ulFlushLength = 0; + if( ObjectInfo->FileType == AFS_FILE_TYPE_FILE && ObjectInfo->Fcb != NULL) { @@ -8583,20 +8587,69 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo, ulCount = (ULONG)ObjectInfo->Fcb->Specific.File.ExtentCount; - while( ulProcessCount < ulCount) + if( ulCount > 0) { pEntry = ExtentFor( le, AFS_EXTENTS_LIST ); - if( !BooleanFlagOn( pEntry->Flags, AFS_EXTENT_DIRTY)) + while( ulProcessCount < ulCount) { - CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers, - &pEntry->FileOffset, - pEntry->Size, - FALSE); + pEntry = ExtentFor( le, AFS_EXTENTS_LIST ); + + if( !BooleanFlagOn( pEntry->Flags, AFS_EXTENT_DIRTY)) + { + if( !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers, + &pEntry->FileOffset, + pEntry->Size, + FALSE)) + { + SetFlag( ObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE); + } + } + + if( liCurrentOffset.QuadPart < pEntry->FileOffset.QuadPart) + { + + liFlushLength.QuadPart = pEntry->FileOffset.QuadPart - liCurrentOffset.QuadPart; + + while( liFlushLength.QuadPart > 0) + { + + if( liFlushLength.QuadPart > 512 * 1024000) + { + ulFlushLength = 512 * 1024000; + } + else + { + ulFlushLength = liFlushLength.LowPart; + } + + if( !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers, + &liCurrentOffset, + ulFlushLength, + FALSE)) + { + SetFlag( ObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE); + } + + liFlushLength.QuadPart -= ulFlushLength; + } + } + + liCurrentOffset.QuadPart = pEntry->FileOffset.QuadPart + pEntry->Size; + + ulProcessCount++; + le = le->Flink; + } + } + else + { + if( !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers, + NULL, + 0, + FALSE)) + { + SetFlag( ObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE); } - - ulProcessCount++; - le = le->Flink; } } __except( EXCEPTION_EXECUTE_HANDLER) diff --git a/src/WINNT/afsrdr/kernel/lib/Include/AFSDefines.h b/src/WINNT/afsrdr/kernel/lib/Include/AFSDefines.h index d7c102e5e..c08e6886c 100644 --- a/src/WINNT/afsrdr/kernel/lib/Include/AFSDefines.h +++ b/src/WINNT/afsrdr/kernel/lib/Include/AFSDefines.h @@ -136,6 +136,7 @@ NTSTATUS #define AFS_FCB_FLAG_UPDATE_ACCESS_TIME 0x00000010 #define AFS_FCB_FLAG_UPDATE_CREATE_TIME 0x00000020 #define AFS_FCB_FLAG_UPDATE_LAST_WRITE_TIME 0x00000040 +#define AFS_FCB_FLAG_PURGE_ON_CLOSE 0x00000080 // // Object information flags -- 2.39.5