From e267774f1a4f9cc5bfc32c545df36a4bf7947607 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Thu, 24 Jan 2013 18:44:33 -0500 Subject: [PATCH] Windows: Categorize ObjectInformationCB RefCnts To assist in tracking down the source of ObjectInformationCB overcounts and undercounts, add an advisory array which tracks the reference counts by category. In the procress ensure that all reference count changes are logged by tracing. Change-Id: I813cd0af5e12e36ba9863577dbd35abef6339414 Reviewed-on: http://gerrit.openafs.org/8956 Tested-by: BuildBot Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman --- src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp | 3 +- .../afsrdr/kernel/lib/AFSCommSupport.cpp | 27 ++- .../afsrdr/kernel/lib/AFSExtentsSupport.cpp | 26 ++- src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp | 18 ++ src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp | 168 ++++++++++++++---- .../afsrdr/kernel/lib/AFSNameSupport.cpp | 5 +- src/WINNT/afsrdr/kernel/lib/AFSWorker.cpp | 36 +++- .../afsrdr/kernel/lib/Include/AFSCommon.h | 6 +- .../afsrdr/kernel/lib/Include/AFSDefines.h | 14 ++ .../afsrdr/kernel/lib/Include/AFSStructs.h | 2 + 10 files changed, 246 insertions(+), 59 deletions(-) diff --git a/src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp b/src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp index bc7feed5a..a92f4ce1b 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp @@ -741,7 +741,8 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject, // The ObjectReferenceCount will be freed by AFSPerformObjectInvalidate // - lCount = AFSObjectInfoIncrement( pObjectInfo); + lCount = AFSObjectInfoIncrement( pObjectInfo, + AFS_OBJECT_REFERENCE_INVALIDATION); AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, AFS_TRACE_LEVEL_VERBOSE, diff --git a/src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp b/src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp index fb69008bd..028d8e9dc 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp @@ -311,7 +311,14 @@ AFSEnumerateDirectory( IN GUID *AuthGroup, // The ObjectReferenceCount will be freed by AFSPerformObjectInvalidate // - lCount = AFSObjectInfoIncrement( pObjectInfo); + lCount = AFSObjectInfoIncrement( pObjectInfo, + AFS_OBJECT_REFERENCE_INVALIDATION); + + AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, + AFS_TRACE_LEVEL_VERBOSE, + "AFSEnumerateDirectory calling AFSPerformObjectInvalidate Increment count on object %p Cnt %d\n", + pObjectInfo, + lCount); AFSPerformObjectInvalidate( pObjectInfo, AFS_INVALIDATE_DATA_VERSION); @@ -1090,13 +1097,27 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB, // lock hierarchy. // - lCount = AFSObjectInfoIncrement( pObjectInfo); + lCount = AFSObjectInfoIncrement( pObjectInfo, + AFS_OBJECT_REFERENCE_INVALIDATION); + + AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, + AFS_TRACE_LEVEL_VERBOSE, + "AFSVerifyDirectoryContent calling AFSQueueInvalidateObject Increment count on object %p Cnt %d\n", + pObjectInfo, + lCount); if ( !NT_SUCCESS( AFSQueueInvalidateObject( pObjectInfo, AFS_INVALIDATE_DATA_VERSION))) { - lCount = AFSObjectInfoDecrement( pObjectInfo); + lCount = AFSObjectInfoDecrement( pObjectInfo, + AFS_OBJECT_REFERENCE_INVALIDATION); + + AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, + AFS_TRACE_LEVEL_VERBOSE, + "AFSVerifyDirectoryContent AFSQueueInvalidateObject failed Decrement count on object %p Cnt %d\n", + pObjectInfo, + lCount); } } else diff --git a/src/WINNT/afsrdr/kernel/lib/AFSExtentsSupport.cpp b/src/WINNT/afsrdr/kernel/lib/AFSExtentsSupport.cpp index 0afe5f267..247ccae4d 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSExtentsSupport.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSExtentsSupport.cpp @@ -1473,7 +1473,8 @@ AFSProcessSetFileExtents( IN AFSSetFileExtentsCB *SetExtents ) // Reference the node so it won't be torn down // - lCount = AFSObjectInfoIncrement( pObjectInfo); + lCount = AFSObjectInfoIncrement( pObjectInfo, + AFS_OBJECT_REFERENCE_EXTENTS); AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, AFS_TRACE_LEVEL_VERBOSE, @@ -1554,7 +1555,8 @@ try_exit: if( pObjectInfo != NULL) { - lCount = AFSObjectInfoDecrement( pObjectInfo); + lCount = AFSObjectInfoDecrement( pObjectInfo, + AFS_OBJECT_REFERENCE_EXTENTS); AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, AFS_TRACE_LEVEL_VERBOSE, @@ -1982,12 +1984,14 @@ AFSFindFcbToClean(ULONG IgnoreTime, AFSFcb *LastFcb, BOOLEAN Block) // A hit a very palpable hit. Pin it // - lCount = AFSObjectInfoIncrement( pCurrentObject); + lCount = AFSObjectInfoIncrement( pFcb->ObjectInformation, + AFS_OBJECT_REFERENCE_EXTENTS); AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, AFS_TRACE_LEVEL_VERBOSE, - "AFSFindFcbToClean Increment count on Fcb %p Cnt %d\n", - pCurrentObject, + "AFSFindFcbToClean Increment count on Fcb %p object %pCnt %d\n", + pFcb, + pFcb->ObjectInformation, lCount); bLocatedEntry = TRUE; @@ -2124,7 +2128,8 @@ AFSProcessExtentFailure( PIRP Irp) // Reference the node so it won't be torn down // - lCount = AFSObjectInfoIncrement( pObjectInfo); + lCount = AFSObjectInfoIncrement( pObjectInfo, + AFS_OBJECT_REFERENCE_EXTENTS); AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, AFS_TRACE_LEVEL_VERBOSE, @@ -2185,7 +2190,8 @@ AFSProcessExtentFailure( PIRP Irp) AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource); - lCount = AFSObjectInfoDecrement( pObjectInfo); + lCount = AFSObjectInfoDecrement( pObjectInfo, + AFS_OBJECT_REFERENCE_EXTENTS); AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, AFS_TRACE_LEVEL_VERBOSE, @@ -2375,7 +2381,8 @@ AFSProcessReleaseFileExtents( IN PIRP Irp) // Reference the node so it won't be torn down // - lCount = AFSObjectInfoIncrement( pObjectInfo); + lCount = AFSObjectInfoIncrement( pObjectInfo, + AFS_OBJECT_REFERENCE_EXTENTS); AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, AFS_TRACE_LEVEL_VERBOSE, @@ -2600,7 +2607,8 @@ try_exit: if( pObjectInfo != NULL) { - lCount = AFSObjectInfoDecrement( pObjectInfo); + lCount = AFSObjectInfoDecrement( pObjectInfo, + AFS_OBJECT_REFERENCE_EXTENTS); AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, AFS_TRACE_LEVEL_VERBOSE, diff --git a/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp b/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp index 04ec9283c..03e2f6a2d 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp @@ -3146,6 +3146,24 @@ AFSSetRenameInfo( IN PIRP Irp) lCount = InterlockedIncrement( &pTargetParentObject->Specific.Directory.ChildOpenReferenceCount); + lCount = AFSObjectInfoIncrement( pTargetParentObject, + AFS_OBJECT_REFERENCE_CHILD); + + AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, + AFS_TRACE_LEVEL_VERBOSE, + "AFSSetRenameInfo Increment count on parent object %p Cnt %d\n", + pTargetParentObject, + lCount); + + lCount = AFSObjectInfoDecrement( pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation, + AFS_OBJECT_REFERENCE_CHILD); + + AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, + AFS_TRACE_LEVEL_VERBOSE, + "AFSSetRenameInfo Decrement count on parent object %p Cnt %d\n", + pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation, + lCount); + pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation = pTargetParentObject; ulNotificationAction = FILE_ACTION_ADDED; diff --git a/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp b/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp index 201ca8dfc..ccceed191 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp @@ -670,7 +670,8 @@ AFSInitializeGlobalDirectoryEntries() try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES); } - lCount = AFSObjectInfoIncrement( pObjectInfoCB); + lCount = AFSObjectInfoIncrement( pObjectInfoCB, + AFS_OBJECT_REFERENCE_GLOBAL); AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, AFS_TRACE_LEVEL_VERBOSE, @@ -777,7 +778,8 @@ AFSInitializeGlobalDirectoryEntries() try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES); } - lCount = AFSObjectInfoIncrement( pObjectInfoCB); + lCount = AFSObjectInfoIncrement( pObjectInfoCB, + AFS_OBJECT_REFERENCE_GLOBAL); AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, AFS_TRACE_LEVEL_VERBOSE, @@ -970,7 +972,8 @@ AFSInitDirEntry( IN AFSObjectInfoCB *ParentObjectInfo, FileName); } - lCount = AFSObjectInfoIncrement( pObjectInfoCB); + lCount = AFSObjectInfoIncrement( pObjectInfoCB, + AFS_OBJECT_REFERENCE_DIRENTRY); AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, AFS_TRACE_LEVEL_VERBOSE, @@ -1196,7 +1199,8 @@ try_exit: if( pObjectInfoCB != NULL) { - lCount = AFSObjectInfoDecrement( pObjectInfoCB); + lCount = AFSObjectInfoDecrement( pObjectInfoCB, + AFS_OBJECT_REFERENCE_DIRENTRY); AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, AFS_TRACE_LEVEL_VERBOSE, @@ -2021,7 +2025,8 @@ AFSInvalidateCache( IN AFSInvalidateCacheCB *InvalidateCB) // Reference the node so it won't be torn down // - lCount = AFSObjectInfoIncrement( pObjectInfo); + lCount = AFSObjectInfoIncrement( pObjectInfo, + AFS_OBJECT_REFERENCE_INVALIDATION); AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, AFS_TRACE_LEVEL_VERBOSE, @@ -2056,7 +2061,8 @@ try_exit: if( pObjectInfo != NULL) { - lCount = AFSObjectInfoDecrement( pObjectInfo); + lCount = AFSObjectInfoDecrement( pObjectInfo, + AFS_OBJECT_REFERENCE_INVALIDATION); AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, AFS_TRACE_LEVEL_VERBOSE, @@ -2516,7 +2522,8 @@ AFSInvalidateVolume( IN AFSVolumeCB *VolumeCB, if ( pCurrentObject ) { - lCount = AFSObjectInfoIncrement( pCurrentObject); + lCount = AFSObjectInfoIncrement( pCurrentObject, + AFS_OBJECT_REFERENCE_INVALIDATION); AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, AFS_TRACE_LEVEL_VERBOSE, @@ -2530,7 +2537,8 @@ AFSInvalidateVolume( IN AFSVolumeCB *VolumeCB, if ( pCurrentObject) { - lCount = AFSObjectInfoDecrement( pCurrentObject); + lCount = AFSObjectInfoDecrement( pCurrentObject, + AFS_OBJECT_REFERENCE_INVALIDATION); AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, AFS_TRACE_LEVEL_VERBOSE, @@ -2556,7 +2564,8 @@ AFSInvalidateVolume( IN AFSVolumeCB *VolumeCB, // Reference the node so it won't be torn down // - lCount = AFSObjectInfoIncrement( pCurrentObject); + lCount = AFSObjectInfoIncrement( pCurrentObject, + AFS_OBJECT_REFERENCE_INVALIDATION); AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, AFS_TRACE_LEVEL_VERBOSE, @@ -2577,7 +2586,8 @@ AFSInvalidateVolume( IN AFSVolumeCB *VolumeCB, // Reference the node so it won't be torn down // - lCount = AFSObjectInfoIncrement( pNextObject); + lCount = AFSObjectInfoIncrement( pNextObject, + AFS_OBJECT_REFERENCE_INVALIDATION); AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, AFS_TRACE_LEVEL_VERBOSE, @@ -2594,7 +2604,8 @@ AFSInvalidateVolume( IN AFSVolumeCB *VolumeCB, if ( pCurrentObject ) { - lCount = AFSObjectInfoDecrement( pCurrentObject); + lCount = AFSObjectInfoDecrement( pCurrentObject, + AFS_OBJECT_REFERENCE_INVALIDATION); AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, AFS_TRACE_LEVEL_VERBOSE, @@ -4289,6 +4300,7 @@ AFSInitializeSpecialShareNameList() UNICODE_STRING uniShareName; ULONG ulEntryLength = 0; AFSNonPagedDirectoryCB *pNonPagedDirEntry = NULL; + LONG lCount; __Enter { @@ -4305,12 +4317,14 @@ AFSInitializeSpecialShareNameList() try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES); } + lCount = AFSObjectInfoIncrement( pObjectInfoCB, + AFS_OBJECT_REFERENCE_GLOBAL); + AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, AFS_TRACE_LEVEL_VERBOSE, - "AFSInitializeSpecialShareNameList (srvsvc) Initializing count (1) on object %p\n", - pObjectInfoCB); - - pObjectInfoCB->ObjectReferenceCount = 1; + "AFSInitializeSpecialShareNameList (srvsvc) Increment count on object %p Cnt %d\n", + pObjectInfoCB, + lCount); pObjectInfoCB->FileType = (ULONG) AFS_FILE_TYPE_SPECIAL_SHARE_NAME; @@ -4391,12 +4405,14 @@ AFSInitializeSpecialShareNameList() try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES); } + lCount = AFSObjectInfoIncrement( pObjectInfoCB, + AFS_OBJECT_REFERENCE_GLOBAL); + AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, AFS_TRACE_LEVEL_VERBOSE, - "AFSInitializeSpecialShareNameList (ipc$) Initializing count (1) on object %p\n", - pObjectInfoCB); - - pObjectInfoCB->ObjectReferenceCount = 1; + "AFSInitializeSpecialShareNameList (ipc$) Incrementing count on object %p Cnt %d\n", + pObjectInfoCB, + lCount); pObjectInfoCB->FileType = (ULONG) AFS_FILE_TYPE_SPECIAL_SHARE_NAME; @@ -5816,12 +5832,14 @@ AFSInitPIOCtlDirectoryCB( IN AFSObjectInfoCB *ObjectInfo) try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES); } + lCount = AFSObjectInfoIncrement( pObjectInfoCB, + AFS_OBJECT_REFERENCE_DIRENTRY); + AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, AFS_TRACE_LEVEL_VERBOSE, - "AFSInitPIOCtlDirectoryCB Initializing count (1) on object %p\n", - pObjectInfoCB); - - pObjectInfoCB->ObjectReferenceCount = 1; + "AFSInitPIOCtlDirectoryCB Increment count on object %p Cnt %d\n", + pObjectInfoCB, + lCount); pObjectInfoCB->FileType = (ULONG) AFS_FILE_TYPE_PIOCTL; @@ -5897,7 +5915,8 @@ AFSInitPIOCtlDirectoryCB( IN AFSObjectInfoCB *ObjectInfo) // Increment the open reference and handle on the node // - lCount = AFSObjectInfoIncrement( pDirNode->ObjectInformation); + lCount = AFSObjectInfoIncrement( pDirNode->ObjectInformation, + AFS_OBJECT_REFERENCE_DIRENTRY); AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING, AFS_TRACE_LEVEL_VERBOSE, @@ -5930,6 +5949,15 @@ try_exit: if ( pObjectInfoCB != NULL) { + lCount = AFSObjectInfoDecrement( pObjectInfoCB, + AFS_OBJECT_REFERENCE_DIRENTRY); + + AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, + AFS_TRACE_LEVEL_VERBOSE, + "AFSInitPIOCtlDirectoryCB Decrement count on object %p Cnt %d\n", + pObjectInfoCB, + lCount); + AFSDeleteObjectInfo( pObjectInfoCB); } } @@ -6453,7 +6481,15 @@ AFSAllocateObjectInfo( IN AFSObjectInfoCB *ParentObjectInfo, if( ParentObjectInfo != NULL) { - lCount = AFSObjectInfoIncrement( ParentObjectInfo); + + lCount = AFSObjectInfoIncrement( ParentObjectInfo, + AFS_OBJECT_REFERENCE_CHILD); + + AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, + AFS_TRACE_LEVEL_VERBOSE, + "AFSAllocateObjectInfo Increment count on parent object %p Cnt %d\n", + ParentObjectInfo, + lCount); } // @@ -6520,7 +6556,8 @@ try_exit: } LONG -AFSObjectInfoIncrement( IN AFSObjectInfoCB *ObjectInfo) +AFSObjectInfoIncrement( IN AFSObjectInfoCB *ObjectInfo, + IN LONG Reason) { LONG lCount; @@ -6551,13 +6588,16 @@ AFSObjectInfoIncrement( IN AFSObjectInfoCB *ObjectInfo) } } + InterlockedIncrement( &ObjectInfo->ObjectReferences[ Reason]); + AFSReleaseResource( &ObjectInfo->NonPagedInfo->ObjectInfoLock); return lCount; } LONG -AFSObjectInfoDecrement( IN AFSObjectInfoCB *ObjectInfo) +AFSObjectInfoDecrement( IN AFSObjectInfoCB *ObjectInfo, + IN LONG Reason) { LONG lCount; @@ -6580,6 +6620,10 @@ AFSObjectInfoDecrement( IN AFSObjectInfoCB *ObjectInfo) lCount = InterlockedDecrement( &ObjectInfo->ObjectReferenceCount); } + lCount = InterlockedDecrement( &ObjectInfo->ObjectReferences[ Reason]); + + ASSERT( lCount >= 0); + AFSReleaseResource( &ObjectInfo->NonPagedInfo->ObjectInfoLock); return lCount; @@ -6607,6 +6651,8 @@ AFSDeleteObjectInfo( IN AFSObjectInfoCB *ObjectInfo) return; } + ASSERT( ObjectInfo->ObjectReferenceCount == 0); + if( !ExIsResourceAcquiredExclusiveLite( ObjectInfo->VolumeCB->ObjectInfoTree.TreeLock)) { @@ -6670,7 +6716,14 @@ AFSDeleteObjectInfo( IN AFSObjectInfoCB *ObjectInfo) if( ObjectInfo->ParentObjectInformation != NULL) { - lCount = AFSObjectInfoDecrement( ObjectInfo->ParentObjectInformation); + lCount = AFSObjectInfoDecrement( ObjectInfo->ParentObjectInformation, + AFS_OBJECT_REFERENCE_CHILD); + + AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, + AFS_TRACE_LEVEL_VERBOSE, + "AFSDeleteObjectInfo Decrement count on parent object %p Cnt %d\n", + ObjectInfo->ParentObjectInformation, + lCount); } if( bAcquiredTreeLock) @@ -8032,6 +8085,7 @@ AFSCloseLibrary() NTSTATUS ntStatus = STATUS_SUCCESS; AFSDirectoryCB *pDirNode = NULL, *pLastDirNode = NULL; + LONG lCount; __Enter { @@ -8039,6 +8093,9 @@ AFSCloseLibrary() if( AFSGlobalDotDirEntry != NULL) { + lCount = AFSObjectInfoDecrement( AFSGlobalDotDirEntry->ObjectInformation, + AFS_OBJECT_REFERENCE_GLOBAL); + AFSDeleteObjectInfo( AFSGlobalDotDirEntry->ObjectInformation); ExDeleteResourceLite( &AFSGlobalDotDirEntry->NonPaged->Lock); @@ -8053,6 +8110,9 @@ AFSCloseLibrary() if( AFSGlobalDotDotDirEntry != NULL) { + lCount = AFSObjectInfoDecrement( AFSGlobalDotDotDirEntry->ObjectInformation, + AFS_OBJECT_REFERENCE_GLOBAL); + AFSDeleteObjectInfo( AFSGlobalDotDotDirEntry->ObjectInformation); ExDeleteResourceLite( &AFSGlobalDotDotDirEntry->NonPaged->Lock); @@ -8074,6 +8134,9 @@ AFSCloseLibrary() pLastDirNode = (AFSDirectoryCB *)pDirNode->ListEntry.fLink; + lCount = AFSObjectInfoDecrement( pDirNode->ObjectInformation, + AFS_OBJECT_REFERENCE_GLOBAL); + AFSDeleteObjectInfo( pDirNode->ObjectInformation); ExDeleteResourceLite( &pDirNode->NonPaged->Lock); @@ -8194,7 +8257,14 @@ AFSGetObjectStatus( IN AFSGetStatusInfoCB *GetStatusInfo, pObjectInfo = &pVolumeCB->ObjectInformation; - lCount = AFSObjectInfoIncrement( pObjectInfo); + lCount = AFSObjectInfoIncrement( pObjectInfo, + AFS_OBJECT_REFERENCE_STATUS); + + AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, + AFS_TRACE_LEVEL_VERBOSE, + "AFSGetObjectStatus Increment1 count on object %p Cnt %d\n", + pObjectInfo, + lCount); lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount); @@ -8231,11 +8301,12 @@ AFSGetObjectStatus( IN AFSGetStatusInfoCB *GetStatusInfo, // Reference the node so it won't be torn down // - lCount = AFSObjectInfoIncrement( pObjectInfo); + lCount = AFSObjectInfoIncrement( pObjectInfo, + AFS_OBJECT_REFERENCE_STATUS); AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, AFS_TRACE_LEVEL_VERBOSE, - "AFSGetObjectStatus Increment count on object %p Cnt %d\n", + "AFSGetObjectStatus Increment2 count on object %p Cnt %d\n", pObjectInfo, lCount); } @@ -8416,7 +8487,14 @@ AFSGetObjectStatus( IN AFSGetStatusInfoCB *GetStatusInfo, pObjectInfo = pDirectoryEntry->ObjectInformation; - lCount = AFSObjectInfoIncrement( pObjectInfo); + lCount = AFSObjectInfoIncrement( pObjectInfo, + AFS_OBJECT_REFERENCE_STATUS); + + AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, + AFS_TRACE_LEVEL_VERBOSE, + "AFSGetObjectStatus Increment3 count on object %p Cnt %d\n", + pObjectInfo, + lCount); if( pVolumeCB != NULL) { @@ -8476,7 +8554,14 @@ try_exit: if( pObjectInfo != NULL) { - lCount = AFSObjectInfoDecrement( pObjectInfo); + lCount = AFSObjectInfoDecrement( pObjectInfo, + AFS_OBJECT_REFERENCE_STATUS); + + AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, + AFS_TRACE_LEVEL_VERBOSE, + "AFSGetObjectStatus Decrement count on object %p Cnt %d\n", + pObjectInfo, + lCount); } if( pNameArray != NULL) @@ -9106,6 +9191,7 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo, AFSExtent *pEntry; ULONG ulProcessCount = 0; ULONG ulCount = 0; + LONG lCount; __Enter { @@ -9547,11 +9633,19 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo, } } - if( ObjectInfo != NULL) - { + // + // Destroy the reference passed in by the caller to AFSInvalidateObject + // or AFSQueueInvalidateObject + // - AFSObjectInfoDecrement( ObjectInfo); - } + lCount = AFSObjectInfoDecrement( ObjectInfo, + AFS_OBJECT_REFERENCE_INVALIDATION); + + AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, + AFS_TRACE_LEVEL_VERBOSE, + "AFSPerformObjectInvalidation Decrement count on object %p Cnt %d\n", + ObjectInfo, + lCount); } return ntStatus; diff --git a/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp b/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp index b17c2d9b9..9ff1b9165 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp @@ -2556,9 +2556,8 @@ AFSDeleteDirEntry( IN AFSObjectInfoCB *ParentObjectInfo, // Dereference the object for this dir entry // - ASSERT( DirEntry->ObjectInformation->ObjectReferenceCount > 0); - - lCount = AFSObjectInfoDecrement( DirEntry->ObjectInformation); + lCount = AFSObjectInfoDecrement( DirEntry->ObjectInformation, + AFS_OBJECT_REFERENCE_DIRENTRY); AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, AFS_TRACE_LEVEL_VERBOSE, diff --git a/src/WINNT/afsrdr/kernel/lib/AFSWorker.cpp b/src/WINNT/afsrdr/kernel/lib/AFSWorker.cpp index 00212e498..58f5488ab 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSWorker.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSWorker.cpp @@ -1399,7 +1399,14 @@ AFSPrimaryVolumeWorkerThread( IN PVOID Context) // with an invalidation call from the service during AFSCleanupFcb // - lCount = AFSObjectInfoIncrement( pCurrentChildObject); + lCount = AFSObjectInfoIncrement( pCurrentChildObject, + AFS_OBJECT_REFERENCE_WORKER); + + AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, + AFS_TRACE_LEVEL_VERBOSE, + "AFSPrimaryVolumeWorkerThread Increment count on object %p Cnt %d\n", + pCurrentChildObject, + lCount); if( lCount == 1 && pCurrentChildObject->Fcb != NULL && @@ -1436,7 +1443,14 @@ AFSPrimaryVolumeWorkerThread( IN PVOID Context) TRUE); } - lCount = AFSObjectInfoDecrement( pCurrentChildObject); + lCount = AFSObjectInfoDecrement( pCurrentChildObject, + AFS_OBJECT_REFERENCE_WORKER); + + AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, + AFS_TRACE_LEVEL_VERBOSE, + "AFSPrimaryVolumeWorkerThread Decrement1 count on object %p Cnt %d\n", + pCurrentChildObject, + lCount); AFSAcquireExcl( &pCurrentChildObject->NonPagedInfo->ObjectInfoLock, TRUE); @@ -1565,7 +1579,14 @@ AFSPrimaryVolumeWorkerThread( IN PVOID Context) else if( pCurrentObject->FileType == AFS_FILE_TYPE_FILE) { - lCount = AFSObjectInfoIncrement( pCurrentObject); + lCount = AFSObjectInfoIncrement( pCurrentObject, + AFS_OBJECT_REFERENCE_WORKER); + + AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, + AFS_TRACE_LEVEL_VERBOSE, + "AFSPrimaryVolumeWorkerThread Increment2 count on object %p Cnt %d\n", + pCurrentObject, + lCount); AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock); @@ -1587,7 +1608,14 @@ AFSPrimaryVolumeWorkerThread( IN PVOID Context) } } - lCount = AFSObjectInfoDecrement( pCurrentObject); + lCount = AFSObjectInfoDecrement( pCurrentObject, + AFS_OBJECT_REFERENCE_WORKER); + + AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING, + AFS_TRACE_LEVEL_VERBOSE, + "AFSPrimaryVolumeWorkerThread Decrement2 count on object %p Cnt %d\n", + pCurrentObject, + lCount); if( !AFSAcquireExcl( pVolumeCB->ObjectInfoTree.TreeLock, FALSE)) diff --git a/src/WINNT/afsrdr/kernel/lib/Include/AFSCommon.h b/src/WINNT/afsrdr/kernel/lib/Include/AFSCommon.h index 32915d456..37f552a83 100644 --- a/src/WINNT/afsrdr/kernel/lib/Include/AFSCommon.h +++ b/src/WINNT/afsrdr/kernel/lib/Include/AFSCommon.h @@ -1323,10 +1323,12 @@ AFSAllocateObjectInfo( IN AFSObjectInfoCB *ParentObjectInfo, IN ULONGLONG HashIndex); LONG -AFSObjectInfoIncrement( IN AFSObjectInfoCB *ObjectInfo); +AFSObjectInfoIncrement( IN AFSObjectInfoCB *ObjectInfo, + IN LONG Reason); LONG -AFSObjectInfoDecrement( IN AFSObjectInfoCB *ObjectInfo); +AFSObjectInfoDecrement( IN AFSObjectInfoCB *ObjectInfo, + IN LONG Reason); void AFSDeleteObjectInfo( IN AFSObjectInfoCB *ObjectInfo); diff --git a/src/WINNT/afsrdr/kernel/lib/Include/AFSDefines.h b/src/WINNT/afsrdr/kernel/lib/Include/AFSDefines.h index 29d301430..794a3780b 100644 --- a/src/WINNT/afsrdr/kernel/lib/Include/AFSDefines.h +++ b/src/WINNT/afsrdr/kernel/lib/Include/AFSDefines.h @@ -153,6 +153,20 @@ NTSTATUS #define AFS_OBJECT_ROOT_VOLUME 0x00000100 #define AFS_OBJECT_FLAGS_VERIFY_DATA 0x00000200 +// +// Object information reference count reasons +// + +#define AFS_OBJECT_REFERENCE_DIRENTRY 0 +#define AFS_OBJECT_REFERENCE_CHILD 1 +#define AFS_OBJECT_REFERENCE_INVALIDATION 2 +#define AFS_OBJECT_REFERENCE_GLOBAL 3 +#define AFS_OBJECT_REFERENCE_EXTENTS 4 +#define AFS_OBJECT_REFERENCE_WORKER 5 +#define AFS_OBJECT_REFERENCE_STATUS 6 +// unused 7 +#define AFS_OBJECT_REFERENCE_MAX 8 + // // Define one second in terms of 100 nS units // diff --git a/src/WINNT/afsrdr/kernel/lib/Include/AFSStructs.h b/src/WINNT/afsrdr/kernel/lib/Include/AFSStructs.h index 42142084e..6c75701a7 100644 --- a/src/WINNT/afsrdr/kernel/lib/Include/AFSStructs.h +++ b/src/WINNT/afsrdr/kernel/lib/Include/AFSStructs.h @@ -193,6 +193,8 @@ typedef struct _AFS_OBJECT_INFORMATION_CB LONG ObjectReferenceCount; + LONG ObjectReferences[ 8]; + AFSNonPagedObjectInfoCB *NonPagedInfo; // -- 2.39.5