Windows: AFSLocateNameEntry double free Volume RefCount
[openafs.git] / src / WINNT / afsrdr / kernel / lib / AFSNameSupport.cpp
index 0ed5c09..45abe94 100644 (file)
 
 #include "AFSCommon.h"
 
+//
+// AFSLocateNameEntry
+//
+// On entry, *VolumeCB must have a held ReferenceCount provided by
+// the caller which will be released.  On successful exit, *VolumeCB
+// will be assigned the new current volume with a held ReferenceCount.
+//
+// On entry, *ParentDirectoryCB must have a held DirOpenReferenceCount
+// provided by the caller.
+//
+
 NTSTATUS
 AFSLocateNameEntry( IN GUID *AuthGroup,
                     IN PFILE_OBJECT FileObject,
@@ -45,7 +56,8 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                     IN UNICODE_STRING *ParsedPathName,
                     IN AFSNameArrayHdr *NameArray,
                     IN ULONG Flags,
-                    OUT AFSVolumeCB **VolumeCB,
+                    IN OUT AFSVolumeCB **VolumeCB,
+                    IN OUT LONG *pVolumeReferenceReason,
                     IN OUT AFSDirectoryCB **ParentDirectoryCB,
                     OUT AFSDirectoryCB **DirectoryCB,
                     OUT PUNICODE_STRING ComponentName)
@@ -65,7 +77,9 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
     AFSObjectInfoCB  *pCurrentObject = NULL;
     AFSObjectInfoCB  *pParentObjectInfo = NULL;
     AFSVolumeCB      *pCurrentVolume = *VolumeCB;
+    AFSVolumeCB      *pTargetVolume = NULL;
     BOOLEAN           bReleaseCurrentVolume = TRUE;
+    LONG              VolumeReferenceReason = *pVolumeReferenceReason;
     BOOLEAN           bSubstitutedName = FALSE;
     LONG              lCount;
 
@@ -74,7 +88,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE_2,
-                      "AFSLocateNameEntry (FO: %08lX) Processing full name %wZ\n",
+                      "AFSLocateNameEntry (FO: %p) Processing full name %wZ\n",
                       FileObject,
                       RootPathName);
 
@@ -124,7 +138,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
         while( TRUE)
         {
 
-            ASSERT( pCurrentVolume->VolumeReferenceCount > 1);
+            ASSERT( pCurrentVolume->VolumeReferenceCount > 0);
 
             ASSERT( pDirEntry->DirOpenReferenceCount > 0);
 
@@ -151,7 +165,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSLocateNameEntry (FO: %08lX) Deleted parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                              "AFSLocateNameEntry (FO: %p) Deleted parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                               FileObject,
                               &pDirEntry->NameInformation.FileName,
                               pCurrentObject->FileId.Cell,
@@ -168,7 +182,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSLocateNameEntry (FO: %08lX) Delete pending on %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                              "AFSLocateNameEntry (FO: %p) Delete pending on %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                               FileObject,
                               &pDirEntry->NameInformation.FileName,
                               pCurrentObject->FileId.Cell,
@@ -191,7 +205,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSLocateNameEntry (FO: %08lX) Verifying parent %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                              "AFSLocateNameEntry (FO: %p) Verifying parent %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                               FileObject,
                               &pDirEntry->NameInformation.FileName,
                               pCurrentObject->FileId.Cell,
@@ -216,7 +230,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_ERROR,
-                                  "AFSLocateNameEntry (FO: %08lX) Failed to verify parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                                  "AFSLocateNameEntry (FO: %p) Failed to verify parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                                   FileObject,
                                   &pDirEntry->NameInformation.FileName,
                                   pCurrentObject->FileId.Cell,
@@ -239,7 +253,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSLocateNameEntry (FO: %08lX) Evaluating parent %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                              "AFSLocateNameEntry (FO: %p) Evaluating parent %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                               FileObject,
                               &pDirEntry->NameInformation.FileName,
                               pCurrentObject->FileId.Cell,
@@ -256,12 +270,12 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                     if ( ntStatus == STATUS_NOT_A_DIRECTORY)
                     {
 
-                        if ( pCurrentObject->ParentObjectInformation == NULL)
+                        if ( !BooleanFlagOn( pCurrentObject->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
                         {
 
                             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                           AFS_TRACE_LEVEL_ERROR,
-                                          "AFSLocateNameEntry (FO: %08lX) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT NULL Status %08lX\n",
+                                          "AFSLocateNameEntry (FO: %p) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT NULL Status %08lX\n",
                                           FileObject,
                                           &pDirEntry->NameInformation.FileName,
                                           pCurrentObject->FileId.Cell,
@@ -275,17 +289,17 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                           AFS_TRACE_LEVEL_ERROR,
-                                          "AFSLocateNameEntry (FO: %08lX) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                                          "AFSLocateNameEntry (FO: %p) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                                           FileObject,
                                           &pDirEntry->NameInformation.FileName,
                                           pCurrentObject->FileId.Cell,
                                           pCurrentObject->FileId.Volume,
                                           pCurrentObject->FileId.Vnode,
                                           pCurrentObject->FileId.Unique,
-                                          pCurrentObject->ParentObjectInformation->FileId.Cell,
-                                          pCurrentObject->ParentObjectInformation->FileId.Volume,
-                                          pCurrentObject->ParentObjectInformation->FileId.Vnode,
-                                          pCurrentObject->ParentObjectInformation->FileId.Unique,
+                                          pCurrentObject->ParentFileId.Cell,
+                                          pCurrentObject->ParentFileId.Volume,
+                                          pCurrentObject->ParentFileId.Vnode,
+                                          pCurrentObject->ParentFileId.Unique,
                                           ntStatus);
                         }
                     }
@@ -293,7 +307,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                     {
                         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_ERROR,
-                                      "AFSLocateNameEntry (FO: %08lX) Failed to evaluate parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                                      "AFSLocateNameEntry (FO: %p) Failed to evaluate parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                                       FileObject,
                                       &pDirEntry->NameInformation.FileName,
                                       pCurrentObject->FileId.Cell,
@@ -366,7 +380,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_VERBOSE,
-                                      "AFSLocateNameEntry (FO: %08lX) Verifying symlink parent %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                                      "AFSLocateNameEntry (FO: %p) Verifying symlink parent %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                                       FileObject,
                                       &pDirEntry->NameInformation.FileName,
                                       pCurrentObject->FileId.Cell,
@@ -388,7 +402,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                           AFS_TRACE_LEVEL_ERROR,
-                                          "AFSLocateNameEntry (FO: %08lX) Failed to verify symlink parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                                          "AFSLocateNameEntry (FO: %p) Failed to verify symlink parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                                           FileObject,
                                           &pDirEntry->NameInformation.FileName,
                                           pCurrentObject->FileId.Cell,
@@ -431,7 +445,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_ERROR,
-                                      "AFSLocateNameEntry (FO: %08lX) Failed to retrieve target name for symlink %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                                      "AFSLocateNameEntry (FO: %p) Failed to retrieve target name for symlink %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                                       FileObject,
                                       &pDirEntry->NameInformation.FileName,
                                       pCurrentObject->FileId.Cell,
@@ -450,7 +464,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_VERBOSE,
-                                      "AFSLocateNameEntry (FO: %08lX) Processing relative symlink target %wZ for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                                      "AFSLocateNameEntry (FO: %p) Processing relative symlink target %wZ for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                                       FileObject,
                                       &pDirEntry->NameInformation.TargetName,
                                       &pDirEntry->NameInformation.FileName,
@@ -614,7 +628,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_VERBOSE,
-                                      "AFSLocateNameEntry (FO: %08lX) Processing absolute symlink target %wZ for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                                      "AFSLocateNameEntry (FO: %p) Processing absolute symlink target %wZ for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                                       FileObject,
                                       &pDirEntry->NameInformation.TargetName,
                                       &pDirEntry->NameInformation.FileName,
@@ -735,7 +749,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                           AFS_TRACE_LEVEL_VERBOSE,
-                                          "AFSLocateNameEntry (FO: %08lX) Current volume not global, resetting for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                                          "AFSLocateNameEntry (FO: %p) Current volume not global, resetting for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                                           FileObject,
                                           &pDirEntry->NameInformation.FileName,
                                           pCurrentObject->FileId.Cell,
@@ -743,22 +757,28 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                                           pCurrentObject->FileId.Vnode,
                                           pCurrentObject->FileId.Unique);
 
-                            lCount = InterlockedDecrement( &pCurrentVolume->VolumeReferenceCount);
+                            lCount = AFSVolumeDecrement( pCurrentVolume,
+                                                         VolumeReferenceReason);
 
                             AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                                           AFS_TRACE_LEVEL_VERBOSE,
-                                          "AFSLocateNameEntry Decrement count on volume %08lX Cnt %d\n",
+                                          "AFSLocateNameEntry Decrement count on volume %p Reason %u Cnt %d\n",
                                           pCurrentVolume,
+                                          VolumeReferenceReason,
                                           lCount);
 
                             pCurrentVolume = AFSGlobalRoot;
 
-                            lCount = InterlockedIncrement( &pCurrentVolume->VolumeReferenceCount);
+                            VolumeReferenceReason = AFS_VOLUME_REFERENCE_LOCATE_NAME;
+
+                            lCount = AFSVolumeIncrement( pCurrentVolume,
+                                                         VolumeReferenceReason);
 
                             AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                                           AFS_TRACE_LEVEL_VERBOSE,
-                                          "AFSLocateNameEntry Increment count on volume %08lX Cnt %d\n",
+                                          "AFSLocateNameEntry Increment count on volume %p Reason %u Cnt %d\n",
                                           pCurrentVolume,
+                                          VolumeReferenceReason,
                                           lCount);
                         }
 
