From d4c9cbc75edd632bd5bf22042c6502d03dda2d9c Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Mon, 23 Apr 2012 20:18:20 -0400 Subject: [PATCH] Windows: Directory validation should purge data changes immediately During AFSEnumerateDirectory() and AFSVerifyDirectoryContent() calls use AFSPerformObjectInvalidate() instead of AFSInvalidateObject() to trigger the data purge. This is necessary to avoid a race as AFSInvalidateObject() will queue a work request that will be performed after the metadata is updated. Change-Id: Iaf09c6448927a037175cb4a83502fd4a1d210ef2 Reviewed-on: http://gerrit.openafs.org/7279 Tested-by: BuildBot Tested-by: Jeffrey Altman Reviewed-by: Jeffrey Altman --- src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp | 4 ++++ src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp | 28 +++++++++++--------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp b/src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp index 77bf7e9..612e499 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp @@ -643,6 +643,10 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject, if( BooleanFlagOn( pFcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE)) { + // + // The ObjectReferenceCount will be freed by AFSPerformObjectInvalidate + // + InterlockedIncrement( &pObjectInfo->ObjectReferenceCount); ClearFlag( pFcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE); diff --git a/src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp b/src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp index 008d563..763c45d 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp @@ -306,16 +306,14 @@ AFSEnumerateDirectory( IN GUID *AuthGroup, LONG lCount; AFSObjectInfoCB *pObjectInfo = pDirNode->ObjectInformation; - lCount = InterlockedIncrement( &pObjectInfo->ObjectReferenceCount); - - AFSInvalidateObject( &pObjectInfo, - AFS_INVALIDATE_DATA_VERSION); + // + // The ObjectReferenceCount will be freed by AFSPerformObjectInvalidate + // - if( pObjectInfo != NULL) - { + lCount = InterlockedIncrement( &pObjectInfo->ObjectReferenceCount); - lCount = InterlockedDecrement( &pObjectInfo->ObjectReferenceCount); - } + AFSPerformObjectInvalidate( pObjectInfo, + AFS_INVALIDATE_DATA_VERSION); } else { @@ -1070,16 +1068,14 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB, if( pObjectInfo->DataVersion.QuadPart != pCurrentDirEntry->DataVersion.QuadPart) { - lCount = InterlockedIncrement( &pObjectInfo->ObjectReferenceCount); - - AFSInvalidateObject( &pObjectInfo, - AFS_INVALIDATE_DATA_VERSION); + // + // The ObjectReferenceCount will be freed by AFSPerformObjectInvalidate + // - if( pObjectInfo != NULL) - { + lCount = InterlockedIncrement( &pObjectInfo->ObjectReferenceCount); - lCount = InterlockedDecrement( &pObjectInfo->ObjectReferenceCount); - } + AFSPerformObjectInvalidate( pObjectInfo, + AFS_INVALIDATE_DATA_VERSION); } else { -- 1.9.4