]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
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 bc7feed5ac2def94af5541912960211fae781397..a92f4ce1bdc2ee49272f86f85b1a4ea51dc87da4 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 fb69008bdfcb4304a75422b66d47ce2b9b85ef71..028d8e9dc50aa239ecdf3a8131acf2102fa32c3d 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 0afe5f267caf8de9bd5160bca92f381d2c9b595f..247ccae4d45b94604883fb2030b46ee76528c4b5 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 04ec9283c090c0ffacf7f8a21f3c8fa62a8f70e1..03e2f6a2d52814e040c8cfba1bca37e61ddef2e5 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 201ca8dfc586719eaaa65bb9842505d28da0fb3f..ccceed191ff0a6bf455529d951e2687d6291a097 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 b17c2d9b91217cfcde15d48a9f4a7ad28e6ba3da..9ff1b91659cee0ce7bc57189d178edb618ef43c5 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 00212e498e410b7948db519216add6efe48dd786..58f5488abc9c1da594a4803bf69f7d72cafc922b 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 32915d4567c9a19e31be759bc2cda9a00570dd3f..37f552a83e925313fa8a1112f58ac0e0413eab61 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 29d301430faad60acc0f903ebbbfb79b4621a8c7..794a3780bbb1890d1b653231fbb0fccef0f55c44 100644 (file)
@@ -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
 //
index 42142084ea0ac04808631ec11f7d816120c1b7b2..6c75701a73c9c0d6d5284d710e567e2d13184c51 100644 (file)
@@ -193,6 +193,8 @@ typedef struct _AFS_OBJECT_INFORMATION_CB
 
     LONG                      ObjectReferenceCount;
 
+    LONG                      ObjectReferences[ 8];
+
     AFSNonPagedObjectInfoCB  *NonPagedInfo;
 
     //