@@ -803,7 +823,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_VERBOSE,
-                                      "AFSLocateNameEntry (FO: %08lX) Resetting name array for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                                      "AFSLocateNameEntry (FO: %p) Resetting name array for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                                       FileObject,
                                       &pDirEntry->NameInformation.FileName,
                                       pCurrentObject->FileId.Cell,
@@ -857,7 +877,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSLocateNameEntry (FO: %08lX) Building MP target for parent %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                                  "AFSLocateNameEntry (FO: %p) Building MP target for parent %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                                   FileObject,
                                   &pDirEntry->NameInformation.FileName,
                                   pCurrentObject->FileId.Cell,
@@ -872,26 +892,16 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                     // Also decrement the ref count on the volume
                     //
 
-                    ASSERT( pCurrentVolume->VolumeReferenceCount > 1);
-
-                    lCount = InterlockedDecrement( &pCurrentVolume->VolumeReferenceCount);
-
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
-                                  AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSLocateNameEntry Decrement2 count on volume %08lX Cnt %d\n",
-                                  pCurrentVolume,
-                                  lCount);
-
                     ntStatus = AFSBuildMountPointTarget( AuthGroup,
                                                          pDirEntry,
-                                                         &pCurrentVolume);
+                                                         &pTargetVolume);
 
                     if( !NT_SUCCESS( ntStatus))
                     {
 
                         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_ERROR,
-                                      "AFSLocateNameEntry (FO: %08lX) Failed to build MP target for parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                                      "AFSLocateNameEntry (FO: %p) Failed to build MP target for parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                                       FileObject,
                                       &pDirEntry->NameInformation.FileName,
                                       pCurrentObject->FileId.Cell,
@@ -900,16 +910,28 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                                       pCurrentObject->FileId.Unique,
                                       ntStatus);
 
-                        //
-                        // We already decremented the current volume above
-                        //
-
-                        bReleaseCurrentVolume = FALSE;
-
                         try_return( ntStatus);
                     }
 
-                    ASSERT( pCurrentVolume->VolumeReferenceCount > 1);
+                    ASSERT( pCurrentVolume->VolumeReferenceCount > 0);
+
+                    lCount = AFSVolumeDecrement( pCurrentVolume,
+                                                 VolumeReferenceReason);
+
+                    AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+                                  AFS_TRACE_LEVEL_VERBOSE,
+                                  "AFSLocateNameEntry Decrement2 count on volume %p Reason %u Cnt %d\n",
+                                  pCurrentVolume,
+                                  VolumeReferenceReason,
+                                  lCount);
+
+                    pCurrentVolume = pTargetVolume;
+
+                    pTargetVolume = NULL;
+
+                    ASSERT( pCurrentVolume->VolumeReferenceCount > 0);
+
+                    VolumeReferenceReason = AFS_VOLUME_REFERENCE_MOUNTPT;
 
                     //
                     // We want to restart processing here on the new parent ...
@@ -1010,7 +1032,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_ERROR,
-                                      "AFSLocateNameEntry (FO: %08lX) Failed to process DFSLink parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                                      "AFSLocateNameEntry (FO: %p) Failed to process DFSLink parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                                       FileObject,
                                       &pDirEntry->NameInformation.FileName,
                                       pCurrentObject->FileId.Cell,
