Windows: Categorize ObjectInformationCB RefCnts
authorJeffrey Altman <jaltman@your-file-system.com>
Thu, 24 Jan 2013 23:44:33 +0000 (18:44 -0500)
committerJeffrey Altman <jaltman@your-file-system.com>
Sat, 2 Feb 2013 17:02:47 +0000 (09:02 -0800)
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 <buildbot@rampaginggeek.com>
Reviewed-by: Jeffrey Altman <jaltman@your-file-system.com>
Tested-by: Jeffrey Altman <jaltman@your-file-system.com>

src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp
src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp
src/WINNT/afsrdr/kernel/lib/AFSExtentsSupport.cpp
src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp
src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp
src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp
src/WINNT/afsrdr/kernel/lib/AFSWorker.cpp
src/WINNT/afsrdr/kernel/lib/Include/AFSCommon.h
src/WINNT/afsrdr/kernel/lib/Include/AFSDefines.h
src/WINNT/afsrdr/kernel/lib/Include/AFSStructs.h

index bc7feed..a92f4ce 100644 (file)
@@ -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,
index fb69008..028d8e9 100644 (file)
@@ -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
index 0afe5f2..247ccae 100644 (file)
@@ -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,
index 04ec928..03e2f6a 100644 (file)
@@ -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;
index 201ca8d..ccceed1 100644 (file)
@@ -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;
index b17c2d9..9ff1b91 100644 (file)
@@ -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,
index 00212e4..58f5488 100644 (file)
@@ -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))
index 32915d4..37f552a 100644 (file)
@@ -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);
index 29d3014..794a378 100644 (file)
@@ -154,6 +154,20 @@ NTSTATUS
 #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
 //
 
index 4214208..6c75701 100644 (file)
@@ -193,6 +193,8 @@ typedef struct _AFS_OBJECT_INFORMATION_CB
 
     LONG                      ObjectReferenceCount;
 
+    LONG                      ObjectReferences[ 8];
+
     AFSNonPagedObjectInfoCB  *NonPagedInfo;
 
     //