@@ -1046,7 +1068,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSLocateNameEntry (FO: %08lX) Enumerating parent %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                              "AFSLocateNameEntry (FO: %p) Enumerating parent %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                               FileObject,
                               &pDirEntry->NameInformation.FileName,
                               pCurrentObject->FileId.Cell,
@@ -1071,7 +1093,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_ERROR,
-                                      "AFSLocateNameEntry (FO: %08lX) Failed to enumerate parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                                      "AFSLocateNameEntry (FO: %p) Failed to enumerate parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                                       FileObject,
                                       &pDirEntry->NameInformation.FileName,
                                       pCurrentObject->FileId.Cell,
@@ -1096,7 +1118,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_ERROR,
-                                  "AFSLocateNameEntry (FO: %08lX) Encountered file node %wZ FID %08lX-%08lX-%08lX-%08lX in path processing\n",
+                                  "AFSLocateNameEntry (FO: %p) Encountered file node %wZ FID %08lX-%08lX-%08lX-%08lX in path processing\n",
                                   FileObject,
                                   &pDirEntry->NameInformation.FileName,
                                   pCurrentObject->FileId.Cell,
@@ -1118,7 +1140,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSLocateNameEntry (FO: %08lX) Returning file %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                                  "AFSLocateNameEntry (FO: %p) Returning file %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                                   FileObject,
                                   &pDirEntry->NameInformation.FileName,
                                   pCurrentObject->FileId.Cell,
@@ -1151,7 +1173,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSLocateNameEntry (FO: %08lX) Completed processing returning %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                              "AFSLocateNameEntry (FO: %p) Completed processing returning %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                               FileObject,
                               &pDirEntry->NameInformation.FileName,
                               pCurrentObject->FileId.Cell,
@@ -1222,7 +1244,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSLocateNameEntry (FO: %08lX) Backing up entry from %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                              "AFSLocateNameEntry (FO: %p) Backing up entry from %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                               FileObject,
                               &pDirEntry->NameInformation.FileName,
                               pCurrentObject->FileId.Cell,
@@ -1312,7 +1334,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE_2,
-                                  "AFSLocateNameEntry (FO: %08lX) Processing @SYS substitution for %wZ Index %08lX\n",
+                                  "AFSLocateNameEntry (FO: %p) Processing @SYS substitution for %wZ Index %08lX\n",
                                   FileObject,
                                   &uniComponentName,
                                   ulSubstituteIndex);
@@ -1326,7 +1348,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_VERBOSE_2,
-                                      "AFSLocateNameEntry (FO: %08lX) Located substitution %wZ for %wZ Index %08lX\n",
+                                      "AFSLocateNameEntry (FO: %p) Located substitution %wZ for %wZ Index %08lX\n",
                                       FileObject,
                                       &uniSearchName,
                                       &uniComponentName,
@@ -1347,7 +1369,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_ERROR,
-                                      "AFSLocateNameEntry (FO: %08lX) Failed to locate substitute string for %wZ Index %08lX Status %08lX\n",
+                                      "AFSLocateNameEntry (FO: %p) Failed to locate substitute string for %wZ Index %08lX Status %08lX\n",
                                       FileObject,
                                       &uniComponentName,
                                       ulSubstituteIndex,
@@ -1388,7 +1410,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE_2,
-                              "AFSLocateNameEntry (FO: %08lX) Searching for entry %wZ case sensitive\n",
+                              "AFSLocateNameEntry (FO: %p) Searching for entry %wZ case sensitive\n",
                               FileObject,
                               &uniSearchName);
 
@@ -1411,7 +1433,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE_2,
-                                  "AFSLocateNameEntry (FO: %08lX) Searching for entry %wZ case insensitive\n",
+                                  "AFSLocateNameEntry (FO: %p) Searching for entry %wZ case insensitive\n",
                                   FileObject,
                                   &uniSearchName);
 
@@ -1438,7 +1460,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                           AFS_TRACE_LEVEL_VERBOSE_2,
-                                          "AFSLocateNameEntry (FO: %08lX) Searching for entry %wZ short name\n",
+                                          "AFSLocateNameEntry (FO: %p) Searching for entry %wZ short name\n",
                                           FileObject,
                                           &uniSearchName);
 
@@ -1492,6 +1514,16 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                             {
 
                                 ntStatus = STATUS_OBJECT_PATH_NOT_FOUND;
+
+                                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                              AFS_TRACE_LEVEL_VERBOSE,
+                                              "AFSLocateNameEntry (FO: %p) Returning path not found for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                                              FileObject,
+                                              &uniSearchName,
+                                              pCurrentObject->FileId.Cell,
+                                              pCurrentObject->FileId.Volume,
+                                              pCurrentObject->FileId.Vnode,
+                                              pCurrentObject->FileId.Unique);
                             }
                             else
                             {
@@ -1500,7 +1532,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                               AFS_TRACE_LEVEL_VERBOSE,
-                                              "AFSLocateNameEntry (FO: %08lX) Returning name not found for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                                              "AFSLocateNameEntry (FO: %p) Returning name not found for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                                               FileObject,
                                               &uniSearchName,
                                               pCurrentObject->FileId.Cell,
@@ -1585,7 +1617,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_VERBOSE,
-                                      "AFSLocateNameEntry (FO: %08lX) Verifying(2) parent %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                                      "AFSLocateNameEntry (FO: %p) Verifying(2) parent %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                                       FileObject,
                                       &pParentDirEntry->NameInformation.FileName,
                                       pParentDirEntry->ObjectInformation->FileId.Cell,
@@ -1610,7 +1642,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                           AFS_TRACE_LEVEL_ERROR,
-                                          "AFSLocateNameEntry (FO: %08lX) Failed to verify(2) parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                                          "AFSLocateNameEntry (FO: %p) Failed to verify(2) parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                                           FileObject,
                                           &pParentDirEntry->NameInformation.FileName,
                                           pParentDirEntry->ObjectInformation->FileId.Cell,
@@ -1624,7 +1656,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_VERBOSE,
-                                      "AFSLocateNameEntry (FO: %08lX) Reprocessing component %wZ in parent %wZ\n",
+                                      "AFSLocateNameEntry (FO: %p) Reprocessing component %wZ in parent %wZ\n",
                                       FileObject,
                                       &uniSearchName,
                                       &pParentDirEntry->NameInformation.FileName);
@@ -1666,7 +1698,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSLocateNameEntry (FO: %08lX) Deleted entry %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                              "AFSLocateNameEntry (FO: %p) Deleted entry %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                               FileObject,
                               &pDirEntry->NameInformation.FileName,
                               pCurrentObject->FileId.Cell,
@@ -1679,7 +1711,12 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                 // on the entry
                 //
 
-                pParentObjectInfo = pCurrentObject->ParentObjectInformation;
+                if( BooleanFlagOn( pCurrentObject->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+                {
+
+                    pParentObjectInfo = AFSFindObjectInfo( pCurrentObject->VolumeCB,
+                                                           &pCurrentObject->ParentFileId);
+                }
 
                 ASSERT( pParentObjectInfo != NULL);
 
@@ -1706,7 +1743,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING|AFS_SUBSYSTEM_CLEANUP_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSLocateNameEntry Deleting dir entry %08lX (%08lX) for %wZ\n",
+                                  "AFSLocateNameEntry Deleting dir entry %p (%p) for %wZ\n",
                                   pDirEntry,
                                   pCurrentObject,
                                   &pDirEntry->NameInformation.FileName);
@@ -1729,7 +1766,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                             AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
                                           AFS_TRACE_LEVEL_VERBOSE,
-                                          "AFSLocateNameEntry Removing object %08lX from volume tree\n",
+                                          "AFSLocateNameEntry Removing object %p from volume tree\n",
                                           pCurrentObject);
 
                             AFSRemoveHashEntry( &pCurrentObject->VolumeCB->ObjectInfoTree.TreeHead,
@@ -1760,6 +1797,8 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                 AFSReleaseResource( pCurrentObject->VolumeCB->ObjectInfoTree.TreeLock);
 
+                AFSReleaseObjectInfo( &pParentObjectInfo);
+
                 //
                 // We deleted the dir entry so check if there is any remaining portion
                 // of the name to process.
@@ -1767,7 +1806,18 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                 if( uniRemainingPath.Length > 0)
                 {
+
                     ntStatus = STATUS_OBJECT_PATH_NOT_FOUND;
+
+                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                  AFS_TRACE_LEVEL_VERBOSE,
+                                  "AFSLocateNameEntry (FO: %p) Returning path not found(2) for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                                  FileObject,
+                                  &uniComponentName,
+                                  pCurrentObject->FileId.Cell,
+                                  pCurrentObject->FileId.Volume,
+                                  pCurrentObject->FileId.Vnode,
+                                  pCurrentObject->FileId.Unique);
                 }
                 else
                 {
@@ -1776,7 +1826,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSLocateNameEntry (FO: %08lX) Returning name not found(2) for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                                  "AFSLocateNameEntry (FO: %p) Returning name not found(2) for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                                   FileObject,
                                   &uniComponentName,
                                   pCurrentObject->FileId.Cell,
@@ -1838,7 +1888,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE_2,
-                              "AFSLocateNameEntry (FO: %08lX) Substituting %wZ into %wZ Index %08lX\n",
+                              "AFSLocateNameEntry (FO: %p) Substituting %wZ into %wZ Index %08lX\n",
                               FileObject,
                               &uniSearchName,
                               &uniComponentName,
@@ -1870,7 +1920,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_ERROR,
-                                  "AFSLocateNameEntry (FO: %08lX) Failure to substitute %wZ into %wZ Index %08lX Status %08lX\n",
+                                  "AFSLocateNameEntry (FO: %p) Failure to substitute %wZ into %wZ Index %08lX Status %08lX\n",
                                   FileObject,
                                   &uniSearchName,
                                   &uniComponentName,
@@ -1912,7 +1962,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_ERROR,
-                                  "AFSLocateNameEntry (FO: %08lX) Failed to evaluate possible DFS Link %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                                  "AFSLocateNameEntry (FO: %p) Failed to evaluate possible DFS Link %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                                   FileObject,
                                   &pDirEntry->NameInformation.FileName,
                                   pCurrentObject->FileId.Cell,
@@ -1931,7 +1981,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSLocateNameEntry (FO: %08lX) Inserting name array entry %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                          "AFSLocateNameEntry (FO: %p) Inserting name array entry %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                           FileObject,
                           &pDirEntry->NameInformation.FileName,
                           pCurrentObject->FileId.Cell,
@@ -1953,7 +2003,7 @@ try_exit:
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSLocateNameEntry (FO: %08lX) Completed processing %wZ Status %08lX\n",
+                      "AFSLocateNameEntry (FO: %p) Completed processing %wZ Status %08lX\n",
                       FileObject,
                       RootPathName,
                       ntStatus);
@@ -1997,15 +2047,19 @@ try_exit:
             if( bReleaseCurrentVolume)
             {
 
-                ASSERT( pCurrentVolume->VolumeReferenceCount > 1);
+                ASSERT( pCurrentVolume->VolumeReferenceCount > 0);
 
-                lCount = InterlockedDecrement( &pCurrentVolume->VolumeReferenceCount);
+                lCount = AFSVolumeDecrement( pCurrentVolume,
+                                             VolumeReferenceReason);
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSLocateNameEntry Decrement3 count on volume %08lX Cnt %d\n",
+                              "AFSLocateNameEntry Decrement3 count on volume %p Reason %u Cnt %d\n",
                               pCurrentVolume,
+                              VolumeReferenceReason,
                               lCount);
+
+                bReleaseCurrentVolume = FALSE;
             }
 
             if( RootPathName->Buffer != uniFullPathName.Buffer)
@@ -2048,6 +2102,11 @@ try_exit:
 
             AFSExFreePoolWithTag( uniSearchName.Buffer, 0);
         }
+
+        if ( bReleaseCurrentVolume) {
+
+            *pVolumeReferenceReason = VolumeReferenceReason;
+        }
     }
 
     return ntStatus;
@@ -2127,6 +2186,11 @@ AFSCreateDirEntry( IN GUID            *AuthGroup,
             try_return( ntStatus);
         }
 
+        //
+        // If AFSNotifyFileCreate returns pDirNode != NULL, then its
+        // DirOpenReferenceCount is held.
+        //
+
         AFSAcquireExcl( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
                         TRUE);
 
@@ -2182,19 +2246,32 @@ AFSCreateDirEntry( IN GUID            *AuthGroup,
                                &pExistingDirNode->ObjectInformation->FileId))
             {
 
-                AFSDeleteDirEntry( ParentObjectInfo,
-                                   pDirNode);
+                if ( pExistingDirNode != pDirNode)
+                {
 
-                lCount = InterlockedIncrement( &pExistingDirNode->DirOpenReferenceCount);
+                    lCount = InterlockedDecrement( &pDirNode->DirOpenReferenceCount);
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                              AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCreateDirEntry Increment count on %wZ DE %p Cnt %d\n",
-                              &pExistingDirNode->NameInformation.FileName,
-                              pExistingDirNode,
-                              lCount);
+                    AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                                  AFS_TRACE_LEVEL_VERBOSE,
+                                  "AFSCreateDirEntry Decrement count on %wZ DE %p Cnt %d\n",
+                                  &pDirNode->NameInformation.FileName,
+                                  pDirNode,
+                                  lCount);
+
+                    AFSDeleteDirEntry( ParentObjectInfo,
+                                       pDirNode);
 
-                *DirEntry = pExistingDirNode;
+                    lCount = InterlockedIncrement( &pExistingDirNode->DirOpenReferenceCount);
+
+                    AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                                  AFS_TRACE_LEVEL_VERBOSE,
+                                  "AFSCreateDirEntry Increment count on %wZ DE %p Cnt %d\n",
+                                  &pExistingDirNode->NameInformation.FileName,
+                                  pExistingDirNode,
+                                  lCount);
+
+                    *DirEntry = pExistingDirNode;
+                }
 
                 AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
 
@@ -2249,7 +2326,6 @@ AFSCreateDirEntry( IN GUID            *AuthGroup,
                     AFSRemoveNameEntry( ParentObjectInfo,
                                         pExistingDirNode);
                 }
-
             }
         }
 
@@ -2271,15 +2347,6 @@ AFSCreateDirEntry( IN GUID            *AuthGroup,
                                 pDirNode,
                                 TRUE);
 
-        lCount = InterlockedIncrement( &pDirNode->DirOpenReferenceCount);
-
-        AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSCreateDirEntry Increment2 count on %wZ DE %p Cnt %d\n",
-                      &pDirNode->NameInformation.FileName,
-                      pDirNode,
-                      lCount);
-
         //
         // Pass back the dir entry
         //
@@ -2425,7 +2492,7 @@ AFSInsertDirectoryNode( IN AFSObjectInfoCB *ParentObjectInfo,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSInsertDirectoryNode Inserting entry %08lX %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                          "AFSInsertDirectoryNode Inserting entry %p %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                           DirEntry,
                           &DirEntry->NameInformation.FileName,
                           DirEntry->ObjectInformation->FileId.Cell,
@@ -2467,12 +2534,11 @@ AFSInsertDirectoryNode( IN AFSObjectInfoCB *ParentObjectInfo,
     return;
 }
 
-NTSTATUS
+void
 AFSDeleteDirEntry( IN AFSObjectInfoCB *ParentObjectInfo,
                    IN AFSDirectoryCB *DirEntry)
 {
 
-    NTSTATUS ntStatus = STATUS_SUCCESS;
     LONG lCount;
 
     __Enter
@@ -2480,7 +2546,7 @@ AFSDeleteDirEntry( IN AFSObjectInfoCB *ParentObjectInfo,
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING | AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSDeleteDirEntry Deleting dir entry in parent %08lX Entry %08lX %wZ FID %08lX-%08lX-%08lX-%08lX RefCount %08lX\n",
+                      "AFSDeleteDirEntry Deleting dir entry in parent %p Entry %p %wZ FID %08lX-%08lX-%08lX-%08lX RefCount %d\n",
                       ParentObjectInfo,
                       DirEntry,
                       &DirEntry->NameInformation.FileName,
@@ -2516,13 +2582,12 @@ 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,
-                      "AFSDeleteDirEntry Decrement count on object %08lX Cnt %d\n",
+                      "AFSDeleteDirEntry Decrement count on object %p Cnt %d\n",
                       DirEntry->ObjectInformation,
                       lCount);
 
@@ -2541,10 +2606,13 @@ AFSDeleteDirEntry( IN AFSObjectInfoCB *ParentObjectInfo,
         // Free up the dir entry
         //
 
+        AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSDeleteDirEntry AFS_DIR_ENTRY_TAG deallocating %p\n",
+                      DirEntry);
+
         AFSExFreePoolWithTag( DirEntry, AFS_DIR_ENTRY_TAG);
     }
-
-    return ntStatus;
 }
 
 NTSTATUS
@@ -2564,7 +2632,7 @@ AFSRemoveDirNodeFromParent( IN AFSObjectInfoCB *ParentObjectInfo,
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSRemoveDirNodeFromParent Removing DirEntry %08lX %wZ FID %08lX-%08lX-%08lX-%08lX from Parent %08lX\n",
+                      "AFSRemoveDirNodeFromParent Removing DirEntry %p %wZ FID %08lX-%08lX-%08lX-%08lX from Parent %p\n",
                       DirEntry,
                       &DirEntry->NameInformation.FileName,
                       DirEntry->ObjectInformation->FileId.Cell,
@@ -2578,7 +2646,7 @@ AFSRemoveDirNodeFromParent( IN AFSObjectInfoCB *ParentObjectInfo,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSRemoveDirNodeFromParent Removing DirEntry %08lX name %wZ\n",
+                          "AFSRemoveDirNodeFromParent Removing DirEntry %p name %wZ\n",
                           DirEntry,
                           &DirEntry->NameInformation.FileName);
 
@@ -2766,6 +2834,8 @@ AFSParseName( IN PIRP Irp,
 
         *ParseFlags = AFS_PARSE_FLAG_ROOT_ACCESS;
 
+        *ParentDirectoryCB = NULL;
+
         if( pIrpSp->FileObject->RelatedFileObject != NULL)
         {
 
@@ -2785,7 +2855,7 @@ AFSParseName( IN PIRP Irp,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE_2,
-                          "AFSParseName (%08lX) Relative open for %wZ FID %08lX-%08lX-%08lX-%08lX component %wZ\n",
+                          "AFSParseName (%p) Relative open for %wZ FID %08lX-%08lX-%08lX-%08lX component %wZ\n",
                           Irp,
                           &pRelatedCcb->DirectoryCB->NameInformation.FileName,
                           pRelatedCcb->DirectoryCB->ObjectInformation->FileId.Cell,
@@ -2799,7 +2869,7 @@ AFSParseName( IN PIRP Irp,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSParseName (%08lX) Component %wZ contains wild cards\n",
+                              "AFSParseName (%p) Component %wZ contains wild cards\n",
                               Irp,
                               &uniFullName);
 
@@ -2829,7 +2899,7 @@ AFSParseName( IN PIRP Irp,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSParseName (%08lX) Volume %08lX:%08lX OFFLINE/INVALID\n",
+                              "AFSParseName (%p) Volume %08lX:%08lX OFFLINE/INVALID\n",
                               Irp,
                               pVolumeCB->ObjectInformation.FileId.Cell,
                               pVolumeCB->ObjectInformation.FileId.Volume);
@@ -2844,7 +2914,7 @@ AFSParseName( IN PIRP Irp,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSParseName (%08lX) Verifying root of volume %08lX:%08lX\n",
+                              "AFSParseName (%p) Verifying root of volume %08lX:%08lX\n",
                               Irp,
                               pVolumeCB->ObjectInformation.FileId.Cell,
                               pVolumeCB->ObjectInformation.FileId.Volume);
@@ -2857,7 +2927,7 @@ AFSParseName( IN PIRP Irp,
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_ERROR,
-                                  "AFSParseName (%08lX) Failed verification of root Status %08lX\n",
+                                  "AFSParseName (%p) Failed verification of root Status %08lX\n",
                                   Irp,
                                   ntStatus);
 
@@ -2874,7 +2944,7 @@ AFSParseName( IN PIRP Irp,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSParseName (%08lX) Verifying parent %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                              "AFSParseName (%p) Verifying parent %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                               Irp,
                               &pDirEntry->NameInformation.FileName,
                               pDirEntry->ObjectInformation->FileId.Cell,
@@ -2899,7 +2969,7 @@ AFSParseName( IN PIRP Irp,
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSParseName (%08lX) Failed verification of parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                                  "AFSParseName (%p) Failed verification of parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                                   Irp,
                                   &pDirEntry->NameInformation.FileName,
                                   pDirEntry->ObjectInformation->FileId.Cell,
@@ -2932,7 +3002,7 @@ AFSParseName( IN PIRP Irp,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSParseName (%08lX) Failed to allocate full name buffer\n",
+                              "AFSParseName (%p) Failed to allocate full name buffer\n",
                               Irp);
 
                 try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
@@ -2969,7 +3039,7 @@ AFSParseName( IN PIRP Irp,
 
                 RtlCopyMemory( &uniFullName.Buffer[ uniFullName.Length/sizeof( WCHAR)],
                                pIrpSp->FileObject->FileName.Buffer,
-                               pIr\epSp->FileObject->FileName.Length);
+                               pIrpSp->FileObject->FileName.Length);
 
                 uniFullName.Length += pIrpSp->FileObject->FileName.Length;
             }
@@ -2995,7 +3065,7 @@ AFSParseName( IN PIRP Irp,
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSParseName (%08lX) Failed to initialize name array\n",
+                                  "AFSParseName (%p) Failed to initialize name array\n",
                                   Irp);
 
                     AFSExFreePoolWithTag( uniFullName.Buffer, 0);
@@ -3022,7 +3092,7 @@ AFSParseName( IN PIRP Irp,
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSParseName (%08lX) Failed to initialize name array\n",
+                                  "AFSParseName (%p) Failed to initialize name array\n",
                                   Irp);
 
                     AFSExFreePoolWithTag( uniFullName.Buffer, 0);
@@ -3040,7 +3110,7 @@ AFSParseName( IN PIRP Irp,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSParseName (%08lX) Failed to populate name array\n",
+                              "AFSParseName (%p) Failed to populate name array\n",
                               Irp);
 
                 AFSExFreePoolWithTag( uniFullName.Buffer, 0);
@@ -3061,35 +3131,26 @@ AFSParseName( IN PIRP Irp,
 
             *NameArray = pNameArray;
 
-            *VolumeCB = pVolumeCB;
-
             //
             // Increment our volume reference count
             //
 
-            lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+            lCount = AFSVolumeIncrement( pVolumeCB,
+                                         AFS_VOLUME_REFERENCE_PARSE_NAME);
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSParseName Increment count on volume %08lX Cnt %d\n",
+                          "AFSParseName Increment count on volume %p Cnt %d\n",
                           pVolumeCB,
                           lCount);
 
-            *ParentDirectoryCB = pDirEntry;
-
-            lCount = InterlockedIncrement( &pDirEntry->DirOpenReferenceCount);
+            *VolumeCB = pVolumeCB;
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSParseName Increment1 count on %wZ DE %p Ccb %p Cnt %d\n",
-                          &pDirEntry->NameInformation.FileName,
-                          pDirEntry,
-                          NULL,
-                          lCount);
+            *ParentDirectoryCB = pDirEntry;
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE_2,
-                          "AFSParseName (%08lX) Returning full name %wZ\n",
+                          "AFSParseName (%p) Returning full name %wZ\n",
                           Irp,
                           &uniFullName);
 
@@ -3108,7 +3169,7 @@ AFSParseName( IN PIRP Irp,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSParseName (%08lX) Name %wZ contains wild cards or too short\n",
+                          "AFSParseName (%p) Name %wZ contains wild cards or too short\n",
                           Irp,
                           &uniFullName);
 
@@ -3181,7 +3242,7 @@ AFSParseName( IN PIRP Irp,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSParseName (%08lX) Name %wZ does not have server name\n",
+                              "AFSParseName (%p) Name %wZ does not have server name\n",
                               Irp,
                               &pIrpSp->FileObject->FileName);
 
@@ -3198,7 +3259,7 @@ AFSParseName( IN PIRP Irp,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSParseName (%08lX) Name %wZ contains invalid drive mapping\n",
+                              "AFSParseName (%p) Name %wZ contains invalid drive mapping\n",
                               Irp,
                               &pIrpSp->FileObject->FileName);
 
@@ -3211,7 +3272,7 @@ AFSParseName( IN PIRP Irp,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSParseName (%08lX) Component %wZ contains wild cards\n",
+                          "AFSParseName (%p) Component %wZ contains wild cards\n",
                           Irp,
                           &uniFullName);
 
@@ -3220,7 +3281,7 @@ AFSParseName( IN PIRP Irp,
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE_2,
-                      "AFSParseName (%08lX) Processing full name %wZ\n",
+                      "AFSParseName (%p) Processing full name %wZ\n",
                       Irp,
                       &uniFullName);
 
@@ -3248,7 +3309,7 @@ AFSParseName( IN PIRP Irp,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSParseName (%08lX) Volume %08lX:%08lX OFFLINE/INVALID\n",
+                          "AFSParseName (%p) Volume %08lX:%08lX OFFLINE/INVALID\n",
                           Irp,
                           AFSGlobalRoot->ObjectInformation.FileId.Cell,
                           AFSGlobalRoot->ObjectInformation.FileId.Volume);
@@ -3263,7 +3324,7 @@ AFSParseName( IN PIRP Irp,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSParseName (%08lX) Verifying root of volume %08lX:%08lX\n",
+                          "AFSParseName (%p) Verifying root of volume %08lX:%08lX\n",
                           Irp,
                           AFSGlobalRoot->ObjectInformation.FileId.Cell,
                           AFSGlobalRoot->ObjectInformation.FileId.Volume);
@@ -3276,7 +3337,7 @@ AFSParseName( IN PIRP Irp,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSParseName (%08lX) Failed verification of root Status %08lX\n",
+                              "AFSParseName (%p) Failed verification of root Status %08lX\n",
                               Irp,
                               ntStatus);
 
@@ -3293,7 +3354,7 @@ AFSParseName( IN PIRP Irp,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSParseName (%08lX) Enumerating global root of volume %08lX:%08lX\n",
+                          "AFSParseName (%p) Enumerating global root of volume %08lX:%08lX\n",
                           Irp,
                           AFSGlobalRoot->ObjectInformation.FileId.Cell,
                           AFSGlobalRoot->ObjectInformation.FileId.Volume);
@@ -3305,7 +3366,7 @@ AFSParseName( IN PIRP Irp,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSParseName (%08lX) Failed enumeraiton of root Status %08lX\n",
+                              "AFSParseName (%p) Failed enumeraiton of root Status %08lX\n",
                               Irp,
                               ntStatus);
 
@@ -3314,7 +3375,7 @@ AFSParseName( IN PIRP Irp,
         }
 
         //
-        // Check for the \\Server access and return it as though it where \\Server\Globalroot
+        // Check for the \\Server access and return it as though it were \\Server\Globalroot
         //
 
         if( uniRemainingPath.Buffer == NULL ||
@@ -3324,7 +3385,7 @@ AFSParseName( IN PIRP Irp,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE_2,
-                          "AFSParseName (%08lX) Returning global root access\n",
+                          "AFSParseName (%p) Returning global root access\n",
                           Irp);
 
             lCount = InterlockedIncrement( &AFSGlobalRoot->DirectoryCB->DirOpenReferenceCount);
@@ -3372,7 +3433,7 @@ AFSParseName( IN PIRP Irp,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSParseName (%08lX) Component %wZ contains wild cards\n",
+                          "AFSParseName (%p) Component %wZ contains wild cards\n",
                           Irp,
                           &uniComponentName);
 
@@ -3403,7 +3464,7 @@ AFSParseName( IN PIRP Irp,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE_2,
-                              "AFSParseName (%08lX) Returning global root access\n",
+                              "AFSParseName (%p) Returning global root access\n",
                               Irp);
 
                 lCount = InterlockedIncrement( &AFSGlobalRoot->DirectoryCB->DirOpenReferenceCount);
@@ -3446,7 +3507,7 @@ AFSParseName( IN PIRP Irp,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE_2,
-                              "AFSParseName (%08lX) Returning root PIOCtl access\n",
+                              "AFSParseName (%p) Returning root PIOCtl access\n",
                               Irp);
 
                 lCount = InterlockedIncrement( &AFSGlobalRoot->DirectoryCB->DirOpenReferenceCount);
@@ -3474,7 +3535,7 @@ AFSParseName( IN PIRP Irp,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE_2,
-                          "AFSParseName (%08lX) Returning root share name %wZ access\n",
+                          "AFSParseName (%p) Returning root share name %wZ access\n",
                           Irp,
                           &uniComponentName);
 
@@ -3508,19 +3569,9 @@ AFSParseName( IN PIRP Irp,
 
             *FileName = uniComponentName;
 
-            *ParentDirectoryCB = pDirEntry;
-
             ClearFlag( *ParseFlags, AFS_PARSE_FLAG_ROOT_ACCESS);
 
-            lCount = InterlockedIncrement( &pDirEntry->DirOpenReferenceCount);
-
-            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSParseName Increment5 count on %wZ DE %p Ccb %p Cnt %d\n",
-                          &pDirEntry->NameInformation.FileName,
-                          pDirEntry,
-                          NULL,
-                          lCount);
+            *ParentDirectoryCB = pDirEntry;
 
             try_return( ntStatus = STATUS_SUCCESS);
         }
@@ -3593,6 +3644,13 @@ AFSParseName( IN PIRP Irp,
                              ntStatus == STATUS_OBJECT_PATH_NOT_FOUND)
                         {
 
+                            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                          AFS_TRACE_LEVEL_VERBOSE,
+                                          "AFSParseName (%p) AFSCheckCellName %wZ returned path not found; ntStatus %08X\n",
+                                          Irp,
+                                          &uniComponentName,
+                                          STATUS_OBJECT_NAME_NOT_FOUND);
+
                             ntStatus = STATUS_OBJECT_NAME_NOT_FOUND;
                         }
 
@@ -3634,7 +3692,7 @@ AFSParseName( IN PIRP Irp,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSParseName (%08lX) Failed to initialize name array\n",
+                              "AFSParseName (%p) Failed to initialize name array\n",
                               Irp);
 
                 try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
@@ -3648,7 +3706,7 @@ AFSParseName( IN PIRP Irp,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSParseName (%08lX) Failed to insert name array element\n",
+                              "AFSParseName (%p) Failed to insert name array element\n",
                               Irp);
 
                 try_return( ntStatus);
@@ -3694,8 +3752,6 @@ AFSParseName( IN PIRP Irp,
                 //
                 // This is a root open so pass back no parent
                 //
-
-                *ParentDirectoryCB = NULL;
             }
         }
         else
@@ -3714,7 +3770,7 @@ AFSParseName( IN PIRP Irp,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSParseName (%08lX) Failed to initialize name array\n",
+                              "AFSParseName (%p) Failed to initialize name array\n",
                               Irp);
 
                 try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
@@ -3763,22 +3819,11 @@ AFSParseName( IN PIRP Irp,
             uniRemainingPath.Length += sizeof( WCHAR);
             uniRemainingPath.MaximumLength += sizeof( WCHAR);
 
-            lCount = InterlockedIncrement( &pVolumeCB->DirectoryCB->DirOpenReferenceCount);
-
-            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSParseName Increment6 count on %wZ DE %p Ccb %p Cnt %d\n",
-                          &pVolumeCB->DirectoryCB->NameInformation.FileName,
-                          pVolumeCB->DirectoryCB,
-                          NULL,
-                          lCount);
-
             //
             // Pass back the parent being the volume root
             //
 
             *ParentDirectoryCB = pVolumeCB->DirectoryCB;
-
         }
 
         //
@@ -3797,11 +3842,12 @@ AFSParseName( IN PIRP Irp,
         // Increment our reference on the volume
         //
 
-        lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+        lCount = AFSVolumeIncrement( pVolumeCB,
+                                     AFS_VOLUME_REFERENCE_PARSE_NAME);
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSParseName Increment2 count on global volume %08lX Cnt %d\n",
+                      "AFSParseName Increment2 count on global volume %p Cnt %d\n",
                       pVolumeCB,
                       lCount);
 
@@ -3813,19 +3859,21 @@ try_exit:
             if( *ParentDirectoryCB != NULL)
             {
 
+                lCount = InterlockedIncrement( &(*ParentDirectoryCB)->DirOpenReferenceCount);
+
                 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSParseName Count on %wZ DE %p Ccb %p Cnt %d\n",
+                              "AFSParseName Increment1 count on %wZ DE %p Ccb %p Cnt %d\n",
                               &(*ParentDirectoryCB)->NameInformation.FileName,
-                              *ParentDirectoryCB,
+                              (*ParentDirectoryCB),
                               NULL,
-                              (*ParentDirectoryCB)->DirOpenReferenceCount);
+                              lCount);
             }
         }
 
         if( *VolumeCB != NULL)
         {
-            ASSERT( (*VolumeCB)->VolumeReferenceCount > 1);
+            ASSERT( (*VolumeCB)->VolumeReferenceCount > 0);
         }
 
         if( ntStatus != STATUS_SUCCESS)
@@ -3959,6 +4007,10 @@ AFSCheckCellName( IN GUID *AuthGroup,
                                            &pDirEnumEntry->FileId,
                                            &pVolumeCB);
 
+            //
+            // On success returns with a volume reference count held
+            //
+
             if( !NT_SUCCESS( ntStatus))
             {
                 try_return( ntStatus);
@@ -3976,11 +4028,12 @@ AFSCheckCellName( IN GUID *AuthGroup,
                           NULL,
                           lCount);
 
-            lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+            lCount = AFSVolumeDecrement( pVolumeCB,
+                                         AFS_VOLUME_REFERENCE_BUILD_ROOT);
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSCheckCellName Increment count on volume %08lX Cnt %d\n",
+                          "AFSCheckCellName Decrement count on volume %p Cnt %d\n",
                           pVolumeCB,
                           lCount);
         }
@@ -4237,7 +4290,7 @@ AFSBuildMountPointTarget( IN GUID *AuthGroup,
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSBuildMountPointTarget Acquiring RDR VolumeTreeLock lock %08lX EXCL %08lX\n",
+                      "AFSBuildMountPointTarget Acquiring RDR VolumeTreeLock lock %p EXCL %08lX\n",
                       &pDevExt->Specific.RDR.VolumeTreeLock,
                       PsGetCurrentThread());
 
@@ -4282,6 +4335,7 @@ AFSBuildMountPointTarget( IN GUID *AuthGroup,
 
             ntStatus = AFSInitVolume( AuthGroup,
                                       &stTargetFileID,
+                                      AFS_VOLUME_REFERENCE_MOUNTPT,
                                       &pVolumeCB);
 
             if( !NT_SUCCESS( ntStatus))
@@ -4306,11 +4360,12 @@ AFSBuildMountPointTarget( IN GUID *AuthGroup,
             // obtain one to match
             //
 
-            lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+            lCount = AFSVolumeIncrement( pVolumeCB,
+                                         AFS_VOLUME_REFERENCE_MOUNTPT);
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSBuildMountPointTarget Increment count on volume %08lX Cnt %d\n",
+                          "AFSBuildMountPointTarget Increment count on volume %p Cnt %d\n",
                           pVolumeCB,
                           lCount);
 
@@ -4339,11 +4394,12 @@ AFSBuildMountPointTarget( IN GUID *AuthGroup,
             if( !NT_SUCCESS( ntStatus))
             {
 
-                lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+                lCount = AFSVolumeDecrement( pVolumeCB,
+                                             AFS_VOLUME_REFERENCE_MOUNTPT);
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSBuildMountPoint Decrement count on volume %08lX Cnt %d\n",
+                              "AFSBuildMountPoint Decrement count on volume %p Cnt %d\n",
                               pVolumeCB,
                               lCount);
 
@@ -4416,7 +4472,7 @@ AFSBuildRootVolume( IN GUID *AuthGroup,
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSBuildRootVolume Acquiring RDR VolumeTreeLock lock %08lX EXCL %08lX\n",
+                      "AFSBuildRootVolume Acquiring RDR VolumeTreeLock lock %p EXCL %08lX\n",
                       &pDevExt->Specific.RDR.VolumeTreeLock,
                       PsGetCurrentThread());
 
@@ -4460,6 +4516,7 @@ AFSBuildRootVolume( IN GUID *AuthGroup,
 
             ntStatus = AFSInitVolume( AuthGroup,
                                       FileId,
+                                      AFS_VOLUME_REFERENCE_BUILD_ROOT,
                                       &pVolumeCB);
 
             if( !NT_SUCCESS( ntStatus))
@@ -4484,11 +4541,12 @@ AFSBuildRootVolume( IN GUID *AuthGroup,
             // obtain one to match
             //
 
-            lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+            lCount = AFSVolumeIncrement( pVolumeCB,
+                                         AFS_VOLUME_REFERENCE_BUILD_ROOT);
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSBuildRootVolume Increment count on volume %08lX Cnt %d\n",
+                          "AFSBuildRootVolume Increment count on volume %p Cnt %d\n",
                           pVolumeCB,
                           lCount);
 
@@ -4518,11 +4576,12 @@ AFSBuildRootVolume( IN GUID *AuthGroup,
             if( !NT_SUCCESS( ntStatus))
             {
 
-                lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+                lCount = AFSVolumeDecrement( pVolumeCB,
+                                             AFS_VOLUME_REFERENCE_BUILD_ROOT);
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSBuildRootVolume Decrement count on volume %08lX Cnt %d\n",
+                              "AFSBuildRootVolume Decrement count on volume %p Cnt %d\n",
                               pVolumeCB,
                               lCount);