Windows: AFSRetrieveParentPath handle no parent
[openafs.git] / src / WINNT / afsrdr / kernel / lib / AFSGeneric.cpp
index 5a1b9c3..2594416 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kernel Drivers, LLC.
- * Copyright (c) 2009, 2010, 2011 Your File System, Inc.
+ * Copyright (c) 2009, 2010, 2011, 2012, 2013 Your File System, Inc.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * - Redistributions of source code must retain the above copyright notice,
  *   this list of conditions and the following disclaimer.
  * - Redistributions in binary form must reproduce the above copyright
- *   notice,
- *   this list of conditions and the following disclaimer in the
- *   documentation
- *   and/or other materials provided with the distribution.
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
  * - Neither the names of Kernel Drivers, LLC and Your File System, Inc.
  *   nor the names of their contributors may be used to endorse or promote
  *   products derived from this software without specific prior written
@@ -67,7 +65,7 @@ AFSExceptionFilter( IN CHAR *FunctionString,
 
         Context = ExceptPtrs->ContextRecord;
 
-        AFSDbgLogMsg( 0,
+        AFSDbgTrace(( 0,
                       0,
                       "AFSExceptionFilter (Library) - EXR %p CXR %p Function %s Code %08lX Address %p Routine %p\n",
                       ExceptRec,
@@ -75,7 +73,7 @@ AFSExceptionFilter( IN CHAR *FunctionString,
                       FunctionString,
                       ExceptRec->ExceptionCode,
                       ExceptRec->ExceptionAddress,
-                      (void *)AFSExceptionFilter);
+                      (void *)AFSExceptionFilter));
 
         DbgPrint("**** Exception Caught in AFS Redirector Library ****\n");
 
@@ -148,13 +146,13 @@ AFSLibExAllocatePoolWithTag( IN POOL_TYPE  PoolType,
         else
         {
 
-            AFSDbgLogMsg( 0,
+            AFSDbgTrace(( 0,
                           0,
                           "AFSLibExAllocatePoolWithTag failure Type %08lX Size %08lX Tag %08lX %08lX\n",
                           PoolType,
                           NumberOfBytes,
                           Tag,
-                          PsGetCurrentThread());
+                          PsGetCurrentThread()));
 
             AFSBreakPoint();
         }
@@ -273,11 +271,11 @@ void
 AFSReleaseResource( IN PERESOURCE Resource)
 {
 
-    AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+    AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                   AFS_TRACE_LEVEL_VERBOSE,
                   "AFSReleaseResource Releasing lock %p Thread %08lX\n",
                   Resource,
-                  PsGetCurrentThread());
+                  PsGetCurrentThread()));
 
     ExReleaseResourceLite( Resource);
 
@@ -290,11 +288,11 @@ void
 AFSConvertToShared( IN PERESOURCE Resource)
 {
 
-    AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+    AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                   AFS_TRACE_LEVEL_VERBOSE,
                   "AFSConvertToShared Converting lock %p Thread %08lX\n",
                   Resource,
-                  PsGetCurrentThread());
+                  PsGetCurrentThread()));
 
     ExConvertExclusiveToSharedLite( Resource);
 
@@ -662,10 +660,10 @@ AFSInitializeGlobalDirectoryEntries()
         if( pObjectInfoCB == NULL)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSInitializeGlobalDirectory AFSAllocateObjectInfo failure %08lX\n",
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
@@ -673,11 +671,11 @@ AFSInitializeGlobalDirectoryEntries()
         lCount = AFSObjectInfoIncrement( pObjectInfoCB,
                                          AFS_OBJECT_REFERENCE_GLOBAL);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSInitializeGlobalDirectoryEntries Increment count on object %p Cnt %d\n",
                       pObjectInfoCB,
-                      lCount);
+                      lCount));
 
         ntStatus = STATUS_SUCCESS;
 
@@ -691,19 +689,32 @@ AFSInitializeGlobalDirectoryEntries()
         if( pDirNode == NULL)
         {
 
-            AFSDeleteObjectInfo( &pObjectInfoCB);
+            lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+                                             AFS_OBJECT_REFERENCE_GLOBAL);
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSInitializeGlobalDirectoryEntries Decrement count on object %p Cnt %d\n",
+                          pObjectInfoCB,
+                          lCount));
+
+            if ( lCount == 0)
+            {
+
+                AFSDeleteObjectInfo( &pObjectInfoCB);
+            }
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING | AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+            AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING | AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSInitializeGlobalDirectory AFS_DIR_ENTRY_TAG allocation failure\n");
+                          "AFSInitializeGlobalDirectory AFS_DIR_ENTRY_TAG allocation failure\n"));
 
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+        AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSInitializeGlobalDirectory AFS_DIR_ENTRY_TAG allocated %p\n",
-                      pDirNode);
+                      pDirNode));
 
         pNonPagedDirEntry = (AFSNonPagedDirectoryCB *)AFSLibExAllocatePoolWithTag( NonPagedPool,
                                                                                    sizeof( AFSNonPagedDirectoryCB),
@@ -712,13 +723,27 @@ AFSInitializeGlobalDirectoryEntries()
         if( pNonPagedDirEntry == NULL)
         {
 
-            ExFreePool( pDirNode);
+           AFSLibExFreePoolWithTag( pDirNode,
+                                    AFS_DIR_ENTRY_TAG);
+
+            lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+                                             AFS_OBJECT_REFERENCE_GLOBAL);
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSInitializeGlobalDirectoryEntries Decrement count on object %p Cnt %d\n",
+                          pObjectInfoCB,
+                          lCount));
+
+            if ( lCount == 0)
+            {
 
-            AFSDeleteObjectInfo( &pObjectInfoCB);
+                AFSDeleteObjectInfo( &pObjectInfoCB);
+            }
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSInitializeGlobalDirectory AFS_DIR_ENTRY_NP_TAG allocation failure\n");
+                          "AFSInitializeGlobalDirectory AFS_DIR_ENTRY_NP_TAG allocation failure\n"));
 
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
@@ -775,10 +800,10 @@ AFSInitializeGlobalDirectoryEntries()
         if( pObjectInfoCB == NULL)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSInitializeGlobalDirectory AFSAllocateObjectInfo (2) failure %08lX\n",
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
@@ -786,11 +811,11 @@ AFSInitializeGlobalDirectoryEntries()
         lCount = AFSObjectInfoIncrement( pObjectInfoCB,
                                          AFS_OBJECT_REFERENCE_GLOBAL);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSInitializeGlobalDirectoryEntries Increment count on object %p Cnt %d\n",
                       pObjectInfoCB,
-                      lCount);
+                      lCount));
 
         ntStatus = STATUS_SUCCESS;
 
@@ -804,19 +829,32 @@ AFSInitializeGlobalDirectoryEntries()
         if( pDirNode == NULL)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING | AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+            AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING | AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSInitializeGlobalDirectoryEntries AFS_DIR_ENTRY_TAG allocation failure\n");
+                          "AFSInitializeGlobalDirectoryEntries AFS_DIR_ENTRY_TAG allocation failure\n"));
+
+            lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+                                             AFS_OBJECT_REFERENCE_GLOBAL);
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSInitializeGlobalDirectoryEntries Decrement count on object %p Cnt %d\n",
+                          pObjectInfoCB,
+                          lCount));
+
+            if ( lCount == 0)
+            {
 
-            AFSDeleteObjectInfo( &pObjectInfoCB);
+                AFSDeleteObjectInfo( &pObjectInfoCB);
+            }
 
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+        AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSInitializeGlobalDirectoryEntries AFS_DIR_ENTRY_TAG allocated %p\n",
-                      pDirNode);
+                      pDirNode));
 
         pNonPagedDirEntry = (AFSNonPagedDirectoryCB *)AFSLibExAllocatePoolWithTag( NonPagedPool,
                                                                                    sizeof( AFSNonPagedDirectoryCB),
@@ -825,9 +863,23 @@ AFSInitializeGlobalDirectoryEntries()
         if( pNonPagedDirEntry == NULL)
         {
 
-            ExFreePool( pDirNode);
+           AFSLibExFreePoolWithTag( pDirNode,
+                                    AFS_DIR_ENTRY_TAG);
+
+            lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+                                             AFS_OBJECT_REFERENCE_GLOBAL);
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSInitializeGlobalDirectoryEntries Decrement count on object %p Cnt %d\n",
+                          pObjectInfoCB,
+                          lCount));
+
+            if ( lCount == 0)
+            {
 
-            AFSDeleteObjectInfo( &pObjectInfoCB);
+                AFSDeleteObjectInfo( &pObjectInfoCB);
+            }
 
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
@@ -884,13 +936,28 @@ try_exit:
             if( AFSGlobalDotDirEntry != NULL)
             {
 
-                AFSDeleteObjectInfo( &AFSGlobalDotDirEntry->ObjectInformation);
+                lCount = AFSObjectInfoDecrement( AFSGlobalDotDirEntry->ObjectInformation,
+                                                 AFS_OBJECT_REFERENCE_GLOBAL);
+
+                AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSInitializeGlobalDirectoryEntries Decrement count on object %p Cnt %d\n",
+                              AFSGlobalDotDirEntry->ObjectInformation,
+                              lCount));
+
+                if ( lCount == 0)
+                {
+
+                    AFSDeleteObjectInfo( &AFSGlobalDotDirEntry->ObjectInformation);
+                }
 
                 ExDeleteResourceLite( &AFSGlobalDotDirEntry->NonPaged->Lock);
 
-                ExFreePool( AFSGlobalDotDirEntry->NonPaged);
+               AFSLibExFreePoolWithTag( AFSGlobalDotDirEntry->NonPaged,
+                                        AFS_DIR_ENTRY_NP_TAG);
 
-                ExFreePool( AFSGlobalDotDirEntry);
+               AFSLibExFreePoolWithTag( AFSGlobalDotDirEntry,
+                                        AFS_DIR_ENTRY_TAG);
 
                 AFSGlobalDotDirEntry = NULL;
             }
@@ -898,13 +965,28 @@ try_exit:
             if( AFSGlobalDotDotDirEntry != NULL)
             {
 
-                AFSDeleteObjectInfo( &AFSGlobalDotDotDirEntry->ObjectInformation);
+                lCount = AFSObjectInfoDecrement( AFSGlobalDotDotDirEntry->ObjectInformation,
+                                                 AFS_OBJECT_REFERENCE_GLOBAL);
+
+                AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSInitializeGlobalDirectoryEntries Decrement count on object %p Cnt %d\n",
+                              AFSGlobalDotDotDirEntry->ObjectInformation,
+                              lCount));
+
+                if ( lCount == 0)
+                {
+
+                    AFSDeleteObjectInfo( &AFSGlobalDotDotDirEntry->ObjectInformation);
+                }
 
                 ExDeleteResourceLite( &AFSGlobalDotDotDirEntry->NonPaged->Lock);
 
-                ExFreePool( AFSGlobalDotDotDirEntry->NonPaged);
+               AFSLibExFreePoolWithTag( AFSGlobalDotDotDirEntry->NonPaged,
+                                        AFS_DIR_ENTRY_NP_TAG);
 
-                ExFreePool( AFSGlobalDotDotDirEntry);
+               AFSLibExFreePoolWithTag( AFSGlobalDotDotDirEntry,
+                                        AFS_DIR_ENTRY_TAG);
 
                 AFSGlobalDotDotDirEntry = NULL;
             }
@@ -926,7 +1008,6 @@ AFSInitDirEntry( IN AFSObjectInfoCB *ParentObjectInfo,
     NTSTATUS ntStatus = STATUS_SUCCESS;
     ULONG ulEntryLength = 0;
     AFSObjectInfoCB *pObjectInfoCB = NULL;
-    BOOLEAN bAllocatedObjectCB = FALSE;
     ULONGLONG ullIndex = 0;
     AFSNonPagedDirectoryCB *pNonPagedDirEntry = NULL;
     LONG lCount;
@@ -934,14 +1015,14 @@ AFSInitDirEntry( IN AFSObjectInfoCB *ParentObjectInfo,
     __Enter
     {
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSInitDirEntry Initializing entry %wZ parent FID %08lX-%08lX-%08lX-%08lX\n",
                       FileName,
                       ParentObjectInfo->FileId.Cell,
                       ParentObjectInfo->FileId.Volume,
                       ParentObjectInfo->FileId.Vnode,
-                      ParentObjectInfo->FileId.Unique);
+                      ParentObjectInfo->FileId.Unique));
 
         //
         // First thing is to locate/create our object information block
@@ -957,8 +1038,7 @@ AFSInitDirEntry( IN AFSObjectInfoCB *ParentObjectInfo,
                                        ullIndex,
                                        (AFSBTreeEntry **)&pObjectInfoCB);
 
-        if( !NT_SUCCESS( ntStatus) ||
-            pObjectInfoCB == NULL)
+        if( !NT_SUCCESS( ntStatus))
         {
 
             //
@@ -976,24 +1056,124 @@ AFSInitDirEntry( IN AFSObjectInfoCB *ParentObjectInfo,
                 try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
             }
 
-            bAllocatedObjectCB = TRUE;
-
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSInitDirEntry initialized object %p Parent Object %p for %wZ\n",
                           pObjectInfoCB,
                           ParentObjectInfo,
-                          FileName);
+                          FileName));
+
+            //
+            // If we allocated the object information cb then set the information
+            //
+
+            pObjectInfoCB->FileId = DirEnumEntry->FileId;
+
+            pObjectInfoCB->TargetFileId = DirEnumEntry->TargetFileId;
+
+            pObjectInfoCB->FileType = DirEnumEntry->FileType;
+
+            pObjectInfoCB->FileAttributes = DirEnumEntry->FileAttributes;
+
+            if( pObjectInfoCB->FileType == AFS_FILE_TYPE_MOUNTPOINT ||
+                pObjectInfoCB->FileType == AFS_FILE_TYPE_DFSLINK)
+            {
+
+                pObjectInfoCB->FileAttributes |= (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_REPARSE_POINT);
+            }
+
+            if (pObjectInfoCB->FileType == AFS_FILE_TYPE_SYMLINK)
+            {
+
+                if ( pObjectInfoCB->FileAttributes == FILE_ATTRIBUTE_NORMAL)
+                {
+
+                    pObjectInfoCB->FileAttributes = FILE_ATTRIBUTE_REPARSE_POINT;
+                }
+                else
+                {
+
+                    pObjectInfoCB->FileAttributes |= FILE_ATTRIBUTE_REPARSE_POINT;
+                }
+            }
+
+            //
+            // Check for the case where we have a filetype of SymLink but both the TargetFid and the
+            // TargetName are empty. In this case set the filetype to zero so we evaluate it later in
+            // the code
+            //
+
+            if( pObjectInfoCB->FileType == AFS_FILE_TYPE_SYMLINK &&
+                pObjectInfoCB->TargetFileId.Vnode == 0 &&
+                pObjectInfoCB->TargetFileId.Unique == 0 &&
+                (TargetName == NULL || TargetName->Length == 0))
+            {
+
+                //
+                // This will ensure we perform a validation on the node
+                //
+
+                pObjectInfoCB->FileType = AFS_FILE_TYPE_UNKNOWN;
+            }
+
+            if( pObjectInfoCB->FileType == AFS_FILE_TYPE_UNKNOWN)
+            {
+
+                SetFlag( pObjectInfoCB->Flags, AFS_OBJECT_FLAGS_NOT_EVALUATED);
+            }
+
+            SetFlag( pObjectInfoCB->Flags, AFS_OBJECT_FLAGS_VERIFY);
         }
 
+        if ( BooleanFlagOn( pObjectInfoCB->Flags, AFS_OBJECT_FLAGS_VERIFY))
+        {
+
+            pObjectInfoCB->CreationTime = DirEnumEntry->CreationTime;
+
+            pObjectInfoCB->LastAccessTime = DirEnumEntry->LastAccessTime;
+
+            pObjectInfoCB->LastWriteTime = DirEnumEntry->LastWriteTime;
+
+            pObjectInfoCB->ChangeTime = DirEnumEntry->ChangeTime;
+
+            pObjectInfoCB->EndOfFile = DirEnumEntry->EndOfFile;
+
+            pObjectInfoCB->AllocationSize = DirEnumEntry->AllocationSize;
+
+            pObjectInfoCB->EaSize = DirEnumEntry->EaSize;
+
+            pObjectInfoCB->Links = DirEnumEntry->Links;
+
+            pObjectInfoCB->Expiration = DirEnumEntry->Expiration;
+
+           pObjectInfoCB->DataVersion = DirEnumEntry->DataVersion;
+
+           AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                         AFS_TRACE_LEVEL_VERBOSE,
+                         "AFSInitDirEntry FID %08lX-%08lX-%08lX-%08lX Clearing Verify Flag\n",
+                         pObjectInfoCB->FileId.Cell,
+                         pObjectInfoCB->FileId.Volume,
+                         pObjectInfoCB->FileId.Vnode,
+                         pObjectInfoCB->FileId.Unique));
+
+           ClearFlag( pObjectInfoCB->Flags, AFS_OBJECT_FLAGS_VERIFY);
+       }
+
+        //
+        // This reference count is either stored into the return DirectoryCB
+        // or released before function exit.
+        //
+
         lCount = AFSObjectInfoIncrement( pObjectInfoCB,
                                          AFS_OBJECT_REFERENCE_DIRENTRY);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSInitDirEntry Increment count on object %p Cnt %d\n",
                       pObjectInfoCB,
-                      lCount);
+                      lCount));
+
+        KeQueryTickCount( &pObjectInfoCB->LastAccessCount);
 
         AFSReleaseResource( ParentObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
 
@@ -1018,10 +1198,10 @@ AFSInitDirEntry( IN AFSObjectInfoCB *ParentObjectInfo,
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+        AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSInitDirEntry AFS_DIR_ENTRY_TAG allocated %p\n",
-                      pDirNode);
+                      pDirNode));
 
         pNonPagedDirEntry = (AFSNonPagedDirectoryCB *)AFSExAllocatePoolWithTag( NonPagedPool,
                                                                                 sizeof( AFSNonPagedDirectoryCB),
@@ -1081,7 +1261,7 @@ AFSInitDirEntry( IN AFSObjectInfoCB *ParentObjectInfo,
                                                                            TRUE);
         }
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSInitDirEntry Initialized DE %p for %wZ in parent FID %08lX-%08lX-%08lX-%08lX\n",
                       pDirNode,
@@ -1089,7 +1269,7 @@ AFSInitDirEntry( IN AFSObjectInfoCB *ParentObjectInfo,
                       ParentObjectInfo->FileId.Cell,
                       ParentObjectInfo->FileId.Volume,
                       ParentObjectInfo->FileId.Vnode,
-                      ParentObjectInfo->FileId.Unique);
+                      ParentObjectInfo->FileId.Unique));
 
         if( TargetName != NULL &&
             TargetName->Length > 0)
@@ -1108,87 +1288,6 @@ AFSInitDirEntry( IN AFSObjectInfoCB *ParentObjectInfo,
                            pDirNode->NameInformation.TargetName.Length);
         }
 
-        //
-        // If we allocated the object information cb then update the information
-        //
-
-        if( bAllocatedObjectCB)
-        {
-
-            //
-            // Populate the rest of the data
-            //
-
-            pObjectInfoCB->FileId = DirEnumEntry->FileId;
-
-            pObjectInfoCB->TargetFileId = DirEnumEntry->TargetFileId;
-
-            pObjectInfoCB->FileType = DirEnumEntry->FileType;
-
-            pObjectInfoCB->CreationTime = DirEnumEntry->CreationTime;
-
-            pObjectInfoCB->LastAccessTime = DirEnumEntry->LastAccessTime;
-
-            pObjectInfoCB->LastWriteTime = DirEnumEntry->LastWriteTime;
-
-            pObjectInfoCB->ChangeTime = DirEnumEntry->ChangeTime;
-
-            pObjectInfoCB->EndOfFile = DirEnumEntry->EndOfFile;
-
-            pObjectInfoCB->AllocationSize = DirEnumEntry->AllocationSize;
-
-            pObjectInfoCB->FileAttributes = DirEnumEntry->FileAttributes;
-
-            if( pObjectInfoCB->FileType == AFS_FILE_TYPE_MOUNTPOINT)
-            {
-
-                pObjectInfoCB->FileAttributes = (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_REPARSE_POINT);
-            }
-
-            if (pObjectInfoCB->FileType == AFS_FILE_TYPE_SYMLINK ||
-                pObjectInfoCB->FileType == AFS_FILE_TYPE_DFSLINK)
-            {
-
-                pObjectInfoCB->FileAttributes = FILE_ATTRIBUTE_REPARSE_POINT;
-            }
-
-            pObjectInfoCB->EaSize = DirEnumEntry->EaSize;
-
-            //
-            // Check for the case where we have a filetype of SymLink but both the TargetFid and the
-            // TargetName are empty. In this case set the filetype to zero so we evaluate it later in
-            // the code
-            //
-
-            if( pObjectInfoCB->FileType == AFS_FILE_TYPE_SYMLINK &&
-                pObjectInfoCB->TargetFileId.Vnode == 0 &&
-                pObjectInfoCB->TargetFileId.Unique == 0 &&
-                pDirNode->NameInformation.TargetName.Length == 0)
-            {
-
-                //
-                // This will ensure we perform a validation on the node
-                //
-
-                pObjectInfoCB->FileType = AFS_FILE_TYPE_UNKNOWN;
-            }
-
-            if( pObjectInfoCB->FileType == AFS_FILE_TYPE_UNKNOWN)
-            {
-
-                SetFlag( pObjectInfoCB->Flags, AFS_OBJECT_FLAGS_NOT_EVALUATED);
-            }
-        }
-
-        //
-        // Object specific information
-        //
-
-        pObjectInfoCB->Links = DirEnumEntry->Links;
-
-        pObjectInfoCB->Expiration = DirEnumEntry->Expiration;
-
-        pObjectInfoCB->DataVersion = DirEnumEntry->DataVersion;
 
 try_exit:
 
@@ -1206,10 +1305,10 @@ try_exit:
             if( pDirNode != NULL)
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+                AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSInitDirEntry AFS_DIR_ENTRY_TAG deallocating %p\n",
-                              pDirNode);
+                              pDirNode));
 
                 AFSExFreePoolWithTag( pDirNode, AFS_DIR_ENTRY_TAG);
 
@@ -1223,22 +1322,19 @@ try_exit:
             if( pObjectInfoCB != NULL)
             {
 
+                AFSAcquireShared( pObjectInfoCB->VolumeCB->ObjectInfoTree.TreeLock,
+                                  TRUE);
+
                 lCount = AFSObjectInfoDecrement( pObjectInfoCB,
                                                  AFS_OBJECT_REFERENCE_DIRENTRY);
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSInitDirEntry Decrement count on object %p Cnt %d\n",
                               pObjectInfoCB,
-                              lCount);
-
-                if( bAllocatedObjectCB)
-                {
-
-                    ASSERT( pObjectInfoCB->ObjectReferenceCount == 0);
+                              lCount));
 
-                    AFSDeleteObjectInfo( &pObjectInfoCB);
-                }
+                AFSReleaseResource( pObjectInfoCB->VolumeCB->ObjectInfoTree.TreeLock);
             }
         }
     }
@@ -1365,17 +1461,26 @@ AFSEvaluateNode( IN GUID *AuthGroup,
 
         DirEntry->ObjectInformation->FileAttributes = pDirEntry->FileAttributes;
 
-        if( pDirEntry->FileType == AFS_FILE_TYPE_MOUNTPOINT)
+        if( pDirEntry->FileType == AFS_FILE_TYPE_MOUNTPOINT ||
+            pDirEntry->FileType == AFS_FILE_TYPE_DFSLINK)
         {
 
-            DirEntry->ObjectInformation->FileAttributes = (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_REPARSE_POINT);
+            DirEntry->ObjectInformation->FileAttributes |= (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_REPARSE_POINT);
         }
 
-        if( pDirEntry->FileType == AFS_FILE_TYPE_SYMLINK ||
-            pDirEntry->FileType == AFS_FILE_TYPE_DFSLINK)
+        if( pDirEntry->FileType == AFS_FILE_TYPE_SYMLINK)
         {
 
-            DirEntry->ObjectInformation->FileAttributes = FILE_ATTRIBUTE_REPARSE_POINT;
+            if ( DirEntry->ObjectInformation->FileAttributes == FILE_ATTRIBUTE_NORMAL)
+            {
+
+                DirEntry->ObjectInformation->FileAttributes = FILE_ATTRIBUTE_REPARSE_POINT;
+            }
+            else
+            {
+
+                DirEntry->ObjectInformation->FileAttributes |= FILE_ATTRIBUTE_REPARSE_POINT;
+            }
         }
 
         DirEntry->ObjectInformation->EaSize = pDirEntry->EaSize;
@@ -1468,10 +1573,10 @@ AFSValidateSymLink( IN GUID *AuthGroup,
             pDirEntry->FileType == AFS_FILE_TYPE_INVALID)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE_2,
                           "AFSValidateSymLink Invalid type Status %08lX\n",
-                          STATUS_OBJECT_NAME_NOT_FOUND);
+                          STATUS_OBJECT_NAME_NOT_FOUND));
 
             try_return( ntStatus = STATUS_OBJECT_NAME_NOT_FOUND);
         }
@@ -1554,17 +1659,26 @@ AFSValidateSymLink( IN GUID *AuthGroup,
 
         DirEntry->ObjectInformation->FileAttributes = pDirEntry->FileAttributes;
 
-        if( pDirEntry->FileType == AFS_FILE_TYPE_MOUNTPOINT)
+        if( pDirEntry->FileType == AFS_FILE_TYPE_MOUNTPOINT ||
+            pDirEntry->FileType == AFS_FILE_TYPE_DFSLINK)
         {
 
-            DirEntry->ObjectInformation->FileAttributes = (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_REPARSE_POINT);
+            DirEntry->ObjectInformation->FileAttributes |= (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_REPARSE_POINT);
         }
 
-        if( pDirEntry->FileType == AFS_FILE_TYPE_SYMLINK ||
-            pDirEntry->FileType == AFS_FILE_TYPE_DFSLINK)
+        if( pDirEntry->FileType == AFS_FILE_TYPE_SYMLINK)
         {
 
-            DirEntry->ObjectInformation->FileAttributes = FILE_ATTRIBUTE_REPARSE_POINT;
+            if ( DirEntry->ObjectInformation->FileAttributes == FILE_ATTRIBUTE_NORMAL)
+            {
+
+                DirEntry->ObjectInformation->FileAttributes = FILE_ATTRIBUTE_REPARSE_POINT;
+            }
+            else
+            {
+
+                DirEntry->ObjectInformation->FileAttributes |= FILE_ATTRIBUTE_REPARSE_POINT;
+            }
         }
 
         DirEntry->ObjectInformation->EaSize = pDirEntry->EaSize;
@@ -1589,11 +1703,12 @@ AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo,
 {
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
+    AFSDeviceExt *pRDRDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
     IO_STATUS_BLOCK stIoStatus;
     ULONG ulFilter = 0;
     AFSObjectInfoCB * pParentObjectInfo = NULL;
 
-    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                   AFS_TRACE_LEVEL_VERBOSE,
                   "AFSInvalidateObject Invalidation on node type %d for fid %08lX-%08lX-%08lX-%08lX Reason %d\n",
                   (*ppObjectInfo)->FileType,
@@ -1601,13 +1716,14 @@ AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo,
                   (*ppObjectInfo)->FileId.Volume,
                   (*ppObjectInfo)->FileId.Vnode,
                   (*ppObjectInfo)->FileId.Unique,
-                  Reason);
+                  Reason));
 
     if ( BooleanFlagOn( (*ppObjectInfo)->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
     {
 
         pParentObjectInfo = AFSFindObjectInfo( (*ppObjectInfo)->VolumeCB,
-                                               &(*ppObjectInfo)->ParentFileId);
+                                               &(*ppObjectInfo)->ParentFileId,
+                                               FALSE);
     }
 
     if( (*ppObjectInfo)->FileType == AFS_FILE_TYPE_SYMLINK ||
@@ -1631,8 +1747,6 @@ AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo,
             {
 
                 (*ppObjectInfo)->DataVersion.QuadPart = (ULONGLONG)-1;
-
-                SetFlag( (*ppObjectInfo)->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
             }
 
             (*ppObjectInfo)->Expiration.QuadPart = 0;
@@ -1641,13 +1755,13 @@ AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo,
 
             (*ppObjectInfo)->TargetFileId.Unique = 0;
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSInvalidateObject Setting VERIFY flag on fid %08lX-%08lX-%08lX-%08lX\n",
                           (*ppObjectInfo)->FileId.Cell,
                           (*ppObjectInfo)->FileId.Volume,
                           (*ppObjectInfo)->FileId.Vnode,
-                          (*ppObjectInfo)->FileId.Unique);
+                          (*ppObjectInfo)->FileId.Unique));
 
             SetFlag( (*ppObjectInfo)->Flags, AFS_OBJECT_FLAGS_VERIFY);
         }
@@ -1699,24 +1813,24 @@ AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo,
 
             SetFlag( (*ppObjectInfo)->Flags, AFS_OBJECT_FLAGS_DELETED);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSInvalidateObject Set DELETE flag on fid %08lX-%08lX-%08lX-%08lX\n",
                           (*ppObjectInfo)->FileId.Cell,
                           (*ppObjectInfo)->FileId.Volume,
                           (*ppObjectInfo)->FileId.Vnode,
-                          (*ppObjectInfo)->FileId.Unique);
+                          (*ppObjectInfo)->FileId.Unique));
 
             if( pParentObjectInfo != NULL)
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSInvalidateObject Set VERIFY flag on parent fid %08lX-%08lX-%08lX-%08lX\n",
                               pParentObjectInfo->FileId.Cell,
                               pParentObjectInfo->FileId.Volume,
                               pParentObjectInfo->FileId.Vnode,
-                              pParentObjectInfo->FileId.Unique);
+                              pParentObjectInfo->FileId.Unique));
 
                 SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
 
@@ -1755,13 +1869,28 @@ AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo,
                 (*ppObjectInfo)->Fcb != NULL)
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSInvalidateObject Flush/purge file fid %08lX-%08lX-%08lX-%08lX\n",
                               (*ppObjectInfo)->FileId.Cell,
                               (*ppObjectInfo)->FileId.Volume,
                               (*ppObjectInfo)->FileId.Vnode,
-                              (*ppObjectInfo)->FileId.Unique);
+                              (*ppObjectInfo)->FileId.Unique));
+
+               AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                             AFS_TRACE_LEVEL_VERBOSE,
+                             "AFSInvalidateObject Flush/purge Acquiring Fcb lock %p EXCL %08lX\n",
+                             &(*ppObjectInfo)->Fcb->NPFcb->Resource,
+                             PsGetCurrentThread()));
+
+               AFSAcquireExcl( &(*ppObjectInfo)->Fcb->NPFcb->Resource,
+                               TRUE);
+
+               AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+                             AFS_TRACE_LEVEL_VERBOSE,
+                             "AFSInvalidateObject Flush/purge Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+                             &(*ppObjectInfo)->Fcb->NPFcb->SectionObjectResource,
+                             PsGetCurrentThread()));
 
                 AFSAcquireExcl( &(*ppObjectInfo)->Fcb->NPFcb->SectionObjectResource,
                                 TRUE);
@@ -1777,7 +1906,7 @@ AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo,
                     if( !NT_SUCCESS( stIoStatus.Status))
                     {
 
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+                        AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                                       AFS_TRACE_LEVEL_ERROR,
                                       "AFSInvalidateObject CcFlushCache failure FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX Bytes 0x%08lX\n",
                                       (*ppObjectInfo)->FileId.Cell,
@@ -1785,7 +1914,7 @@ AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo,
                                       (*ppObjectInfo)->FileId.Vnode,
                                       (*ppObjectInfo)->FileId.Unique,
                                       stIoStatus.Status,
-                                      stIoStatus.Information);
+                                      stIoStatus.Information));
 
                         ntStatus = stIoStatus.Status;
                     }
@@ -1800,45 +1929,63 @@ AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo,
                                                    FALSE))
                         {
 
-                            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+                            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                                           AFS_TRACE_LEVEL_WARNING,
                                           "AFSInvalidateObject CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
                                           (*ppObjectInfo)->FileId.Cell,
                                           (*ppObjectInfo)->FileId.Volume,
                                           (*ppObjectInfo)->FileId.Vnode,
-                                          (*ppObjectInfo)->FileId.Unique);
+                                          (*ppObjectInfo)->FileId.Unique));
 
                             SetFlag( (*ppObjectInfo)->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
                         }
                     }
                 }
-                __except( EXCEPTION_EXECUTE_HANDLER)
+               __except( EXCEPTION_EXECUTE_HANDLER)
                 {
 
                     ntStatus = GetExceptionCode();
 
-                    AFSDbgLogMsg( 0,
+                    AFSDbgTrace(( 0,
                                   0,
                                   "EXCEPTION - AFSInvalidateObject Cc FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
                                   (*ppObjectInfo)->FileId.Cell,
                                   (*ppObjectInfo)->FileId.Volume,
                                   (*ppObjectInfo)->FileId.Vnode,
                                   (*ppObjectInfo)->FileId.Unique,
-                                  ntStatus);
+                                  ntStatus));
 
                     SetFlag( (*ppObjectInfo)->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
                 }
 
+               AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+                             AFS_TRACE_LEVEL_VERBOSE,
+                             "AFSInvalidateObject Flush/purge Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+                             &(*ppObjectInfo)->Fcb->NPFcb->SectionObjectResource,
+                             PsGetCurrentThread()));
+
                 AFSReleaseResource( &(*ppObjectInfo)->Fcb->NPFcb->SectionObjectResource);
 
-                //
-                // Clear out the extents
-                // Get rid of them (note this involves waiting
-                // for any writes or reads to the cache to complete)
-                //
+               AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                             AFS_TRACE_LEVEL_VERBOSE,
+                             "AFSInvalidateObject Flush/purge Releasing Fcb lock %p EXCL %08lX\n",
+                             &(*ppObjectInfo)->Fcb->NPFcb->Resource,
+                             PsGetCurrentThread()));
 
-                AFSTearDownFcbExtents( (*ppObjectInfo)->Fcb,
-                                       NULL);
+               AFSReleaseResource( &(*ppObjectInfo)->Fcb->NPFcb->Resource);
+
+               if( !BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+               {
+
+                   //
+                   // Clear out the extents
+                   // Get rid of them (note this involves waiting
+                   // for any writes or reads to the cache to complete)
+                   //
+
+                   AFSTearDownFcbExtents( (*ppObjectInfo)->Fcb,
+                                          NULL);
+               }
             }
 
             (*ppObjectInfo)->DataVersion.QuadPart = (ULONGLONG)-1;
@@ -1847,13 +1994,13 @@ AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo,
             if( (*ppObjectInfo)->FileType == AFS_FILE_TYPE_FILE)
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSInvalidateObject Setting VERIFY_DATA flag on fid %08lX-%08lX-%08lX-%08lX\n",
                               (*ppObjectInfo)->FileId.Cell,
                               (*ppObjectInfo)->FileId.Volume,
                               (*ppObjectInfo)->FileId.Vnode,
-                              (*ppObjectInfo)->FileId.Unique);
+                              (*ppObjectInfo)->FileId.Unique));
 
                 SetFlag( (*ppObjectInfo)->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
             }
@@ -1910,13 +2057,13 @@ AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo,
 
             (*ppObjectInfo)->Expiration.QuadPart = 0;
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSInvalidateObject Setting VERIFY flag on fid %08lX-%08lX-%08lX-%08lX\n",
                           (*ppObjectInfo)->FileId.Cell,
                           (*ppObjectInfo)->FileId.Volume,
                           (*ppObjectInfo)->FileId.Vnode,
-                          (*ppObjectInfo)->FileId.Unique);
+                          (*ppObjectInfo)->FileId.Unique));
 
             SetFlag( (*ppObjectInfo)->Flags, AFS_OBJECT_FLAGS_VERIFY);
 
@@ -1962,7 +2109,7 @@ AFSInvalidateCache( IN AFSInvalidateCacheCB *InvalidateCB)
     __Enter
     {
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSInvalidateCache Invalidation FID %08lX-%08lX-%08lX-%08lX Type %d WholeVolume %d Reason %d\n",
                       InvalidateCB->FileID.Cell,
@@ -1971,17 +2118,17 @@ AFSInvalidateCache( IN AFSInvalidateCacheCB *InvalidateCB)
                       InvalidateCB->FileID.Unique,
                       InvalidateCB->FileType,
                       InvalidateCB->WholeVolume,
-                      InvalidateCB->Reason);
+                      InvalidateCB->Reason));
 
         //
         // Need to locate the Fcb for the directory to purge
         //
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSInvalidateCache Acquiring RDR VolumeTreeLock lock %p SHARED %08lX\n",
                       &pDevExt->Specific.RDR.VolumeTreeLock,
-                      PsGetCurrentThread());
+                      PsGetCurrentThread()));
 
         //
         // Starve any exclusive waiters on this paticular call
@@ -2005,11 +2152,11 @@ AFSInvalidateCache( IN AFSInvalidateCacheCB *InvalidateCB)
             lCount = AFSVolumeIncrement( pVolumeCB,
                                          AFS_VOLUME_REFERENCE_INVALIDATE);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSInvalidateCache Increment count on volume %p Cnt %d\n",
                           pVolumeCB,
-                          lCount);
+                          lCount));
         }
 
         AFSReleaseResource( &pDevExt->Specific.RDR.VolumeTreeLock);
@@ -2018,14 +2165,14 @@ AFSInvalidateCache( IN AFSInvalidateCacheCB *InvalidateCB)
             pVolumeCB == NULL)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_WARNING,
                           "AFSInvalidateCache Invalidation FAILURE Unable to locate volume node FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                           InvalidateCB->FileID.Cell,
                           InvalidateCB->FileID.Volume,
                           InvalidateCB->FileID.Vnode,
                           InvalidateCB->FileID.Unique,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus = STATUS_SUCCESS);
         }
@@ -2043,7 +2190,7 @@ AFSInvalidateCache( IN AFSInvalidateCacheCB *InvalidateCB)
             try_return( ntStatus);
         }
 
-        AFSAcquireShared( pVolumeCB->ObjectInfoTree.TreeLock,
+        AFSAcquireExcl( pVolumeCB->ObjectInfoTree.TreeLock,
                           TRUE);
 
         if ( AFSIsVolumeFID( &InvalidateCB->FileID))
@@ -2071,11 +2218,11 @@ AFSInvalidateCache( IN AFSInvalidateCacheCB *InvalidateCB)
             lCount = AFSObjectInfoIncrement( pObjectInfo,
                                              AFS_OBJECT_REFERENCE_INVALIDATION);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSInvalidateCache Increment count on object %p Cnt %d\n",
                           pObjectInfo,
-                          lCount);
+                          lCount));
         }
 
         AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
@@ -2084,14 +2231,14 @@ AFSInvalidateCache( IN AFSInvalidateCacheCB *InvalidateCB)
             pObjectInfo == NULL)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSInvalidateCache Invalidation FAILURE Unable to locate object FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                           InvalidateCB->FileID.Cell,
                           InvalidateCB->FileID.Volume,
                           InvalidateCB->FileID.Vnode,
                           InvalidateCB->FileID.Unique,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus = STATUS_SUCCESS);
         }
@@ -2107,11 +2254,11 @@ try_exit:
             lCount = AFSObjectInfoDecrement( pObjectInfo,
                                              AFS_OBJECT_REFERENCE_INVALIDATION);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSInvalidateCache Decrement count on object %p Cnt %d\n",
                           pObjectInfo,
-                          lCount);
+                          lCount));
         }
 
         if ( pVolumeCB != NULL)
@@ -2120,11 +2267,11 @@ try_exit:
             lCount = AFSVolumeDecrement( pVolumeCB,
                                          AFS_VOLUME_REFERENCE_INVALIDATE);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSInvalidateCache Decrement count on volume %p Cnt %d\n",
                           pVolumeCB,
-                          lCount);
+                          lCount));
         }
     }
 
@@ -2153,7 +2300,8 @@ AFSIsChildOfParent( IN AFSFcb *Dcb,
         }
 
         pParentObjectInfo = AFSFindObjectInfo( pCurrentFcb->ObjectInformation->VolumeCB,
-                                               &pCurrentFcb->ObjectInformation->ParentFileId);
+                                               &pCurrentFcb->ObjectInformation->ParentFileId,
+                                               FALSE);
 
         if ( pParentObjectInfo != NULL)
         {
@@ -2298,11 +2446,11 @@ AFSSubstituteSysName( IN UNICODE_STRING *ComponentName,
 
 #endif
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSSubstituteSysName Acquiring SysName lock %p SHARED %08lX\n",
                       pSysNameLock,
-                      PsGetCurrentThread());
+                      PsGetCurrentThread()));
 
         AFSAcquireShared( pSysNameLock,
                           TRUE);
@@ -2323,11 +2471,11 @@ AFSSubstituteSysName( IN UNICODE_STRING *ComponentName,
         if( pSysName == NULL)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE_2,
                           "AFSSubstituteSysName No sysname %wZ Status %08lX\n",
-                          &ComponentName,
-                          STATUS_OBJECT_NAME_NOT_FOUND);
+                         ComponentName,
+                          STATUS_OBJECT_NAME_NOT_FOUND));
 
             try_return( ntStatus = STATUS_OBJECT_NAME_NOT_FOUND);
         }
@@ -2542,14 +2690,14 @@ AFSInvalidateVolume( IN AFSVolumeCB *VolumeCB,
     __Enter
     {
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSInvalidateVolume Invalidate volume fid %08lX-%08lX-%08lX-%08lX Reason %08lX\n",
                       VolumeCB->ObjectInformation.FileId.Cell,
                       VolumeCB->ObjectInformation.FileId.Volume,
                       VolumeCB->ObjectInformation.FileId.Vnode,
                       VolumeCB->ObjectInformation.FileId.Unique,
-                      Reason);
+                      Reason));
 
         //
         // Depending on the reason for invalidation then perform work on the node
@@ -2573,6 +2721,9 @@ AFSInvalidateVolume( IN AFSVolumeCB *VolumeCB,
             }
         }
 
+        AFSAcquireShared( VolumeCB->ObjectInfoTree.TreeLock,
+                          TRUE);
+
         //
         // Invalidate the volume root directory
         //
@@ -2585,26 +2736,31 @@ AFSInvalidateVolume( IN AFSVolumeCB *VolumeCB,
             lCount = AFSObjectInfoIncrement( pCurrentObject,
                                              AFS_OBJECT_REFERENCE_INVALIDATION);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSInvalidateVolumeObjects Increment count on object %p Cnt %d\n",
                           pCurrentObject,
-                          lCount);
+                          lCount));
+
+            AFSReleaseResource( VolumeCB->ObjectInfoTree.TreeLock);
 
             AFSInvalidateObject( &pCurrentObject,
                                  Reason);
 
+            AFSAcquireShared( VolumeCB->ObjectInfoTree.TreeLock,
+                              TRUE);
+
             if ( pCurrentObject)
             {
 
                 lCount = AFSObjectInfoDecrement( pCurrentObject,
                                                  AFS_OBJECT_REFERENCE_INVALIDATION);
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSInvalidateVolumeObjects Decrement count on object %p Cnt %d\n",
                               pCurrentObject,
-                              lCount);
+                              lCount));
             }
         }
 
@@ -2612,9 +2768,6 @@ AFSInvalidateVolume( IN AFSVolumeCB *VolumeCB,
         // Apply invalidation to all other volume objects
         //
 
-        AFSAcquireShared( VolumeCB->ObjectInfoTree.TreeLock,
-                          TRUE);
-
         pCurrentObject = VolumeCB->ObjectInfoListHead;
 
         if ( pCurrentObject)
@@ -2627,11 +2780,11 @@ AFSInvalidateVolume( IN AFSVolumeCB *VolumeCB,
             lCount = AFSObjectInfoIncrement( pCurrentObject,
                                              AFS_OBJECT_REFERENCE_INVALIDATION);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSInvalidateVolumeObjects Increment count on object %p Cnt %d\n",
                           pCurrentObject,
-                          lCount);
+                          lCount));
         }
 
         while( pCurrentObject != NULL)
@@ -2649,11 +2802,11 @@ AFSInvalidateVolume( IN AFSVolumeCB *VolumeCB,
                 lCount = AFSObjectInfoIncrement( pNextObject,
                                                  AFS_OBJECT_REFERENCE_INVALIDATION);
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSInvalidateVolumeObjects Increment count on object %p Cnt %d\n",
                               pNextObject,
-                              lCount);
+                              lCount));
             }
 
             AFSReleaseResource( VolumeCB->ObjectInfoTree.TreeLock);
@@ -2661,22 +2814,22 @@ AFSInvalidateVolume( IN AFSVolumeCB *VolumeCB,
             AFSInvalidateObject( &pCurrentObject,
                                  Reason);
 
+            AFSAcquireShared( VolumeCB->ObjectInfoTree.TreeLock,
+                              TRUE);
+
             if ( pCurrentObject )
             {
 
                 lCount = AFSObjectInfoDecrement( pCurrentObject,
                                                  AFS_OBJECT_REFERENCE_INVALIDATION);
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSInvalidateVolumeObjects Decrement count on object %p Cnt %d\n",
                               pCurrentObject,
-                              lCount);
+                              lCount));
             }
 
-            AFSAcquireShared( VolumeCB->ObjectInfoTree.TreeLock,
-                              TRUE);
-
             pCurrentObject = pNextObject;
         }
 
@@ -2696,11 +2849,11 @@ AFSInvalidateAllVolumes( VOID)
 
     pRDRDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
 
-    AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+    AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                   AFS_TRACE_LEVEL_VERBOSE,
                   "AFSInvalidateAllVolumes Acquiring RDR VolumeListLock lock %p SHARED %08lX\n",
                   &pRDRDeviceExt->Specific.RDR.VolumeListLock,
-                  PsGetCurrentThread());
+                  PsGetCurrentThread()));
 
     AFSAcquireShared( &pRDRDeviceExt->Specific.RDR.VolumeListLock,
                       TRUE);
@@ -2710,20 +2863,20 @@ AFSInvalidateAllVolumes( VOID)
     if ( pVolumeCB)
     {
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSInvalidateAllVolumes Acquiring VolumeRoot ObjectInfoTree lock %p SHARED %08lX\n",
                       pVolumeCB->ObjectInfoTree.TreeLock,
-                      PsGetCurrentThread());
+                      PsGetCurrentThread()));
 
         lCount = AFSVolumeIncrement( pVolumeCB,
                                      AFS_VOLUME_REFERENCE_INVALIDATE);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSInvalidateAllVolumes Increment count on volume %p Cnt %d\n",
                       pVolumeCB,
-                      lCount);
+                      lCount));
     }
 
     while( pVolumeCB != NULL)
@@ -2737,11 +2890,11 @@ AFSInvalidateAllVolumes( VOID)
             lCount = AFSVolumeIncrement( pNextVolumeCB,
                                          AFS_VOLUME_REFERENCE_INVALIDATE);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSInvalidateAllVolumes Increment count on volume %p Cnt %d\n",
                           pVolumeCB,
-                          lCount);
+                          lCount));
         }
 
         AFSReleaseResource( &pRDRDeviceExt->Specific.RDR.VolumeListLock);
@@ -2756,11 +2909,11 @@ AFSInvalidateAllVolumes( VOID)
         lCount = AFSVolumeDecrement( pVolumeCB,
                                      AFS_VOLUME_REFERENCE_INVALIDATE);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSInvalidateAllVolumes Decrement count on volume %p Cnt %d\n",
                       pVolumeCB,
-                      lCount);
+                      lCount));
 
         pVolumeCB = pNextVolumeCB;
     }
@@ -2770,10 +2923,12 @@ AFSInvalidateAllVolumes( VOID)
 
 NTSTATUS
 AFSVerifyEntry( IN GUID *AuthGroup,
-                IN AFSDirectoryCB *DirEntry)
+               IN AFSDirectoryCB *DirEntry,
+               IN BOOLEAN bFollowMountPoint)
 {
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
+    AFSDeviceExt *pRDRDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
     AFSDirEnumEntry *pDirEnumEntry = NULL;
     AFSObjectInfoCB *pObjectInfo = DirEntry->ObjectInformation;
     IO_STATUS_BLOCK stIoStatus;
@@ -2781,24 +2936,24 @@ AFSVerifyEntry( IN GUID *AuthGroup,
     __Enter
     {
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE_2,
                       "AFSVerifyEntry Verifying entry %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                       &DirEntry->NameInformation.FileName,
                       pObjectInfo->FileId.Cell,
                       pObjectInfo->FileId.Volume,
                       pObjectInfo->FileId.Vnode,
-                      pObjectInfo->FileId.Unique);
+                      pObjectInfo->FileId.Unique));
 
         ntStatus = AFSEvaluateTargetByID( pObjectInfo,
                                           AuthGroup,
-                                          FALSE,
+                                         bFollowMountPoint ? FALSE : TRUE,
                                           &pDirEnumEntry);
 
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSVerifyEntry Evaluate Target failed %wZ FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
                           &DirEntry->NameInformation.FileName,
@@ -2806,7 +2961,7 @@ AFSVerifyEntry( IN GUID *AuthGroup,
                           pObjectInfo->FileId.Volume,
                           pObjectInfo->FileId.Vnode,
                           pObjectInfo->FileId.Unique,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -2815,29 +2970,27 @@ AFSVerifyEntry( IN GUID *AuthGroup,
         // Check the data version of the file
         //
 
-        if( pObjectInfo->DataVersion.QuadPart == pDirEnumEntry->DataVersion.QuadPart)
-        {
-            if ( !BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA))
-            {
+       if( pObjectInfo->DataVersion.QuadPart == pDirEnumEntry->DataVersion.QuadPart &&
+           !BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA))
+       {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                              AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSVerifyEntry No DV change %I64X for Fcb %wZ FID %08lX-%08lX-%08lX-%08lX\n",
-                              pObjectInfo->DataVersion.QuadPart,
-                              &DirEntry->NameInformation.FileName,
-                              pObjectInfo->FileId.Cell,
-                              pObjectInfo->FileId.Volume,
-                              pObjectInfo->FileId.Vnode,
-                              pObjectInfo->FileId.Unique);
+           AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                         AFS_TRACE_LEVEL_VERBOSE,
+                         "AFSVerifyEntry No DV change %I64X for Fcb %wZ FID %08lX-%08lX-%08lX-%08lX Clearing Verify Flag\n",
+                         pObjectInfo->DataVersion.QuadPart,
+                         &DirEntry->NameInformation.FileName,
+                         pObjectInfo->FileId.Cell,
+                         pObjectInfo->FileId.Volume,
+                         pObjectInfo->FileId.Vnode,
+                         pObjectInfo->FileId.Unique));
 
-                //
-                // We are ok, just get out
-                //
+           //
+           // We are ok, just get out
+           //
 
-                ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+           ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
 
-                try_return( ntStatus = STATUS_SUCCESS);
-            }
+           try_return( ntStatus = STATUS_SUCCESS);
         }
 
         //
@@ -2870,6 +3023,14 @@ AFSVerifyEntry( IN GUID *AuthGroup,
                 if( NT_SUCCESS( ntStatus))
                 {
 
+                   AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                 AFS_TRACE_LEVEL_VERBOSE,
+                                 "AFSVerifyEntry MountPoint FID %08lX-%08lX-%08lX-%08lX Clearing Verify Flag\n",
+                                 pObjectInfo->FileId.Cell,
+                                 pObjectInfo->FileId.Volume,
+                                 pObjectInfo->FileId.Vnode,
+                                 pObjectInfo->FileId.Unique));
+
                     ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
                 }
 
@@ -2889,6 +3050,14 @@ AFSVerifyEntry( IN GUID *AuthGroup,
                 if( NT_SUCCESS( ntStatus))
                 {
 
+                   AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                 AFS_TRACE_LEVEL_VERBOSE,
+                                 "AFSVerifyEntry Symlink FID %08lX-%08lX-%08lX-%08lX Clearing Verify Flag\n",
+                                 pObjectInfo->FileId.Cell,
+                                 pObjectInfo->FileId.Volume,
+                                 pObjectInfo->FileId.Vnode,
+                                 pObjectInfo->FileId.Unique));
+
                     ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
                 }
 
@@ -2898,39 +3067,18 @@ AFSVerifyEntry( IN GUID *AuthGroup,
             case AFS_FILE_TYPE_FILE:
             {
                 FILE_OBJECT * pCCFileObject = NULL;
-                BOOLEAN bPurgeExtents = FALSE;
-
-                if ( pObjectInfo->DataVersion.QuadPart != pDirEnumEntry->DataVersion.QuadPart)
-                {
-
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                                  AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSVerifyEntry DV Change %wZ FID %08lX-%08lX-%08lX-%08lX (%08lX != %08lX)\n",
-                                  &DirEntry->NameInformation.FileName,
-                                  pObjectInfo->FileId.Cell,
-                                  pObjectInfo->FileId.Volume,
-                                  pObjectInfo->FileId.Vnode,
-                                  pObjectInfo->FileId.Unique,
-                                  pObjectInfo->DataVersion.LowPart,
-                                  pDirEnumEntry->DataVersion.LowPart
-                                  );
-
-                    bPurgeExtents = TRUE;
-                }
 
                 if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA))
                 {
 
-                    bPurgeExtents = TRUE;
-
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSVerifyEntry Clearing VERIFY_DATA flag %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                                   &DirEntry->NameInformation.FileName,
                                   pObjectInfo->FileId.Cell,
                                   pObjectInfo->FileId.Volume,
                                   pObjectInfo->FileId.Vnode,
-                                  pObjectInfo->FileId.Unique);
+                                  pObjectInfo->FileId.Unique));
 
                     ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
                 }
@@ -2938,14 +3086,29 @@ AFSVerifyEntry( IN GUID *AuthGroup,
                 if( pObjectInfo->Fcb != NULL)
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSVerifyEntry Flush/purge entry %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                                   &DirEntry->NameInformation.FileName,
                                   pObjectInfo->FileId.Cell,
                                   pObjectInfo->FileId.Volume,
                                   pObjectInfo->FileId.Vnode,
-                                  pObjectInfo->FileId.Unique);
+                                  pObjectInfo->FileId.Unique));
+
+                   AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                                 AFS_TRACE_LEVEL_VERBOSE,
+                                 "AFSVerifyEntry Acquiring Fcb lock %p EXCL %08lX\n",
+                                 &pObjectInfo->Fcb->NPFcb->Resource,
+                                 PsGetCurrentThread()));
+
+                   AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->Resource,
+                                   TRUE);
+
+                   AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+                                 AFS_TRACE_LEVEL_VERBOSE,
+                                 "AFSVerifyEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+                                 &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+                                 PsGetCurrentThread()));
 
                     AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
                                     TRUE);
@@ -2961,7 +3124,7 @@ AFSVerifyEntry( IN GUID *AuthGroup,
                         if( !NT_SUCCESS( stIoStatus.Status))
                         {
 
-                            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+                            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                                           AFS_TRACE_LEVEL_ERROR,
                                           "AFSVerifyEntry CcFlushCache failure %wZ FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX Bytes 0x%08lX\n",
                                           &DirEntry->NameInformation.FileName,
@@ -2970,13 +3133,12 @@ AFSVerifyEntry( IN GUID *AuthGroup,
                                           pObjectInfo->FileId.Vnode,
                                           pObjectInfo->FileId.Unique,
                                           stIoStatus.Status,
-                                          stIoStatus.Information);
+                                          stIoStatus.Information));
 
                             ntStatus = stIoStatus.Status;
                         }
 
-                        if ( bPurgeExtents &&
-                             pObjectInfo->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
+                       if ( pObjectInfo->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
                         {
 
                             if ( !CcPurgeCacheSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
@@ -2985,24 +3147,24 @@ AFSVerifyEntry( IN GUID *AuthGroup,
                                                        FALSE))
                             {
 
-                                AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+                                AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                                               AFS_TRACE_LEVEL_WARNING,
                                               "AFSVerifyEntry CcPurgeCacheSection failure %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                                               &DirEntry->NameInformation.FileName,
                                               pObjectInfo->FileId.Cell,
                                               pObjectInfo->FileId.Volume,
                                               pObjectInfo->FileId.Vnode,
-                                              pObjectInfo->FileId.Unique);
+                                              pObjectInfo->FileId.Unique));
 
                                 SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
                             }
                         }
                     }
-                    __except( EXCEPTION_EXECUTE_HANDLER)
+                   __except( EXCEPTION_EXECUTE_HANDLER)
                     {
                         ntStatus = GetExceptionCode();
 
-                        AFSDbgLogMsg( 0,
+                        AFSDbgTrace(( 0,
                                       0,
                                       "EXCEPTION - AFSVerifyEntry CcFlushCache or CcPurgeCacheSection %wZ FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
                                       &DirEntry->NameInformation.FileName,
@@ -3010,31 +3172,46 @@ AFSVerifyEntry( IN GUID *AuthGroup,
                                       pObjectInfo->FileId.Volume,
                                       pObjectInfo->FileId.Vnode,
                                       pObjectInfo->FileId.Unique,
-                                      ntStatus);
+                                      ntStatus));
 
                         SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
                     }
 
+                   AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+                                 AFS_TRACE_LEVEL_VERBOSE,
+                                 "AFSVerifyEntry Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+                                 &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+                                 PsGetCurrentThread()));
+
                     AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
 
-                    if ( bPurgeExtents)
-                    {
-                        AFSFlushExtents( pObjectInfo->Fcb,
-                                         AuthGroup);
-                    }
+                   if( !BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+                   {
 
-                    //
-                    // Reacquire the Fcb to purge the cache
-                    //
+                       AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                                     AFS_TRACE_LEVEL_VERBOSE,
+                                     "AFSVerifyEntry Releasing Fcb lock %p EXCL %08lX\n",
+                                     &pObjectInfo->Fcb->NPFcb->Resource,
+                                     PsGetCurrentThread()));
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
-                                  AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSVerifyEntry Acquiring Fcb lock %p EXCL %08lX\n",
-                                  &pObjectInfo->Fcb->NPFcb->Resource,
-                                  PsGetCurrentThread());
+                       AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->Resource);
 
-                    AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->Resource,
-                                    TRUE);
+                       AFSFlushExtents( pObjectInfo->Fcb,
+                                        AuthGroup);
+
+                       //
+                       // Acquire the Fcb to purge the cache
+                       //
+
+                       AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                                     AFS_TRACE_LEVEL_VERBOSE,
+                                     "AFSVerifyEntry Acquiring Fcb lock %p EXCL %08lX\n",
+                                     &pObjectInfo->Fcb->NPFcb->Resource,
+                                     PsGetCurrentThread()));
+
+                       AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->Resource,
+                                       TRUE);
+                   }
 
                     //
                     // Update the metadata for the entry
@@ -3046,7 +3223,7 @@ AFSVerifyEntry( IN GUID *AuthGroup,
                     if( !NT_SUCCESS( ntStatus))
                     {
 
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_ERROR,
                                       "AFSVerifyEntry Meta Data Update failed %wZ FID %08lX-%08lX-%08lX-%08lX ntStatus %08lX\n",
                                       &DirEntry->NameInformation.FileName,
@@ -3054,43 +3231,68 @@ AFSVerifyEntry( IN GUID *AuthGroup,
                                       pObjectInfo->FileId.Volume,
                                       pObjectInfo->FileId.Vnode,
                                       pObjectInfo->FileId.Unique,
-                                      ntStatus);
-
-                        break;
+                                      ntStatus));
                     }
-
-                    //
-                    // Update file sizes
-                    //
-
-                    pObjectInfo->Fcb->Header.AllocationSize.QuadPart  = pObjectInfo->AllocationSize.QuadPart;
-                    pObjectInfo->Fcb->Header.FileSize.QuadPart        = pObjectInfo->EndOfFile.QuadPart;
-                    pObjectInfo->Fcb->Header.ValidDataLength.QuadPart = pObjectInfo->EndOfFile.QuadPart;
-
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
-                                  AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSVerifyEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
-                                  &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
-                                  PsGetCurrentThread());
-
-                    AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
-                                    TRUE);
-
-                    pCCFileObject = CcGetFileObjectFromSectionPtrs( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers);
-
-                    if ( pCCFileObject != NULL)
-                    {
-                        CcSetFileSizes( pCCFileObject,
-                                        (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
+                   else
+                   {
+
+                       //
+                       // Update file sizes
+                       //
+
+                       pObjectInfo->Fcb->Header.AllocationSize.QuadPart  = pObjectInfo->AllocationSize.QuadPart;
+                       pObjectInfo->Fcb->Header.FileSize.QuadPart        = pObjectInfo->EndOfFile.QuadPart;
+                       pObjectInfo->Fcb->Header.ValidDataLength.QuadPart = pObjectInfo->EndOfFile.QuadPart;
+
+                       AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+                                     AFS_TRACE_LEVEL_VERBOSE,
+                                     "AFSVerifyEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+                                     &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+                                     PsGetCurrentThread()));
+
+                       AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+                                       TRUE);
+
+                       __try
+                       {
+
+                           pCCFileObject = CcGetFileObjectFromSectionPtrs( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers);
+
+                           if ( pCCFileObject != NULL)
+                           {
+                               CcSetFileSizes( pCCFileObject,
+                                               (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
+                           }
+                       }
+                       __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+                       {
+
+                           ntStatus = GetExceptionCode();
+
+                           AFSDbgTrace(( 0,
+                                         0,
+                                         "EXCEPTION - AFSVerifyEntry CcSetFileSized failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+                                         pObjectInfo->FileId.Cell,
+                                         pObjectInfo->FileId.Volume,
+                                         pObjectInfo->FileId.Vnode,
+                                         pObjectInfo->FileId.Unique,
+                                         ntStatus));
+                       }
+
+                       AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+                                     AFS_TRACE_LEVEL_VERBOSE,
+                                     "AFSVerifyEntry Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+                                     &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+                                     PsGetCurrentThread()));
+
+                       AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
                     }
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSVerifyEntry Releasing Fcb SectionObject lock %p EXCL %08lX\n",
-                                  &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
-                                  PsGetCurrentThread());
-
-                    AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
+                                 "AFSVerifyEntry Releasing Fcb lock %p EXCL %08lX\n",
+                                 &pObjectInfo->Fcb->NPFcb->Resource,
+                                  PsGetCurrentThread()));
 
                     AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->Resource);
                 }
@@ -3107,7 +3309,7 @@ AFSVerifyEntry( IN GUID *AuthGroup,
                     if( !NT_SUCCESS( ntStatus))
                     {
 
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_ERROR,
                                       "AFSVerifyEntry Meta Data Update failed %wZ FID %08lX-%08lX-%08lX-%08lX ntStatus %08lX\n",
                                       &DirEntry->NameInformation.FileName,
@@ -3115,23 +3317,35 @@ AFSVerifyEntry( IN GUID *AuthGroup,
                                       pObjectInfo->FileId.Volume,
                                       pObjectInfo->FileId.Vnode,
                                       pObjectInfo->FileId.Unique,
-                                      ntStatus);
-
-                        break;
+                                      ntStatus));
                     }
-
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                                  AFS_TRACE_LEVEL_WARNING,
-                                  "AFSVerifyEntry Fcb NULL %wZ FID %08lX-%08lX-%08lX-%08lX\n",
-                                  &DirEntry->NameInformation.FileName,
-                                  pObjectInfo->FileId.Cell,
-                                  pObjectInfo->FileId.Volume,
-                                  pObjectInfo->FileId.Vnode,
-                                  pObjectInfo->FileId.Unique);
+                   else
+                   {
+
+                       AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                     AFS_TRACE_LEVEL_WARNING,
+                                     "AFSVerifyEntry Fcb NULL %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                                     &DirEntry->NameInformation.FileName,
+                                     pObjectInfo->FileId.Cell,
+                                     pObjectInfo->FileId.Volume,
+                                     pObjectInfo->FileId.Vnode,
+                                     pObjectInfo->FileId.Unique));
+                   }
                 }
 
-                ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+               if ( NT_SUCCESS( ntStatus))
+               {
+
+                   AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                 AFS_TRACE_LEVEL_VERBOSE,
+                                 "AFSVerifyEntry File FID %08lX-%08lX-%08lX-%08lX Clearing Verify Flag\n",
+                                 pObjectInfo->FileId.Cell,
+                                 pObjectInfo->FileId.Volume,
+                                 pObjectInfo->FileId.Vnode,
+                                 pObjectInfo->FileId.Unique));
 
+                   ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+               }
                 break;
             }
 
@@ -3146,14 +3360,14 @@ AFSVerifyEntry( IN GUID *AuthGroup,
                 if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE_2,
                                   "AFSVerifyEntry Validating directory content for entry %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                                   &DirEntry->NameInformation.FileName,
                                   pObjectInfo->FileId.Cell,
                                   pObjectInfo->FileId.Volume,
                                   pObjectInfo->FileId.Vnode,
-                                  pObjectInfo->FileId.Unique);
+                                  pObjectInfo->FileId.Unique));
 
                     AFSAcquireExcl( pObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
                                     TRUE);
@@ -3180,6 +3394,14 @@ AFSVerifyEntry( IN GUID *AuthGroup,
                 if( NT_SUCCESS( ntStatus))
                 {
 
+                   AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                 AFS_TRACE_LEVEL_VERBOSE,
+                                 "AFSVerifyEntry Directory FID %08lX-%08lX-%08lX-%08lX Clearing Verify Flag\n",
+                                 pObjectInfo->FileId.Cell,
+                                 pObjectInfo->FileId.Volume,
+                                 pObjectInfo->FileId.Vnode,
+                                 pObjectInfo->FileId.Unique));
+
                     ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
                 }
 
@@ -3240,6 +3462,14 @@ AFSVerifyEntry( IN GUID *AuthGroup,
                 if( NT_SUCCESS( ntStatus))
                 {
 
+                   AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                 AFS_TRACE_LEVEL_VERBOSE,
+                                 "AFSVerifyEntry DFSLink FID %08lX-%08lX-%08lX-%08lX Clearing Verify Flag\n",
+                                 pObjectInfo->FileId.Cell,
+                                 pObjectInfo->FileId.Volume,
+                                 pObjectInfo->FileId.Vnode,
+                                 pObjectInfo->FileId.Unique));
+
                     ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
                 }
 
@@ -3248,7 +3478,7 @@ AFSVerifyEntry( IN GUID *AuthGroup,
 
             default:
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_WARNING,
                               "AFSVerifyEntry Attempt to verify node of type %d %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                               pObjectInfo->FileType,
@@ -3256,7 +3486,7 @@ AFSVerifyEntry( IN GUID *AuthGroup,
                               pObjectInfo->FileId.Cell,
                               pObjectInfo->FileId.Volume,
                               pObjectInfo->FileId.Vnode,
-                              pObjectInfo->FileId.Unique);
+                              pObjectInfo->FileId.Unique));
 
                 break;
         }
@@ -3286,22 +3516,22 @@ AFSSetVolumeState( IN AFSVolumeStatusCB *VolumeStatus)
     __Enter
     {
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSSetVolumeState Marking volume state %d Volume Cell %08lX Volume %08lX\n",
                       VolumeStatus->Online,
                       VolumeStatus->FileID.Cell,
-                      VolumeStatus->FileID.Volume);
+                      VolumeStatus->FileID.Volume));
 
         //
         // Need to locate the Fcb for the directory to purge
         //
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSSetVolumeState Acquiring RDR VolumeTreeLock lock %p SHARED %08lX\n",
                       &pDevExt->Specific.RDR.VolumeTreeLock,
-                      PsGetCurrentThread());
+                      PsGetCurrentThread()));
 
         AFSAcquireShared( &pDevExt->Specific.RDR.VolumeTreeLock, TRUE);
 
@@ -3321,11 +3551,11 @@ AFSSetVolumeState( IN AFSVolumeStatusCB *VolumeStatus)
             lCount = AFSVolumeIncrement( pVolumeCB,
                                          AFS_VOLUME_REFERENCE_INVALIDATE);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSSetVolumeState Increment count on volume %p Cnt %d\n",
                           pVolumeCB,
-                          lCount);
+                          lCount));
 
             AFSReleaseResource( &pDevExt->Specific.RDR.VolumeTreeLock);
 
@@ -3405,22 +3635,22 @@ AFSValidateDirectoryCache( IN AFSObjectInfoCB *ObjectInfo,
     __Enter
     {
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSValidateDirectoryCache Validating content for FID %08lX-%08lX-%08lX-%08lX\n",
                       ObjectInfo->FileId.Cell,
                       ObjectInfo->FileId.Volume,
                       ObjectInfo->FileId.Vnode,
-                      ObjectInfo->FileId.Unique);
+                      ObjectInfo->FileId.Unique));
 
         if( !ExIsResourceAcquiredLite( ObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSValidateDirectoryCache Acquiring DirectoryNodeHdr.TreeLock lock %p EXCL %08lX\n",
                           ObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
-                          PsGetCurrentThread());
+                          PsGetCurrentThread()));
 
             AFSAcquireExcl( ObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
                             TRUE);
@@ -3436,14 +3666,14 @@ AFSValidateDirectoryCache( IN AFSObjectInfoCB *ObjectInfo,
              ObjectInfo->Specific.Directory.DirectoryNodeCount > 0)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSValidateDirectoryCache Empty Node List but Non-Zero Node Count %d for dir FID %08lX-%08lX-%08lX-%08lX\n",
                           ObjectInfo->Specific.Directory.DirectoryNodeCount,
                           ObjectInfo->FileId.Cell,
                           ObjectInfo->FileId.Volume,
                           ObjectInfo->FileId.Vnode,
-                          ObjectInfo->FileId.Unique);
+                          ObjectInfo->FileId.Unique));
         }
 
         //
@@ -3465,28 +3695,29 @@ AFSValidateDirectoryCache( IN AFSObjectInfoCB *ObjectInfo,
                 //
 
                 if( BooleanFlagOn( pCurrentDirEntry->Flags, AFS_DIR_ENTRY_DELETED) &&
-                    pCurrentDirEntry->DirOpenReferenceCount <= 0)
+                    pCurrentDirEntry->DirOpenReferenceCount <= 0 &&
+                    pCurrentDirEntry->NameArrayReferenceCount <= 0)
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSValidateDirectoryCache Deleting dir entry %p name %wZ\n",
                                   pCurrentDirEntry,
-                                  &pCurrentDirEntry->NameInformation.FileName);
+                                  &pCurrentDirEntry->NameInformation.FileName));
 
                     AFSDeleteDirEntry( ObjectInfo,
-                                       pCurrentDirEntry);
+                                       &pCurrentDirEntry);
                 }
                 else
                 {
 
                     ClearFlag( pCurrentDirEntry->Flags, AFS_DIR_ENTRY_VALID);
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSValidateDirectoryCache Clear VALID flag on DE %p Reference count %d\n",
                                   pCurrentDirEntry,
-                                  pCurrentDirEntry->DirOpenReferenceCount);
+                                  pCurrentDirEntry->DirOpenReferenceCount));
 
                     //
                     // We pull the short name from the parent tree since it could change below
@@ -3495,12 +3726,12 @@ AFSValidateDirectoryCache( IN AFSObjectInfoCB *ObjectInfo,
                     if( BooleanFlagOn( pCurrentDirEntry->Flags, AFS_DIR_ENTRY_INSERTED_SHORT_NAME))
                     {
 
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_VERBOSE,
                                       "AFSValidateDirectoryCache Removing DE %p (%08lX) from shortname tree for %wZ\n",
                                       pCurrentDirEntry,
                                       pCurrentDirEntry->Type.Data.ShortNameTreeEntry.HashIndex,
-                                      &pCurrentDirEntry->NameInformation.FileName);
+                                      &pCurrentDirEntry->NameInformation.FileName));
 
                         AFSRemoveShortNameDirEntry( &ObjectInfo->Specific.Directory.ShortNameTree,
                                                     pCurrentDirEntry);
@@ -3549,11 +3780,11 @@ AFSValidateDirectoryCache( IN AFSObjectInfoCB *ObjectInfo,
 
                         ObjectInfo->Specific.Directory.ShortNameTree = pCurrentDirEntry;
 
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_VERBOSE,
                                       "AFSValidateDirectoryCache Insert DE %p to head of shortname tree for %wZ\n",
                                       pCurrentDirEntry,
-                                      &pCurrentDirEntry->NameInformation.FileName);
+                                      &pCurrentDirEntry->NameInformation.FileName));
 
                         SetFlag( pCurrentDirEntry->Flags, AFS_DIR_ENTRY_INSERTED_SHORT_NAME);
                     }
@@ -3563,22 +3794,22 @@ AFSValidateDirectoryCache( IN AFSObjectInfoCB *ObjectInfo,
                         if( !NT_SUCCESS( AFSInsertShortNameDirEntry( ObjectInfo->Specific.Directory.ShortNameTree,
                                                                      pCurrentDirEntry)))
                         {
-                            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                           AFS_TRACE_LEVEL_VERBOSE,
                                           "AFSValidateDirectoryCache Failed to insert DE %p (%08lX) to shortname tree for %wZ\n",
                                           pCurrentDirEntry,
                                           pCurrentDirEntry->Type.Data.ShortNameTreeEntry.HashIndex,
-                                          &pCurrentDirEntry->NameInformation.FileName);
+                                          &pCurrentDirEntry->NameInformation.FileName));
                         }
                         else
                         {
                             SetFlag( pCurrentDirEntry->Flags, AFS_DIR_ENTRY_INSERTED_SHORT_NAME);
 
-                            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                           AFS_TRACE_LEVEL_VERBOSE,
                                           "AFSValidateDirectoryCache Insert DE %p to shortname tree for %wZ\n",
                                           pCurrentDirEntry,
-                                          &pCurrentDirEntry->NameInformation.FileName);
+                                          &pCurrentDirEntry->NameInformation.FileName));
                         }
                     }
                 }
@@ -3588,31 +3819,32 @@ AFSValidateDirectoryCache( IN AFSObjectInfoCB *ObjectInfo,
                 continue;
             }
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSValidateDirectoryCache Processing INVALID DE %p Reference count %d\n",
                           pCurrentDirEntry,
-                          pCurrentDirEntry->DirOpenReferenceCount);
+                          pCurrentDirEntry->DirOpenReferenceCount));
 
-            if( pCurrentDirEntry->DirOpenReferenceCount <= 0)
+            if( pCurrentDirEntry->DirOpenReferenceCount <= 0 &&
+                pCurrentDirEntry->NameArrayReferenceCount <= 0)
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSValidateDirectoryCache Deleting dir entry %wZ from parent FID %08lX-%08lX-%08lX-%08lX\n",
                               &pCurrentDirEntry->NameInformation.FileName,
                               ObjectInfo->FileId.Cell,
                               ObjectInfo->FileId.Volume,
                               ObjectInfo->FileId.Vnode,
-                              ObjectInfo->FileId.Unique);
+                              ObjectInfo->FileId.Unique));
 
                 AFSDeleteDirEntry( ObjectInfo,
-                                   pCurrentDirEntry);
+                                   &pCurrentDirEntry);
             }
             else
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSValidateDirectoryCache Setting dir entry %p Name %wZ DELETED in parent FID %08lX-%08lX-%08lX-%08lX\n",
                               pCurrentDirEntry,
@@ -3620,7 +3852,7 @@ AFSValidateDirectoryCache( IN AFSObjectInfoCB *ObjectInfo,
                               ObjectInfo->FileId.Cell,
                               ObjectInfo->FileId.Volume,
                               ObjectInfo->FileId.Vnode,
-                              ObjectInfo->FileId.Unique);
+                              ObjectInfo->FileId.Unique));
 
                 SetFlag( pCurrentDirEntry->Flags, AFS_DIR_ENTRY_DELETED);
 
@@ -3726,17 +3958,26 @@ AFSUpdateMetaData( IN AFSDirectoryCB *DirEntry,
 
         pObjectInfo->FileAttributes = DirEnumEntry->FileAttributes;
 
-        if( pObjectInfo->FileType == AFS_FILE_TYPE_MOUNTPOINT)
+        if( pObjectInfo->FileType == AFS_FILE_TYPE_MOUNTPOINT ||
+            pObjectInfo->FileType == AFS_FILE_TYPE_DFSLINK)
         {
 
-            pObjectInfo->FileAttributes = (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_REPARSE_POINT);
+            pObjectInfo->FileAttributes |= (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_REPARSE_POINT);
         }
 
-        if( pObjectInfo->FileType == AFS_FILE_TYPE_SYMLINK ||
-            pObjectInfo->FileType == AFS_FILE_TYPE_DFSLINK)
+        if( pObjectInfo->FileType == AFS_FILE_TYPE_SYMLINK)
         {
 
-            pObjectInfo->FileAttributes = FILE_ATTRIBUTE_REPARSE_POINT;
+            if ( pObjectInfo->FileAttributes == FILE_ATTRIBUTE_NORMAL)
+            {
+
+                pObjectInfo->FileAttributes = FILE_ATTRIBUTE_REPARSE_POINT;
+            }
+            else
+            {
+
+                pObjectInfo->FileAttributes |= FILE_ATTRIBUTE_REPARSE_POINT;
+            }
         }
 
         pObjectInfo->EaSize = DirEnumEntry->EaSize;
@@ -3825,6 +4066,7 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
 {
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
+    AFSDeviceExt *pRDRDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
     LARGE_INTEGER liSystemTime;
     AFSDirEnumEntry *pDirEnumEntry = NULL;
     AFSFcb *pCurrentFcb = NULL;
@@ -3839,7 +4081,7 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
         // correct order
         //
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE_2,
                       "AFSValidateEntry Validating entry %wZ FID %08lX-%08lX-%08lX-%08lX FastCall %u\n",
                       &DirEntry->NameInformation.FileName,
@@ -3847,7 +4089,7 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
                       pObjectInfo->FileId.Volume,
                       pObjectInfo->FileId.Vnode,
                       pObjectInfo->FileId.Unique,
-                      FastCall);
+                      FastCall));
 
         //
         // If this is a fake node then bail since the service knows nothing about it
@@ -3874,14 +4116,14 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
             pObjectInfo->Expiration.QuadPart >= liSystemTime.QuadPart)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE_2,
                           "AFSValidateEntry Directory entry %wZ FID %08lX-%08lX-%08lX-%08lX VALID\n",
                           &DirEntry->NameInformation.FileName,
                           pObjectInfo->FileId.Cell,
                           pObjectInfo->FileId.Volume,
                           pObjectInfo->FileId.Vnode,
-                          pObjectInfo->FileId.Unique);
+                          pObjectInfo->FileId.Unique));
 
             try_return( ntStatus);
         }
@@ -3898,7 +4140,7 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSValidateEntry Failed to evaluate entry FastCall %d %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                           FastCall,
@@ -3907,7 +4149,7 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
                           pObjectInfo->FileId.Volume,
                           pObjectInfo->FileId.Vnode,
                           pObjectInfo->FileId.Unique,
-                          ntStatus);
+                          ntStatus));
 
             //
             // Failed validation of node so return access-denied
@@ -3916,7 +4158,7 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
             try_return( ntStatus);
         }
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSValidateEntry Validating entry FastCall %d %wZ FID %08lX-%08lX-%08lX-%08lX DV %I64X returned DV %I64X FT %d\n",
                       FastCall,
@@ -3927,7 +4169,7 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
                       pObjectInfo->FileId.Unique,
                       pObjectInfo->DataVersion.QuadPart,
                       pDirEnumEntry->DataVersion.QuadPart,
-                      pDirEnumEntry->FileType);
+                      pDirEnumEntry->FileType));
 
 
         //
@@ -3950,6 +4192,14 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
                 if( NT_SUCCESS( ntStatus))
                 {
 
+                   AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                 AFS_TRACE_LEVEL_VERBOSE,
+                                 "AFSValidateEntry MountPoint FID %08lX-%08lX-%08lX-%08lX Clearing Verify Flag\n",
+                                 pObjectInfo->FileId.Cell,
+                                 pObjectInfo->FileId.Volume,
+                                 pObjectInfo->FileId.Vnode,
+                                 pObjectInfo->FileId.Unique));
+
                     ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY | AFS_OBJECT_FLAGS_NOT_EVALUATED);
                 }
 
@@ -3970,6 +4220,14 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
                 if( NT_SUCCESS( ntStatus))
                 {
 
+                   AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                 AFS_TRACE_LEVEL_VERBOSE,
+                                 "AFSValidateEntry Symlink FID %08lX-%08lX-%08lX-%08lX Clearing Verify Flag\n",
+                                 pObjectInfo->FileId.Cell,
+                                 pObjectInfo->FileId.Volume,
+                                 pObjectInfo->FileId.Vnode,
+                                 pObjectInfo->FileId.Unique));
+
                     ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY | AFS_OBJECT_FLAGS_NOT_EVALUATED);
                 }
 
@@ -3997,183 +4255,175 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
                     if( !ExIsResourceAcquiredLite( &pCurrentFcb->NPFcb->Resource))
                     {
 
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                        AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                                       AFS_TRACE_LEVEL_VERBOSE,
                                       "AFSValidateEntry Acquiring Fcb lock %p EXCL %08lX\n",
                                       &pCurrentFcb->NPFcb->Resource,
-                                      PsGetCurrentThread());
+                                      PsGetCurrentThread()));
 
                         AFSAcquireExcl( &pCurrentFcb->NPFcb->Resource,
                                         TRUE);
 
-                        bReleaseFcb = TRUE;
-                    }
-
-                    if( pCurrentFcb != NULL)
-                    {
-
-                        IO_STATUS_BLOCK stIoStatus;
-
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                                      AFS_TRACE_LEVEL_VERBOSE_2,
-                                      "AFSValidateEntry Flush/purge entry %wZ FID %08lX-%08lX-%08lX-%08lX\n",
-                                      &DirEntry->NameInformation.FileName,
-                                      pObjectInfo->FileId.Cell,
-                                      pObjectInfo->FileId.Volume,
-                                      pObjectInfo->FileId.Vnode,
-                                      pObjectInfo->FileId.Unique);
-
-                        if ( pObjectInfo->DataVersion.QuadPart != pDirEnumEntry->DataVersion.QuadPart)
-                        {
-
-                            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                                          AFS_TRACE_LEVEL_VERBOSE,
-                                          "AFSValidateEntry DV Change %wZ FID %08lX-%08lX-%08lX-%08lX (%08lX != %08lX)\n",
-                                          &DirEntry->NameInformation.FileName,
-                                          pObjectInfo->FileId.Cell,
-                                          pObjectInfo->FileId.Volume,
-                                          pObjectInfo->FileId.Vnode,
-                                          pObjectInfo->FileId.Unique,
-                                          pObjectInfo->DataVersion.LowPart,
-                                          pDirEnumEntry->DataVersion.LowPart
-                                          );
-
-                            bPurgeExtents = TRUE;
-                        }
-
-                        if ( bSafeToPurge)
-                        {
-
-                            if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA))
-                            {
-                                bPurgeExtents = TRUE;
-
-                                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                                              AFS_TRACE_LEVEL_VERBOSE,
-                                              "AFSVerifyEntry Clearing VERIFY_DATA flag %wZ FID %08lX-%08lX-%08lX-%08lX\n",
-                                              &DirEntry->NameInformation.FileName,
-                                              pObjectInfo->FileId.Cell,
-                                              pObjectInfo->FileId.Volume,
-                                              pObjectInfo->FileId.Vnode,
-                                              pObjectInfo->FileId.Unique);
-
-                                ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
-                            }
-
-                            AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
-                                          AFS_TRACE_LEVEL_VERBOSE,
-                                          "AFSValidateEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
-                                          &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
-                                          PsGetCurrentThread());
-
-                            AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
-                                            TRUE);
-
-                            //
-                            // Release Fcb->Resource to avoid Trend Micro deadlock
-                            //
-
-                            AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->Resource);
-
-                            __try
-                            {
-
-                                CcFlushCache( &pCurrentFcb->NPFcb->SectionObjectPointers,
-                                              NULL,
-                                              0,
-                                              &stIoStatus);
-
-                                if( !NT_SUCCESS( stIoStatus.Status))
-                                {
-
-                                    AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
-                                                  AFS_TRACE_LEVEL_ERROR,
-                                                  "AFSValidateEntry CcFlushCache failure %wZ FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX Bytes 0x%08lX\n",
-                                                  &DirEntry->NameInformation.FileName,
-                                                  pObjectInfo->FileId.Cell,
-                                                  pObjectInfo->FileId.Volume,
-                                                  pObjectInfo->FileId.Vnode,
-                                                  pObjectInfo->FileId.Unique,
-                                                  stIoStatus.Status,
-                                                  stIoStatus.Information);
-
-                                    ntStatus = stIoStatus.Status;
-                                }
-
-                                if ( bPurgeExtents &&
-                                     pObjectInfo->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
-                                {
-
-                                    if ( !CcPurgeCacheSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
-                                                               NULL,
-                                                               0,
-                                                               FALSE))
-                                    {
-
-                                        AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
-                                                      AFS_TRACE_LEVEL_WARNING,
-                                                      "AFSValidateEntry CcPurgeCacheSection failure %wZ FID %08lX-%08lX-%08lX-%08lX\n",
-                                                      &DirEntry->NameInformation.FileName,
-                                                      pObjectInfo->FileId.Cell,
-                                                      pObjectInfo->FileId.Volume,
-                                                      pObjectInfo->FileId.Vnode,
-                                                      pObjectInfo->FileId.Unique);
-
-                                        SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
-                                    }
-                                }
-                            }
-                            __except( EXCEPTION_EXECUTE_HANDLER)
-                            {
-                                ntStatus = GetExceptionCode();
-
-                                AFSDbgLogMsg( 0,
-                                              0,
-                                              "EXCEPTION - AFSValidateEntry CcFlushCache or CcPurgeCacheSection %wZ FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
-                                              &DirEntry->NameInformation.FileName,
-                                              pObjectInfo->FileId.Cell,
-                                              pObjectInfo->FileId.Volume,
-                                              pObjectInfo->FileId.Vnode,
-                                              pObjectInfo->FileId.Unique,
-                                              ntStatus);
-
-                                SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
-                            }
-
-                            AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
-                                          AFS_TRACE_LEVEL_VERBOSE,
-                                          "AFSValidateEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
-                                          &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
-                                          PsGetCurrentThread());
-
-                            AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
-
-                            AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->Resource,
-                                            TRUE);
-                        }
-                        else
-                        {
-
-                            if ( bPurgeExtents)
-                            {
-
-                                SetFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
-                            }
-                        }
-
-
-                        AFSReleaseResource( &pCurrentFcb->NPFcb->Resource);
-
-                        bReleaseFcb = FALSE;
-
-                        if ( bPurgeExtents &&
-                             bSafeToPurge)
-                        {
-                            AFSFlushExtents( pCurrentFcb,
-                                             AuthGroup);
-                        }
-                    }
-                }
+                       bReleaseFcb = TRUE;
+                   }
+
+                   AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                 AFS_TRACE_LEVEL_VERBOSE_2,
+                                 "AFSValidateEntry Flush/purge entry %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                                 &DirEntry->NameInformation.FileName,
+                                 pObjectInfo->FileId.Cell,
+                                 pObjectInfo->FileId.Volume,
+                                 pObjectInfo->FileId.Vnode,
+                                 pObjectInfo->FileId.Unique));
+
+                   if ( pObjectInfo->DataVersion.QuadPart != pDirEnumEntry->DataVersion.QuadPart)
+                   {
+
+                       AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                     AFS_TRACE_LEVEL_VERBOSE,
+                                     "AFSValidateEntry DV Change %wZ FID %08lX-%08lX-%08lX-%08lX (%08lX != %08lX)\n",
+                                     &DirEntry->NameInformation.FileName,
+                                     pObjectInfo->FileId.Cell,
+                                     pObjectInfo->FileId.Volume,
+                                     pObjectInfo->FileId.Vnode,
+                                     pObjectInfo->FileId.Unique,
+                                     pObjectInfo->DataVersion.LowPart,
+                                     pDirEnumEntry->DataVersion.LowPart));
+
+                       bPurgeExtents = TRUE;
+                   }
+
+                   if ( bSafeToPurge)
+                   {
+
+                       if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA))
+                       {
+                           bPurgeExtents = TRUE;
+
+                           AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                         AFS_TRACE_LEVEL_VERBOSE,
+                                         "AFSVerifyEntry Clearing VERIFY_DATA flag %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                                         &DirEntry->NameInformation.FileName,
+                                         pObjectInfo->FileId.Cell,
+                                         pObjectInfo->FileId.Volume,
+                                         pObjectInfo->FileId.Vnode,
+                                         pObjectInfo->FileId.Unique));
+
+                           ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
+                       }
+
+                       AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+                                     AFS_TRACE_LEVEL_VERBOSE,
+                                     "AFSValidateEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+                                     &pCurrentFcb->NPFcb->SectionObjectResource,
+                                     PsGetCurrentThread()));
+
+                       AFSAcquireExcl( &pCurrentFcb->NPFcb->SectionObjectResource,
+                                       TRUE);
+
+                       __try
+                       {
+
+                           IO_STATUS_BLOCK stIoStatus;
+
+                           CcFlushCache( &pCurrentFcb->NPFcb->SectionObjectPointers,
+                                         NULL,
+                                         0,
+                                         &stIoStatus);
+
+                           if( !NT_SUCCESS( stIoStatus.Status))
+                           {
+
+                               AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+                                             AFS_TRACE_LEVEL_ERROR,
+                                             "AFSValidateEntry CcFlushCache failure %wZ FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX Bytes 0x%08lX\n",
+                                             &DirEntry->NameInformation.FileName,
+                                             pObjectInfo->FileId.Cell,
+                                             pObjectInfo->FileId.Volume,
+                                             pObjectInfo->FileId.Vnode,
+                                             pObjectInfo->FileId.Unique,
+                                             stIoStatus.Status,
+                                             stIoStatus.Information));
+
+                               ntStatus = stIoStatus.Status;
+                           }
+
+                           if ( bPurgeExtents &&
+                                pCurrentFcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
+                           {
+
+                               if ( !CcPurgeCacheSection( &pCurrentFcb->NPFcb->SectionObjectPointers,
+                                                          NULL,
+                                                          0,
+                                                          FALSE))
+                               {
+
+                                   AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+                                                 AFS_TRACE_LEVEL_WARNING,
+                                                 "AFSValidateEntry CcPurgeCacheSection failure %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                                                 &DirEntry->NameInformation.FileName,
+                                                 pObjectInfo->FileId.Cell,
+                                                 pObjectInfo->FileId.Volume,
+                                                 pObjectInfo->FileId.Vnode,
+                                                 pObjectInfo->FileId.Unique));
+
+                                   SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
+                               }
+                           }
+                       }
+                       __except( EXCEPTION_EXECUTE_HANDLER)
+                       {
+                           ntStatus = GetExceptionCode();
+
+                           AFSDbgTrace(( 0,
+                                         0,
+                                         "EXCEPTION - AFSValidateEntry CcFlushCache or CcPurgeCacheSection %wZ FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+                                         &DirEntry->NameInformation.FileName,
+                                         pObjectInfo->FileId.Cell,
+                                         pObjectInfo->FileId.Volume,
+                                         pObjectInfo->FileId.Vnode,
+                                         pObjectInfo->FileId.Unique,
+                                         ntStatus));
+
+                           SetFlag( pCurrentFcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
+                       }
+
+                       AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+                                     AFS_TRACE_LEVEL_VERBOSE,
+                                     "AFSValidateEntry Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+                                     &pCurrentFcb->NPFcb->SectionObjectResource,
+                                     PsGetCurrentThread()));
+
+                       AFSReleaseResource( &pCurrentFcb->NPFcb->SectionObjectResource);
+                   }
+                   else
+                   {
+
+                       if ( bPurgeExtents)
+                       {
+
+                           SetFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
+                       }
+                   }
+
+                   if (bReleaseFcb)
+                   {
+                       AFSReleaseResource( &pCurrentFcb->NPFcb->Resource);
+
+                       bReleaseFcb = FALSE;
+                   }
+
+                   if ( bPurgeExtents &&
+                        bSafeToPurge)
+                   {
+
+                       if( !BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+                       {
+                           AFSFlushExtents( pCurrentFcb,
+                                            AuthGroup);
+                       }
+                   }
+               }
 
                 //
                 // Update the metadata for the entry but only if it is safe to do so.
@@ -4193,7 +4443,7 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
                     if( !NT_SUCCESS( ntStatus))
                     {
 
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_ERROR,
                                       "AFSValidateEntry Meta Data Update failed %wZ FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
                                       &DirEntry->NameInformation.FileName,
@@ -4201,11 +4451,19 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
                                       pObjectInfo->FileId.Volume,
                                       pObjectInfo->FileId.Vnode,
                                       pObjectInfo->FileId.Unique,
-                                      ntStatus);
+                                      ntStatus));
 
                         break;
                     }
 
+                   AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                 AFS_TRACE_LEVEL_VERBOSE,
+                                 "AFSValidateEntry File FID %08lX-%08lX-%08lX-%08lX No Purge Clearing Verify Flag\n",
+                                 pObjectInfo->FileId.Cell,
+                                 pObjectInfo->FileId.Volume,
+                                 pObjectInfo->FileId.Vnode,
+                                 pObjectInfo->FileId.Unique));
+
                     ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY | AFS_OBJECT_FLAGS_NOT_EVALUATED);
 
                     //
@@ -4216,32 +4474,50 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
                     {
                         FILE_OBJECT *pCCFileObject;
 
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                       AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
                                       AFS_TRACE_LEVEL_VERBOSE,
                                       "AFSValidateEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
                                       &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
-                                      PsGetCurrentThread());
+                                      PsGetCurrentThread()));
 
                         AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
                                         TRUE);
 
-                        pCCFileObject = CcGetFileObjectFromSectionPtrs( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers);
+                       __try
+                       {
 
-                        pObjectInfo->Fcb->Header.AllocationSize.QuadPart  = pObjectInfo->AllocationSize.QuadPart;
-                        pObjectInfo->Fcb->Header.FileSize.QuadPart        = pObjectInfo->EndOfFile.QuadPart;
-                        pObjectInfo->Fcb->Header.ValidDataLength.QuadPart = pObjectInfo->EndOfFile.QuadPart;
+                           pCCFileObject = CcGetFileObjectFromSectionPtrs( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers);
 
-                        if ( pCCFileObject != NULL)
+                           pObjectInfo->Fcb->Header.AllocationSize.QuadPart  = pObjectInfo->AllocationSize.QuadPart;
+                           pObjectInfo->Fcb->Header.FileSize.QuadPart        = pObjectInfo->EndOfFile.QuadPart;
+                           pObjectInfo->Fcb->Header.ValidDataLength.QuadPart = pObjectInfo->EndOfFile.QuadPart;
+
+                           if ( pCCFileObject != NULL)
+                           {
+                               CcSetFileSizes( pCCFileObject,
+                                               (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
+                           }
+                       }
+                       __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
                         {
-                            CcSetFileSizes( pCCFileObject,
-                                            (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
+
+                           ntStatus = GetExceptionCode();
+
+                           AFSDbgTrace(( 0,
+                                         0,
+                                         "EXCEPTION - AFSValidateEntry CcSetFileSizes failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+                                         pObjectInfo->FileId.Cell,
+                                         pObjectInfo->FileId.Volume,
+                                         pObjectInfo->FileId.Vnode,
+                                         pObjectInfo->FileId.Unique,
+                                         ntStatus));
                         }
 
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                       AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
                                       AFS_TRACE_LEVEL_VERBOSE,
                                       "AFSValidateEntry Releasing Fcb SectionObject lock %p EXCL %08lX\n",
                                       &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
-                                      PsGetCurrentThread());
+                                      PsGetCurrentThread()));
 
                         AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
                     }
@@ -4260,23 +4536,23 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
                     // the directory enumeration.
                     //
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSValidateEntry Acquiring DirectoryNodeHdr.TreeLock lock %p EXCL %08lX\n",
                                   pObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
-                                  PsGetCurrentThread());
+                                  PsGetCurrentThread()));
 
                     if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
                     {
 
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_VERBOSE_2,
                                       "AFSValidateEntry Validating directory content for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                                       &DirEntry->NameInformation.FileName,
                                       pObjectInfo->FileId.Cell,
                                       pObjectInfo->FileId.Volume,
                                       pObjectInfo->FileId.Vnode,
-                                      pObjectInfo->FileId.Unique);
+                                      pObjectInfo->FileId.Unique));
 
                         AFSAcquireExcl( pObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
                                         TRUE);
@@ -4290,7 +4566,7 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
                     if( !NT_SUCCESS( ntStatus))
                     {
 
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_ERROR,
                                       "AFSValidateEntry Failed to re-enumerate %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                                       &DirEntry->NameInformation.FileName,
@@ -4298,7 +4574,7 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
                                       pObjectInfo->FileId.Volume,
                                       pObjectInfo->FileId.Vnode,
                                       pObjectInfo->FileId.Unique,
-                                      ntStatus);
+                                      ntStatus));
 
                         break;
                     }
@@ -4314,6 +4590,14 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
                 if( NT_SUCCESS( ntStatus))
                 {
 
+                   AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                 AFS_TRACE_LEVEL_VERBOSE,
+                                 "AFSValidateEntry Directory FID %08lX-%08lX-%08lX-%08lX Clearing Verify Flag\n",
+                                 pObjectInfo->FileId.Cell,
+                                 pObjectInfo->FileId.Volume,
+                                 pObjectInfo->FileId.Vnode,
+                                 pObjectInfo->FileId.Unique));
+
                     ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY | AFS_OBJECT_FLAGS_NOT_EVALUATED);
                 }
 
@@ -4322,7 +4606,7 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
 
             default:
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_WARNING,
                               "AFSValidateEntry Attempt to verify node of type %d FastCall %d %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                               pObjectInfo->FileType,
@@ -4331,7 +4615,7 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
                               pObjectInfo->FileId.Cell,
                               pObjectInfo->FileId.Volume,
                               pObjectInfo->FileId.Vnode,
-                              pObjectInfo->FileId.Unique);
+                              pObjectInfo->FileId.Unique));
 
                 break;
         }
@@ -4384,11 +4668,11 @@ AFSInitializeSpecialShareNameList()
         lCount = AFSObjectInfoIncrement( pObjectInfoCB,
                                          AFS_OBJECT_REFERENCE_GLOBAL);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSInitializeSpecialShareNameList (srvsvc) Increment count on object %p Cnt %d\n",
                       pObjectInfoCB,
-                      lCount);
+                      lCount));
 
         pObjectInfoCB->FileType = (ULONG) AFS_FILE_TYPE_SPECIAL_SHARE_NAME;
 
@@ -4402,15 +4686,28 @@ AFSInitializeSpecialShareNameList()
         if( pDirNode == NULL)
         {
 
-            AFSDeleteObjectInfo( &pObjectInfoCB);
+            lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+                                             AFS_OBJECT_REFERENCE_GLOBAL);
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSInitializeSpecialShareNameList Decrement count on object %p Cnt %d\n",
+                          pObjectInfoCB,
+                          lCount));
+
+            if ( lCount == 0)
+            {
+
+                AFSDeleteObjectInfo( &pObjectInfoCB);
+            }
 
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+        AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSInitializeSpecialShareNameList (srvsvc) AFS_DIR_ENTRY_TAG allocated %p\n",
-                      pDirNode);
+                      pDirNode));
 
         pNonPagedDirEntry = (AFSNonPagedDirectoryCB *)AFSLibExAllocatePoolWithTag( NonPagedPool,
                                                                                    sizeof( AFSNonPagedDirectoryCB),
@@ -4419,9 +4716,23 @@ AFSInitializeSpecialShareNameList()
         if( pNonPagedDirEntry == NULL)
         {
 
-            ExFreePool( pDirNode);
+           AFSLibExFreePoolWithTag( pDirNode,
+                                    AFS_DIR_ENTRY_TAG);
+
+            lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+                                             AFS_OBJECT_REFERENCE_GLOBAL);
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSInitializeSpecialShareNameList Decrement count on object %p Cnt %d\n",
+                          pObjectInfoCB,
+                          lCount));
+
+            if ( lCount == 0)
+            {
 
-            AFSDeleteObjectInfo( &pObjectInfoCB);
+                AFSDeleteObjectInfo( &pObjectInfoCB);
+            }
 
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
@@ -4477,11 +4788,11 @@ AFSInitializeSpecialShareNameList()
         lCount = AFSObjectInfoIncrement( pObjectInfoCB,
                                          AFS_OBJECT_REFERENCE_GLOBAL);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSInitializeSpecialShareNameList (ipc$) Incrementing count on object %p Cnt %d\n",
                       pObjectInfoCB,
-                      lCount);
+                      lCount));
 
         pObjectInfoCB->FileType = (ULONG) AFS_FILE_TYPE_SPECIAL_SHARE_NAME;
 
@@ -4495,15 +4806,28 @@ AFSInitializeSpecialShareNameList()
         if( pDirNode == NULL)
         {
 
-            AFSDeleteObjectInfo( &pObjectInfoCB);
+            lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+                                             AFS_OBJECT_REFERENCE_GLOBAL);
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSInitializeSpecialShareNameList Decrement count on object %p Cnt %d\n",
+                          pObjectInfoCB,
+                          lCount));
+
+            if ( lCount == 0)
+            {
+
+                AFSDeleteObjectInfo( &pObjectInfoCB);
+            }
 
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+        AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSInitializeSpecialShareNameList (ipc$) AFS_DIR_ENTRY_TAG allocated %p\n",
-                      pDirNode);
+                      pDirNode));
 
         pNonPagedDirEntry = (AFSNonPagedDirectoryCB *)AFSLibExAllocatePoolWithTag( NonPagedPool,
                                                                                    sizeof( AFSNonPagedDirectoryCB),
@@ -4512,9 +4836,23 @@ AFSInitializeSpecialShareNameList()
         if( pNonPagedDirEntry == NULL)
         {
 
-            ExFreePool( pDirNode);
+           AFSLibExFreePoolWithTag( pDirNode,
+                                    AFS_DIR_ENTRY_TAG);
+
+            lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+                                             AFS_OBJECT_REFERENCE_GLOBAL);
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSInitializeSpecialShareNameList Decrement count on object %p Cnt %d\n",
+                          pObjectInfoCB,
+                          lCount));
+
+            if ( lCount == 0)
+            {
 
-            AFSDeleteObjectInfo( &pObjectInfoCB);
+                AFSDeleteObjectInfo( &pObjectInfoCB);
+            }
 
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
@@ -4569,13 +4907,28 @@ try_exit:
 
                     pLastDirNode = (AFSDirectoryCB *)pDirNode->ListEntry.fLink;
 
-                    AFSDeleteObjectInfo( &pDirNode->ObjectInformation);
+                    lCount = AFSObjectInfoDecrement( pDirNode->ObjectInformation,
+                                                     AFS_OBJECT_REFERENCE_GLOBAL);
+
+                    AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                                  AFS_TRACE_LEVEL_VERBOSE,
+                                  "AFSInitializeSpecialShareNameList Decrement count on object %p Cnt %d\n",
+                                  pDirNode->ObjectInformation,
+                                  lCount));
+
+                    if ( lCount == 0)
+                    {
+
+                        AFSDeleteObjectInfo( &pDirNode->ObjectInformation);
+                    }
 
                     ExDeleteResourceLite( &pDirNode->NonPaged->Lock);
 
-                    ExFreePool( pDirNode->NonPaged);
+                   AFSLibExFreePoolWithTag( pDirNode->NonPaged,
+                                            AFS_DIR_ENTRY_NP_TAG);
 
-                    ExFreePool( pDirNode);
+                   AFSLibExFreePoolWithTag( pDirNode,
+                                            AFS_DIR_ENTRY_TAG);
 
                     pDirNode = pLastDirNode;
                 }
@@ -4601,11 +4954,11 @@ AFSGetSpecialShareNameEntry( IN UNICODE_STRING *ShareName,
     {
 
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE_2,
                       "AFSGetSpecialShareNameEntry share name %wZ secondary name %wZ\n",
                       ShareName,
-                      SecondaryName);
+                      SecondaryName));
 
         uniFullShareName = *ShareName;
 
@@ -4717,26 +5070,27 @@ AFSResetDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB)
 
             pNextDirEntry = (AFSDirectoryCB *)pCurrentDirEntry->ListEntry.fLink;
 
-            if( pCurrentDirEntry->DirOpenReferenceCount <= 0)
+            if( pCurrentDirEntry->DirOpenReferenceCount <= 0 &&
+                pCurrentDirEntry->NameArrayReferenceCount <= 0)
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSResetDirectoryContent Deleting dir entry %p for %wZ\n",
                               pCurrentDirEntry,
-                              &pCurrentDirEntry->NameInformation.FileName);
+                              &pCurrentDirEntry->NameInformation.FileName));
 
                 AFSDeleteDirEntry( ObjectInfoCB,
-                                   pCurrentDirEntry);
+                                   &pCurrentDirEntry);
             }
             else
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSResetDirectoryContent Setting DELETE flag in dir entry %p for %wZ\n",
                               pCurrentDirEntry,
-                              &pCurrentDirEntry->NameInformation.FileName);
+                              &pCurrentDirEntry->NameInformation.FileName));
 
                 SetFlag( pCurrentDirEntry->Flags, AFS_DIR_ENTRY_DELETED);
 
@@ -4759,13 +5113,13 @@ AFSResetDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB)
 
         ObjectInfoCB->Specific.Directory.DirectoryNodeCount = 0;
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_DIR_NODE_COUNT,
+        AFSDbgTrace(( AFS_SUBSYSTEM_DIR_NODE_COUNT,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSResetDirectoryContent Reset count to 0 on parent FID %08lX-%08lX-%08lX-%08lX\n",
                       ObjectInfoCB->FileId.Cell,
                       ObjectInfoCB->FileId.Volume,
                       ObjectInfoCB->FileId.Vnode,
-                      ObjectInfoCB->FileId.Unique);
+                      ObjectInfoCB->FileId.Unique));
     }
 
     return ntStatus;
@@ -4782,11 +5136,11 @@ AFSEnumerateGlobalRoot( IN GUID *AuthGroup)
     __Enter
     {
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSEnumerateGlobalRoot Acquiring GlobalRoot DirectoryNodeHdr.TreeLock lock %p EXCL %08lX\n",
                       AFSGlobalRoot->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock,
-                      PsGetCurrentThread());
+                      PsGetCurrentThread()));
 
         AFSAcquireExcl( AFSGlobalRoot->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock,
                         TRUE);
@@ -4819,12 +5173,6 @@ AFSEnumerateGlobalRoot( IN GUID *AuthGroup)
 
         pDirGlobalDirNode = AFSGlobalRoot->ObjectInformation.Specific.Directory.DirectoryNodeListHead;
 
-        //
-        // Indicate the node is initialized
-        //
-
-        SetFlag( AFSGlobalRoot->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED);
-
         uniFullName.MaximumLength = PAGE_SIZE;
         uniFullName.Length = 0;
 
@@ -4881,7 +5229,8 @@ AFSEnumerateGlobalRoot( IN GUID *AuthGroup)
             pDirGlobalDirNode = (AFSDirectoryCB *)pDirGlobalDirNode->ListEntry.fLink;
         }
 
-        AFSExFreePoolWithTag( uniFullName.Buffer, 0);
+       AFSLibExFreePoolWithTag( uniFullName.Buffer,
+                                AFS_GENERIC_MEMORY_12_TAG);
 
 try_exit:
 
@@ -5039,788 +5388,53 @@ try_exit:
     return ntStatus;
 }
 
-AFSNameArrayHdr *
-AFSInitNameArray( IN AFSDirectoryCB *DirectoryCB,
-                  IN ULONG InitialElementCount)
+void
+AFSSetEnumerationEvent( IN AFSFcb *Fcb)
 {
-
-    AFSNameArrayHdr *pNameArray = NULL;
-    AFSNameArrayCB *pCurrentElement = NULL;
-    AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
     LONG lCount;
 
-    __Enter
+    //
+    // Depending on the type of node, set the event
+    //
+
+    switch( Fcb->Header.NodeTypeCode)
     {
 
-        if( InitialElementCount == 0)
+        case AFS_DIRECTORY_FCB:
+        case AFS_ROOT_FCB:
+        case AFS_ROOT_ALL:
         {
 
-            InitialElementCount = pDevExt->Specific.RDR.NameArrayLength;
-        }
+            lCount = InterlockedIncrement( &Fcb->NPFcb->Specific.Directory.DirectoryEnumCount);
 
-        pNameArray = (AFSNameArrayHdr *)AFSExAllocatePoolWithTag( PagedPool,
-                                                                  sizeof( AFSNameArrayHdr) +
-                                                                    (InitialElementCount * sizeof( AFSNameArrayCB)),
-                                                                  AFS_NAME_ARRAY_TAG);
+            break;
+        }
+    }
 
-        if( pNameArray == NULL)
-        {
+    return;
+}
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                          AFS_TRACE_LEVEL_ERROR,
-                          "AFSInitNameArray Failed to allocate name array\n");
+void
+AFSClearEnumerationEvent( IN AFSFcb *Fcb)
+{
 
-            try_return( pNameArray);
-        }
+    LONG lCount;
 
-        RtlZeroMemory( pNameArray,
-                       sizeof( AFSNameArrayHdr) +
-                          (InitialElementCount * sizeof( AFSNameArrayCB)));
+    //
+    // Depending on the type of node, set the event
+    //
 
-        pNameArray->MaxElementCount = InitialElementCount;
+    switch( Fcb->Header.NodeTypeCode)
+    {
 
-        if( DirectoryCB != NULL)
+        case AFS_DIRECTORY_FCB:
+        case AFS_ROOT_FCB:
+        case AFS_ROOT_ALL:
         {
 
-            pCurrentElement = &pNameArray->ElementArray[ 0];
-
-            pNameArray->CurrentEntry = pCurrentElement;
-
-            pNameArray->Count = 1;
+            ASSERT( Fcb->NPFcb->Specific.Directory.DirectoryEnumCount > 0);
 
-            pNameArray->LinkCount = 0;
-
-            lCount = InterlockedIncrement( &DirectoryCB->NameArrayReferenceCount);
-
-            AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSInitNameArray [NA:%p] Increment count on %wZ DE %p Cnt %d\n",
-                          pNameArray,
-                          &DirectoryCB->NameInformation.FileName,
-                          DirectoryCB,
-                          lCount);
-
-            pCurrentElement->DirectoryCB = DirectoryCB;
-
-            pCurrentElement->Component = DirectoryCB->NameInformation.FileName;
-
-            pCurrentElement->FileId = DirectoryCB->ObjectInformation->FileId;
-
-            if( pCurrentElement->FileId.Vnode == 1)
-            {
-
-                SetFlag( pCurrentElement->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
-            }
-
-            AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSInitNameArray [NA:%p] Element[0] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
-                          pNameArray,
-                          pCurrentElement->DirectoryCB,
-                          pCurrentElement->FileId.Cell,
-                          pCurrentElement->FileId.Volume,
-                          pCurrentElement->FileId.Vnode,
-                          pCurrentElement->FileId.Unique,
-                          &pCurrentElement->DirectoryCB->NameInformation.FileName,
-                          pCurrentElement->DirectoryCB->ObjectInformation->FileType);
-        }
-
-try_exit:
-
-        NOTHING;
-    }
-
-    return pNameArray;
-}
-
-NTSTATUS
-AFSPopulateNameArray( IN AFSNameArrayHdr *NameArray,
-                      IN UNICODE_STRING *Path,
-                      IN AFSDirectoryCB *DirectoryCB)
-{
-
-    NTSTATUS ntStatus = STATUS_SUCCESS;
-    AFSNameArrayCB *pCurrentElement = NULL;
-    LONG lCount;
-
-    __Enter
-    {
-
-        AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSPopulateNameArray [NA:%p] passed Path %wZ DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
-                      NameArray,
-                      &Path,
-                      DirectoryCB,
-                      DirectoryCB->ObjectInformation->FileId.Cell,
-                      DirectoryCB->ObjectInformation->FileId.Volume,
-                      DirectoryCB->ObjectInformation->FileId.Vnode,
-                      DirectoryCB->ObjectInformation->FileId.Unique,
-                      &DirectoryCB->NameInformation.FileName,
-                      DirectoryCB->ObjectInformation->FileType);
-
-        //
-        // Init some info in the header
-        //
-
-        pCurrentElement = &NameArray->ElementArray[ 0];
-
-        NameArray->CurrentEntry = pCurrentElement;
-
-        //
-        // The first entry points at the root
-        //
-
-        pCurrentElement->DirectoryCB = DirectoryCB->ObjectInformation->VolumeCB->DirectoryCB;
-
-        lCount = InterlockedIncrement( &pCurrentElement->DirectoryCB->NameArrayReferenceCount);
-
-        AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSPopulateNameArray [NA:%p] Increment count on volume %wZ DE %p Cnt %d\n",
-                      NameArray,
-                      &pCurrentElement->DirectoryCB->NameInformation.FileName,
-                      pCurrentElement->DirectoryCB,
-                      lCount);
-
-        pCurrentElement->Component = DirectoryCB->ObjectInformation->VolumeCB->DirectoryCB->NameInformation.FileName;
-
-        pCurrentElement->FileId = DirectoryCB->ObjectInformation->VolumeCB->ObjectInformation.FileId;
-
-        pCurrentElement->Flags = 0;
-
-        if( pCurrentElement->FileId.Vnode == 1)
-        {
-
-            SetFlag( pCurrentElement->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
-        }
-
-        NameArray->Count = 1;
-
-        NameArray->LinkCount = 0;
-
-        AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSPopulateNameArray [NA:%p] Element[0] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
-                      NameArray,
-                      pCurrentElement->DirectoryCB,
-                      pCurrentElement->FileId.Cell,
-                      pCurrentElement->FileId.Volume,
-                      pCurrentElement->FileId.Vnode,
-                      pCurrentElement->FileId.Unique,
-                      &pCurrentElement->DirectoryCB->NameInformation.FileName,
-                      pCurrentElement->DirectoryCB->ObjectInformation->FileType);
-
-        //
-        // If the root is the parent then we are done ...
-        //
-
-        if( &DirectoryCB->ObjectInformation->VolumeCB->ObjectInformation == DirectoryCB->ObjectInformation)
-        {
-            try_return( ntStatus);
-        }
-
-try_exit:
-
-        NOTHING;
-    }
-
-    return ntStatus;
-}
-
-NTSTATUS
-AFSPopulateNameArrayFromRelatedArray( IN AFSNameArrayHdr *NameArray,
-                                      IN AFSNameArrayHdr *RelatedNameArray,
-                                      IN AFSDirectoryCB *DirectoryCB)
-{
-
-    NTSTATUS ntStatus = STATUS_SUCCESS;
-    AFSNameArrayCB *pCurrentElement = NULL, *pCurrentRelatedElement = NULL;
-    LONG lCount;
-
-    __Enter
-    {
-
-        AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSPopulateNameArray [NA:%p] passed RelatedNameArray %p DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
-                      NameArray,
-                      RelatedNameArray,
-                      DirectoryCB,
-                      DirectoryCB->ObjectInformation->FileId.Cell,
-                      DirectoryCB->ObjectInformation->FileId.Volume,
-                      DirectoryCB->ObjectInformation->FileId.Vnode,
-                      DirectoryCB->ObjectInformation->FileId.Unique,
-                      &DirectoryCB->NameInformation.FileName,
-                      DirectoryCB->ObjectInformation->FileType);
-
-        //
-        // Init some info in the header
-        //
-
-        pCurrentElement = &NameArray->ElementArray[ 0];
-
-        pCurrentRelatedElement = &RelatedNameArray->ElementArray[ 0];
-
-        NameArray->Count = 0;
-
-        NameArray->LinkCount = RelatedNameArray->LinkCount;
-
-        //
-        // Populate the name array with the data from the related array
-        //
-
-        while( TRUE)
-        {
-
-            pCurrentElement->DirectoryCB = pCurrentRelatedElement->DirectoryCB;
-
-            pCurrentElement->Component = pCurrentRelatedElement->DirectoryCB->NameInformation.FileName;
-
-            pCurrentElement->FileId    = pCurrentElement->DirectoryCB->ObjectInformation->FileId;
-
-            pCurrentElement->Flags = 0;
-
-            if( pCurrentElement->FileId.Vnode == 1)
-            {
-
-                SetFlag( pCurrentElement->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
-            }
-
-            lCount = InterlockedIncrement( &pCurrentElement->DirectoryCB->NameArrayReferenceCount);
-
-            AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSPopulateNameArrayFromRelatedArray [NA:%p] Increment count on %wZ DE %p Cnt %d\n",
-                          NameArray,
-                          &pCurrentElement->DirectoryCB->NameInformation.FileName,
-                          pCurrentElement->DirectoryCB,
-                          lCount);
-
-            lCount = InterlockedIncrement( &NameArray->Count);
-
-            AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSPopulateNameArrayFromRelatedArray [NA:%p] Element[%d] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
-                          NameArray,
-                          lCount - 1,
-                          pCurrentElement->DirectoryCB,
-                          pCurrentElement->FileId.Cell,
-                          pCurrentElement->FileId.Volume,
-                          pCurrentElement->FileId.Vnode,
-                          pCurrentElement->FileId.Unique,
-                          &pCurrentElement->DirectoryCB->NameInformation.FileName,
-                          pCurrentElement->DirectoryCB->ObjectInformation->FileType);
-
-            if( pCurrentElement->DirectoryCB == DirectoryCB ||
-                NameArray->Count == RelatedNameArray->Count)
-            {
-
-                //
-                // Done ...
-                //
-
-                break;
-            }
-
-            pCurrentElement++;
-
-            pCurrentRelatedElement++;
-        }
-
-        NameArray->CurrentEntry = NameArray->Count > 0 ? pCurrentElement : NULL;
-    }
-
-    return ntStatus;
-}
-
-NTSTATUS
-AFSFreeNameArray( IN AFSNameArrayHdr *NameArray)
-{
-
-    NTSTATUS ntStatus = STATUS_SUCCESS;
-    AFSNameArrayCB *pCurrentElement = NULL;
-    LONG lCount, lElement;
-
-    __Enter
-    {
-
-        AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSFreeNameArray [NA:%p]\n",
-                      NameArray);
-
-        for ( lElement = 0; lElement < NameArray->Count; lElement++)
-        {
-
-            pCurrentElement = &NameArray->ElementArray[ lElement];
-
-            lCount = InterlockedDecrement( &pCurrentElement->DirectoryCB->NameArrayReferenceCount);
-
-            AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSFreeNameArray [NA:%p] Decrement count on %wZ DE %p Cnt %d\n",
-                          NameArray,
-                          &pCurrentElement->DirectoryCB->NameInformation.FileName,
-                          pCurrentElement->DirectoryCB,
-                          lCount);
-
-            ASSERT( lCount >= 0);
-        }
-
-        AFSExFreePoolWithTag( NameArray, AFS_NAME_ARRAY_TAG);
-    }
-
-    return ntStatus;
-}
-
-NTSTATUS
-AFSInsertNextElement( IN AFSNameArrayHdr *NameArray,
-                      IN AFSDirectoryCB *DirectoryCB)
-{
-
-    NTSTATUS ntStatus = STATUS_SUCCESS;
-    AFSNameArrayCB *pCurrentElement = NULL;
-    LONG lCount;
-
-    __Enter
-    {
-
-        AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSInsertNextElement [NA:%p] passed DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
-                      NameArray,
-                      DirectoryCB,
-                      DirectoryCB->ObjectInformation->FileId.Cell,
-                      DirectoryCB->ObjectInformation->FileId.Volume,
-                      DirectoryCB->ObjectInformation->FileId.Vnode,
-                      DirectoryCB->ObjectInformation->FileId.Unique,
-                      &DirectoryCB->NameInformation.FileName,
-                      DirectoryCB->ObjectInformation->FileType);
-
-        if( NameArray->Count == (LONG) NameArray->MaxElementCount)
-        {
-
-            AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                          AFS_TRACE_LEVEL_ERROR,
-                          "AFSInsertNextElement [NA:%p] Name has reached Maximum Size\n",
-                          NameArray);
-
-            try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
-        }
-
-        for ( lCount = 0; lCount < NameArray->Count; lCount++)
-        {
-
-            if ( AFSIsEqualFID( &NameArray->ElementArray[ lCount].FileId,
-                                &DirectoryCB->ObjectInformation->FileId) )
-            {
-
-                AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                              AFS_TRACE_LEVEL_WARNING,
-                              "AFSInsertNextElement [NA:%p] DE %p recursion Status %08X\n",
-                              NameArray,
-                              DirectoryCB,
-                              STATUS_ACCESS_DENIED);
-
-                try_return( ntStatus = STATUS_ACCESS_DENIED);
-            }
-        }
-
-        if( NameArray->Count > 0)
-        {
-
-            NameArray->CurrentEntry++;
-        }
-        else
-        {
-            NameArray->CurrentEntry = &NameArray->ElementArray[ 0];
-        }
-
-        pCurrentElement = NameArray->CurrentEntry;
-
-        lCount = InterlockedIncrement( &NameArray->Count);
-
-        lCount = InterlockedIncrement( &DirectoryCB->NameArrayReferenceCount);
-
-        AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSInsertNextElement [NA:%p] Increment count on %wZ DE %p Cnt %d\n",
-                      NameArray,
-                      &DirectoryCB->NameInformation.FileName,
-                      DirectoryCB,
-                      lCount);
-
-        ASSERT( lCount > 0);
-
-        pCurrentElement->DirectoryCB = DirectoryCB;
-
-        pCurrentElement->Component = DirectoryCB->NameInformation.FileName;
-
-        pCurrentElement->FileId = DirectoryCB->ObjectInformation->FileId;
-
-        pCurrentElement->Flags = 0;
-
-        if( pCurrentElement->FileId.Vnode == 1)
-        {
-
-            SetFlag( pCurrentElement->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
-        }
-
-        AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSInsertNextElement [NA:%p] Element[%d] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
-                      NameArray,
-                      NameArray->Count - 1,
-                      pCurrentElement->DirectoryCB,
-                      pCurrentElement->FileId.Cell,
-                      pCurrentElement->FileId.Volume,
-                      pCurrentElement->FileId.Vnode,
-                      pCurrentElement->FileId.Unique,
-                      &pCurrentElement->DirectoryCB->NameInformation.FileName,
-                      pCurrentElement->DirectoryCB->ObjectInformation->FileType);
-
-try_exit:
-
-        NOTHING;
-    }
-
-    return ntStatus;
-}
-
-AFSDirectoryCB *
-AFSBackupEntry( IN AFSNameArrayHdr *NameArray)
-{
-
-    AFSDirectoryCB *pDirectoryCB = NULL;
-    AFSNameArrayCB *pCurrentElement = NULL;
-    BOOLEAN         bVolumeRoot = FALSE;
-    LONG lCount;
-
-    __Enter
-    {
-
-        AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSBackupEntry [NA:%p]\n",
-                      NameArray);
-
-        if( NameArray->Count == 0)
-        {
-
-            AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                          AFS_TRACE_LEVEL_ERROR,
-                          "AFSBackupEntry [NA:%p] No more entries\n",
-                          NameArray);
-
-            try_return( pCurrentElement);
-        }
-
-        lCount = InterlockedDecrement( &NameArray->CurrentEntry->DirectoryCB->NameArrayReferenceCount);
-
-        AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSBackupEntry [NA:%p] Decrement count on %wZ DE %p Cnt %d\n",
-                      NameArray,
-                      &NameArray->CurrentEntry->DirectoryCB->NameInformation.FileName,
-                      NameArray->CurrentEntry->DirectoryCB,
-                      lCount);
-
-        ASSERT( lCount >= 0);
-
-        NameArray->CurrentEntry->DirectoryCB = NULL;
-
-        lCount = InterlockedDecrement( &NameArray->Count);
-
-        if( lCount == 0)
-        {
-            NameArray->CurrentEntry = NULL;
-
-            AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                          AFS_TRACE_LEVEL_ERROR,
-                          "AFSBackupEntry [NA:%p] No more entries\n",
-                          NameArray);
-        }
-        else
-        {
-
-            bVolumeRoot = BooleanFlagOn( NameArray->CurrentEntry->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
-
-            NameArray->CurrentEntry--;
-
-            pCurrentElement = NameArray->CurrentEntry;
-
-            pDirectoryCB = pCurrentElement->DirectoryCB;
-
-            AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSBackupEntry [NA:%p] Returning Element[%d] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
-                          NameArray,
-                          NameArray->Count - 1,
-                          pCurrentElement->DirectoryCB,
-                          pCurrentElement->FileId.Cell,
-                          pCurrentElement->FileId.Volume,
-                          pCurrentElement->FileId.Vnode,
-                          pCurrentElement->FileId.Unique,
-                          &pCurrentElement->DirectoryCB->NameInformation.FileName,
-                          pCurrentElement->DirectoryCB->ObjectInformation->FileType);
-
-            //
-            // If the entry we are removing is a volume root,
-            // we must remove the mount point entry as well.
-            // If the NameArray was constructed by checking the
-            // share name via the service, the name array can
-            // contain two volume roots in sequence without a
-            // mount point separating them.
-            //
-
-            if ( bVolumeRoot &&
-                 !BooleanFlagOn( NameArray->CurrentEntry->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT))
-            {
-
-                pDirectoryCB = AFSBackupEntry( NameArray);
-            }
-        }
-
-
-try_exit:
-
-        NOTHING;
-    }
-
-    return pDirectoryCB;
-}
-
-AFSDirectoryCB *
-AFSGetParentEntry( IN AFSNameArrayHdr *NameArray)
-{
-
-    AFSDirectoryCB *pDirEntry = NULL;
-    AFSNameArrayCB *pElement = NULL;
-
-    __Enter
-    {
-
-        AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSGetParentEntry [NA:%p]\n",
-                      NameArray);
-
-        if( NameArray->Count == 0 ||
-            NameArray->Count == 1)
-        {
-
-            AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                          AFS_TRACE_LEVEL_ERROR,
-                          "AFSGetParentEntry [NA:%p] No more entries\n",
-                          NameArray);
-
-            try_return( pDirEntry = NULL);
-        }
-
-        pElement = &NameArray->ElementArray[ NameArray->Count - 2];
-
-        pDirEntry = pElement->DirectoryCB;
-
-        AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSGetParentEntry [NA:%p] Returning Element[%d] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
-                      NameArray,
-                      NameArray->Count - 2,
-                      pElement->DirectoryCB,
-                      pElement->FileId.Cell,
-                      pElement->FileId.Volume,
-                      pElement->FileId.Vnode,
-                      pElement->FileId.Unique,
-                      &pElement->DirectoryCB->NameInformation.FileName,
-                      pElement->DirectoryCB->ObjectInformation->FileType);
-
-try_exit:
-
-        NOTHING;
-    }
-
-    return pDirEntry;
-}
-
-void
-AFSResetNameArray( IN AFSNameArrayHdr *NameArray,
-                   IN AFSDirectoryCB *DirectoryCB)
-{
-
-    AFSNameArrayCB *pCurrentElement = NULL;
-    AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
-    LONG lCount, lElement;
-
-    __Enter
-    {
-
-        AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSResetNameArray [NA:%p] passed DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
-                      NameArray,
-                      DirectoryCB,
-                      DirectoryCB->ObjectInformation->FileId.Cell,
-                      DirectoryCB->ObjectInformation->FileId.Volume,
-                      DirectoryCB->ObjectInformation->FileId.Vnode,
-                      DirectoryCB->ObjectInformation->FileId.Unique,
-                      &DirectoryCB->NameInformation.FileName,
-                      DirectoryCB->ObjectInformation->FileType);
-        //
-        // Dereference previous name array contents
-        //
-
-        for ( lElement = 0; lElement < NameArray->Count; lElement++)
-        {
-
-            pCurrentElement = &NameArray->ElementArray[ lElement];
-
-            lCount = InterlockedDecrement( &pCurrentElement->DirectoryCB->NameArrayReferenceCount);
-
-            AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSResetNameArray [NA:%p] Decrement count on %wZ DE %p Cnt %d\n",
-                          NameArray,
-                          &pCurrentElement->DirectoryCB->NameInformation.FileName,
-                          pCurrentElement->DirectoryCB,
-                          lCount);
-
-            ASSERT( lCount >= 0);
-        }
-
-        RtlZeroMemory( NameArray,
-                       sizeof( AFSNameArrayHdr) +
-                          ((pDevExt->Specific.RDR.NameArrayLength - 1) * sizeof( AFSNameArrayCB)));
-
-        NameArray->MaxElementCount = pDevExt->Specific.RDR.NameArrayLength;
-
-        if( DirectoryCB != NULL)
-        {
-
-            pCurrentElement = &NameArray->ElementArray[ 0];
-
-            NameArray->CurrentEntry = pCurrentElement;
-
-            NameArray->Count = 1;
-
-            NameArray->LinkCount = 0;
-
-            lCount = InterlockedIncrement( &DirectoryCB->NameArrayReferenceCount);
-
-            AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSResetNameArray [NA:%p] Increment count on %wZ DE %p Cnt %d\n",
-                          NameArray,
-                          &DirectoryCB->NameInformation.FileName,
-                          DirectoryCB,
-                          lCount);
-
-            pCurrentElement->DirectoryCB = DirectoryCB;
-
-            pCurrentElement->Component = DirectoryCB->NameInformation.FileName;
-
-            pCurrentElement->FileId = DirectoryCB->ObjectInformation->FileId;
-
-            pCurrentElement->Flags  = 0;
-
-            if( pCurrentElement->FileId.Vnode == 1)
-            {
-
-                SetFlag( pCurrentElement->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
-            }
-
-            AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSResetNameArray [NA:%p] Element[0] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
-                          NameArray,
-                          pCurrentElement->DirectoryCB,
-                          pCurrentElement->FileId.Cell,
-                          pCurrentElement->FileId.Volume,
-                          pCurrentElement->FileId.Vnode,
-                          pCurrentElement->FileId.Unique,
-                          &pCurrentElement->DirectoryCB->NameInformation.FileName,
-                          pCurrentElement->DirectoryCB->ObjectInformation->FileType);
-        }
-    }
-
-    return;
-}
-
-void
-AFSDumpNameArray( IN AFSNameArrayHdr *NameArray)
-{
-
-    AFSNameArrayCB *pCurrentElement = NULL;
-
-    pCurrentElement = &NameArray->ElementArray[ 0];
-
-    AFSPrint("AFSDumpNameArray Start (%d)\n", NameArray->Count);
-
-    while( pCurrentElement->DirectoryCB != NULL)
-    {
-
-        AFSPrint("FID %08lX-%08lX-%08lX-%08lX %wZ\n",
-                  pCurrentElement->FileId.Cell,
-                  pCurrentElement->FileId.Volume,
-                  pCurrentElement->FileId.Vnode,
-                  pCurrentElement->FileId.Unique,
-                  &pCurrentElement->DirectoryCB->NameInformation.FileName);
-
-        pCurrentElement++;
-    }
-
-    AFSPrint("AFSDumpNameArray End\n\n");
-
-    return;
-}
-
-void
-AFSSetEnumerationEvent( IN AFSFcb *Fcb)
-{
-    LONG lCount;
-
-    //
-    // Depending on the type of node, set the event
-    //
-
-    switch( Fcb->Header.NodeTypeCode)
-    {
-
-        case AFS_DIRECTORY_FCB:
-        case AFS_ROOT_FCB:
-        case AFS_ROOT_ALL:
-        {
-
-            lCount = InterlockedIncrement( &Fcb->NPFcb->Specific.Directory.DirectoryEnumCount);
-
-            break;
-        }
-    }
-
-    return;
-}
-
-void
-AFSClearEnumerationEvent( IN AFSFcb *Fcb)
-{
-
-    LONG lCount;
-
-    //
-    // Depending on the type of node, set the event
-    //
-
-    switch( Fcb->Header.NodeTypeCode)
-    {
-
-        case AFS_DIRECTORY_FCB:
-        case AFS_ROOT_FCB:
-        case AFS_ROOT_ALL:
-        {
-
-            ASSERT( Fcb->NPFcb->Specific.Directory.DirectoryEnumCount > 0);
-
-            lCount = InterlockedDecrement( &Fcb->NPFcb->Specific.Directory.DirectoryEnumCount);
+            lCount = InterlockedDecrement( &Fcb->NPFcb->Specific.Directory.DirectoryEnumCount);
 
             break;
         }
@@ -5897,23 +5511,30 @@ AFSInitPIOCtlDirectoryCB( IN AFSObjectInfoCB *ParentObjectInfo)
     __Enter
     {
 
+        AFSAcquireExcl( ParentObjectInfo->VolumeCB->ObjectInfoTree.TreeLock,
+                        TRUE);
+
         pObjectInfoCB = AFSAllocateObjectInfo( ParentObjectInfo,
                                                0);
 
         if( pObjectInfoCB == NULL)
         {
 
+            AFSReleaseResource( ParentObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
+
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
 
         lCount = AFSObjectInfoIncrement( pObjectInfoCB,
-                                         AFS_OBJECT_REFERENCE_DIRENTRY);
+                                         AFS_OBJECT_REFERENCE_PIOCTL);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSInitPIOCtlDirectoryCB Increment count on object %p Cnt %d\n",
                       pObjectInfoCB,
-                      lCount);
+                      lCount));
+
+        AFSReleaseResource( ParentObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
 
         pObjectInfoCB->FileType = (ULONG) AFS_FILE_TYPE_PIOCTL;
 
@@ -5931,10 +5552,10 @@ AFSInitPIOCtlDirectoryCB( IN AFSObjectInfoCB *ParentObjectInfo)
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+        AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSInitPIOCtlDirectoryCB AFS_DIR_ENTRY_TAG allocated %p\n",
-                      pDirNode);
+                      pDirNode));
 
         pNonPagedDirEntry = (AFSNonPagedDirectoryCB *)AFSExAllocatePoolWithTag( NonPagedPool,
                                                                                 sizeof( AFSNonPagedDirectoryCB),
@@ -5982,11 +5603,11 @@ AFSInitPIOCtlDirectoryCB( IN AFSObjectInfoCB *ParentObjectInfo)
         if ( InterlockedCompareExchangePointer( (PVOID *)&ParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB, pDirNode, NULL) != NULL)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_WARNING,
                           "AFSInitPIOCtlDirectoryCB Raced PIOCtlDirectoryCB %p pFcb %p\n",
                           ParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB,
-                          pDirNode);
+                          pDirNode));
 
             try_return( ntStatus = STATUS_REPARSE);
         }
@@ -5999,10 +5620,10 @@ try_exit:
             if ( pDirNode != NULL)
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+                AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSInitPIOCtlDirectoryCB AFS_DIR_ENTRY_TAG deallocating %p\n",
-                              pDirNode);
+                              pDirNode));
 
                 AFSExFreePoolWithTag( pDirNode, AFS_DIR_ENTRY_TAG);
             }
@@ -6019,15 +5640,19 @@ try_exit:
             {
 
                 lCount = AFSObjectInfoDecrement( pObjectInfoCB,
-                                                 AFS_OBJECT_REFERENCE_DIRENTRY);
+                                                 AFS_OBJECT_REFERENCE_PIOCTL);
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSInitPIOCtlDirectoryCB Decrement count on object %p Cnt %d\n",
                               pObjectInfoCB,
-                              lCount);
+                              lCount));
 
-                AFSDeleteObjectInfo( &pObjectInfoCB);
+                if ( lCount == 0)
+                {
+
+                    AFSDeleteObjectInfo( &pObjectInfoCB);
+                }
             }
         }
     }
@@ -6058,11 +5683,16 @@ AFSRetrieveFileAttributes( IN AFSDirectoryCB *ParentDirectoryCB,
     UNICODE_STRING uniComponentName, uniRemainingPath, uniParsedName;
     ULONG ulNameDifference = 0;
     LONG lCount;
+    UNICODE_STRING uniDFSTargetName;
 
     __Enter
     {
 
-        //
+       uniDFSTargetName.Length = 0;
+       uniDFSTargetName.MaximumLength = 0;
+       uniDFSTargetName.Buffer = NULL;
+
+       //
         // Retrieve a target name for the entry
         //
 
@@ -6267,10 +5897,10 @@ AFSRetrieveFileAttributes( IN AFSDirectoryCB *ParentDirectoryCB,
 
                 AFSReleaseResource( &DirectoryCB->NonPaged->Lock);
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSRetrieveFileAttributes Name %wZ contains invalid server name\n",
-                              &uniFullPathName);
+                              &uniFullPathName));
 
                 try_return( ntStatus = STATUS_OBJECT_PATH_INVALID);
             }
@@ -6310,22 +5940,22 @@ AFSRetrieveFileAttributes( IN AFSDirectoryCB *ParentDirectoryCB,
         lCount = AFSVolumeIncrement( pVolumeCB,
                                      VolumeReferenceReason);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSRetrieveFileAttributes Increment count on volume %p Reason %u Cnt %d\n",
                       pVolumeCB,
                       VolumeReferenceReason,
-                      lCount);
+                      lCount));
 
         lCount = InterlockedIncrement( &pParentDirEntry->DirOpenReferenceCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSRetrieveFileAttributes Increment count on %wZ DE %p Ccb %p Cnt %d\n",
                       &pParentDirEntry->NameInformation.FileName,
                       pParentDirEntry,
                       NULL,
-                      lCount);
+                      lCount));
 
         ntStatus = AFSLocateNameEntry( NULL,
                                        NULL,
@@ -6339,33 +5969,37 @@ AFSRetrieveFileAttributes( IN AFSDirectoryCB *ParentDirectoryCB,
                                        &NewVolumeReferenceReason,
                                        &pNewParentDirEntry,
                                        &pDirectoryEntry,
-                                       NULL);
+                                       NULL,
+                                      &uniDFSTargetName);
 
-        //
-        // AFSLocateNameEntry returns pNewVolumeCB with a reference held
-        // even if pVolumeCB == pNewVolumeCB.  It is always safe to release
-        // the reference on pVolumeCB that was held prior to the call.
-        // If pVolumeCB == pNewVolumeCB, the reference from AFSLocateNameEntry
-        // will be released second.
-        //
+        if ( pNewVolumeCB != NULL)
+        {
+            //
+            // AFSLocateNameEntry returns pNewVolumeCB with a reference held
+            // even if pVolumeCB == pNewVolumeCB.  It is always safe to release
+            // the reference on pVolumeCB that was held prior to the call.
+            // If pVolumeCB == pNewVolumeCB, the reference from AFSLocateNameEntry
+            // will be released second.
+            //
 
-        lCount = AFSVolumeDecrement( pVolumeCB,
-                                     VolumeReferenceReason);
+            lCount = AFSVolumeDecrement( pVolumeCB,
+                                         VolumeReferenceReason);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSRetrieveFileAttributes Decrement count on volume %p Reason %u Cnt %d\n",
-                      pVolumeCB,
-                      VolumeReferenceReason,
-                      lCount);
+            AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSRetrieveFileAttributes Decrement count on volume %p Reason %u Cnt %d\n",
+                          pVolumeCB,
+                          VolumeReferenceReason,
+                          lCount));
 
-        pVolumeCB = pNewVolumeCB;
+            pVolumeCB = pNewVolumeCB;
 
-        pNewVolumeCB = NULL;
+            pNewVolumeCB = NULL;
 
-        VolumeReferenceReason = NewVolumeReferenceReason;
+            VolumeReferenceReason = NewVolumeReferenceReason;
 
-        NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
+            NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
+        }
 
         //
         // AFSLocateNameEntry does not alter the reference count of
@@ -6375,21 +6009,32 @@ AFSRetrieveFileAttributes( IN AFSDirectoryCB *ParentDirectoryCB,
 
         lCount = InterlockedDecrement( &pParentDirEntry->DirOpenReferenceCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSRetrieveFileAttributes DecrementX count on %wZ DE %p Cnt %d\n",
                       &pParentDirEntry->NameInformation.FileName,
                       pParentDirEntry,
-                      lCount);
+                      lCount));
 
         pParentDirEntry = pNewParentDirEntry;
 
         pNewParentDirEntry = NULL;
 
-        if( !NT_SUCCESS( ntStatus) ||
-            ntStatus == STATUS_REPARSE)
+       if( !NT_SUCCESS( ntStatus))
+       {
+           try_return( ntStatus);
+       }
+
+       //
+       // If the status is STATUS_REPARSE then attempt to retrieve the attributes from the target name returned
+       //
+
+       if( ntStatus == STATUS_REPARSE)
         {
 
+           ntStatus = AFSRetrieveTargetFileInfo( &uniDFSTargetName,
+                                                 FileInfo);
+
             try_return( ntStatus);
         }
 
@@ -6403,13 +6048,13 @@ AFSRetrieveFileAttributes( IN AFSDirectoryCB *ParentDirectoryCB,
         // Check for the mount point being returned
         //
 
-        if( pDirectoryEntry->ObjectInformation->FileType == AFS_FILE_TYPE_MOUNTPOINT)
+        if( pDirectoryEntry->ObjectInformation->FileType == AFS_FILE_TYPE_MOUNTPOINT ||
+            pDirectoryEntry->ObjectInformation->FileType == AFS_FILE_TYPE_DFSLINK)
         {
 
-            FileInfo->FileAttributes = (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_REPARSE_POINT);
+            FileInfo->FileAttributes |= (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_REPARSE_POINT);
         }
-        else if( pDirectoryEntry->ObjectInformation->FileType == AFS_FILE_TYPE_SYMLINK ||
-                 pDirectoryEntry->ObjectInformation->FileType == AFS_FILE_TYPE_DFSLINK)
+        else if( pDirectoryEntry->ObjectInformation->FileType == AFS_FILE_TYPE_SYMLINK)
         {
 
             if ( FileInfo->FileAttributes == FILE_ATTRIBUTE_NORMAL)
@@ -6449,13 +6094,13 @@ try_exit:
 
             lCount = InterlockedDecrement( &pDirectoryEntry->DirOpenReferenceCount);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSRetrieveFileAttributes Decrement1 count on %wZ DE %p Ccb %p Cnt %d\n",
                           &pDirectoryEntry->NameInformation.FileName,
                           pDirectoryEntry,
                           NULL,
-                          lCount);
+                          lCount));
 
             ASSERT( lCount >= 0);
         }
@@ -6465,13 +6110,13 @@ try_exit:
 
             lCount = InterlockedDecrement( &pParentDirEntry->DirOpenReferenceCount);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSRetrieveFileAttributes Decrement2 count on %wZ DE %p Ccb %p Cnt %d\n",
                           &pParentDirEntry->NameInformation.FileName,
                           pParentDirEntry,
                           NULL,
-                          lCount);
+                          lCount));
 
             ASSERT( lCount >= 0);
         }
@@ -6482,12 +6127,12 @@ try_exit:
             lCount = AFSVolumeDecrement( pVolumeCB,
                                          VolumeReferenceReason);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSRetrieveFileAttributes Decrement2 count on volume %p Reason %u Cnt %d\n",
                           pVolumeCB,
                           VolumeReferenceReason,
-                          lCount);
+                          lCount));
         }
 
         if( pNameArray != NULL)
@@ -6516,6 +6161,13 @@ try_exit:
 
             AFSExFreePoolWithTag( pwchBuffer, 0);
         }
+
+       if ( uniDFSTargetName.Buffer != NULL)
+       {
+
+           AFSExFreePoolWithTag( uniDFSTargetName.Buffer,
+                                 AFS_REPARSE_NAME_TAG);
+       }
     }
 
     return ntStatus;
@@ -6573,14 +6225,19 @@ AFSAllocateObjectInfo( IN AFSObjectInfoCB *ParentObjectInfo,
 
             SetFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID);
 
+            AFSAcquireShared( ParentObjectInfo->VolumeCB->ObjectInfoTree.TreeLock,
+                              TRUE);
+
             lCount = AFSObjectInfoIncrement( ParentObjectInfo,
                                              AFS_OBJECT_REFERENCE_CHILD);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSAllocateObjectInfo Increment count on parent object %p Cnt %d\n",
                           ParentObjectInfo,
-                          lCount);
+                          lCount));
+
+            AFSReleaseResource( ParentObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
         }
 
         //
@@ -6724,11 +6381,18 @@ AFSObjectInfoDecrement( IN AFSObjectInfoCB *ObjectInfo,
 
 AFSObjectInfoCB *
 AFSFindObjectInfo( IN AFSVolumeCB *VolumeCB,
-                   IN AFSFileID   *FileId)
+                   IN AFSFileID   *FileId,
+                   IN BOOLEAN      bUpdateLastUse)
 {
     DWORD            ntStatus = STATUS_SUCCESS;
     ULONGLONG        ullIndex;
     AFSObjectInfoCB *pObjectInfo = NULL;
+    LONG             lCount;
+
+    ullIndex = AFSCreateLowIndex( FileId);
+
+    AFSAcquireShared( VolumeCB->ObjectInfoTree.TreeLock,
+                      TRUE);
 
     if ( AFSIsEqualFID( &VolumeCB->ObjectInformation.FileId, FileId))
     {
@@ -6738,33 +6402,47 @@ AFSFindObjectInfo( IN AFSVolumeCB *VolumeCB,
     else
     {
 
-        AFSAcquireExcl( VolumeCB->ObjectInfoTree.TreeLock,
-                        TRUE);
-
-        ullIndex = AFSCreateLowIndex( FileId);
-
         ntStatus = AFSLocateHashEntry( VolumeCB->ObjectInfoTree.TreeHead,
                                        ullIndex,
                                        (AFSBTreeEntry **)&pObjectInfo);
-
-        AFSReleaseResource( VolumeCB->ObjectInfoTree.TreeLock);
     }
 
     if ( NT_SUCCESS( ntStatus)) {
 
-        AFSObjectInfoIncrement( pObjectInfo,
-                                AFS_OBJECT_REFERENCE_FIND);
+        lCount = AFSObjectInfoIncrement( pObjectInfo,
+                                         AFS_OBJECT_REFERENCE_FIND);
+
+        AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSFindObjectInfo Decrement count on object %p Cnt %d\n",
+                      pObjectInfo,
+                      lCount));
+
+        if ( bUpdateLastUse)
+        {
+
+            KeQueryTickCount( &pObjectInfo->LastAccessCount);
+        }
     }
 
+    AFSReleaseResource( VolumeCB->ObjectInfoTree.TreeLock);
+
     return pObjectInfo;
 }
 
 void
 AFSReleaseObjectInfo( IN AFSObjectInfoCB **ppObjectInfo)
 {
+    LONG lCount;
 
-    AFSObjectInfoDecrement( *ppObjectInfo,
-                            AFS_OBJECT_REFERENCE_FIND);
+    lCount = AFSObjectInfoDecrement( *ppObjectInfo,
+                                     AFS_OBJECT_REFERENCE_FIND);
+
+    AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                  AFS_TRACE_LEVEL_VERBOSE,
+                  "AFSReleaseObjectInfo Decrement count on object %p Cnt %d\n",
+                  *ppObjectInfo,
+                  lCount));
 
     *ppObjectInfo = NULL;
 }
@@ -6772,143 +6450,176 @@ AFSReleaseObjectInfo( IN AFSObjectInfoCB **ppObjectInfo)
 void
 AFSDeleteObjectInfo( IN AFSObjectInfoCB **ppObjectInfo)
 {
-
     BOOLEAN bAcquiredTreeLock = FALSE;
-    AFSObjectInfoCB *pObjectInfo = (*ppObjectInfo);
-    BOOLEAN bHeldInService = BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE);
+    AFSObjectInfoCB *pObjectInfo = NULL;
+    AFSVolumeCB * pVolume = NULL;
+    BOOLEAN bHeldInService;
     AFSObjectInfoCB * pParentObjectInfo = NULL;
     AFSFileID FileId;
     LONG lCount;
 
-    if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_ROOT_VOLUME))
+    __Enter
     {
+        if ( BooleanFlagOn( (*ppObjectInfo)->Flags, AFS_OBJECT_ROOT_VOLUME))
+        {
 
-        //
-        // AFSDeleteObjectInfo should never be called on the ObjectInformationCB
-        // embedded in the VolumeCB.
-        //
+            //
+            // AFSDeleteObjectInfo should never be called on the ObjectInformationCB
+            // embedded in the VolumeCB.
+            //
 
-        ASSERT( TRUE);
+            ASSERT( FALSE);
 
-        return;
-    }
+            return;
+        }
 
-    ASSERT( pObjectInfo->ObjectReferenceCount == 0);
+        pVolume = (*ppObjectInfo)->VolumeCB;
 
-    (*ppObjectInfo) = NULL;
+        if( !ExIsResourceAcquiredExclusiveLite( pVolume->ObjectInfoTree.TreeLock))
+        {
 
-    if( !ExIsResourceAcquiredExclusiveLite( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock))
-    {
+            ASSERT( !ExIsResourceAcquiredLite( pVolume->ObjectInfoTree.TreeLock));
 
-        ASSERT( !ExIsResourceAcquiredLite( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock));
+            AFSAcquireExcl( pVolume->ObjectInfoTree.TreeLock,
+                            TRUE);
 
-        AFSAcquireExcl( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock,
-                        TRUE);
+            bAcquiredTreeLock = TRUE;
+        }
 
-        bAcquiredTreeLock = TRUE;
-    }
+        for ( lCount = 0; lCount < AFS_OBJECT_REFERENCE_MAX; lCount++)
+        {
 
-    if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
-    {
+            ASSERT( (*ppObjectInfo)->ObjectReferences[ lCount] >= 0);
+        }
 
-        pParentObjectInfo = AFSFindObjectInfo( pObjectInfo->VolumeCB,
-                                               &pObjectInfo->ParentFileId);
-    }
+        ASSERT( (*ppObjectInfo)->ObjectReferenceCount == 0);
 
-    //
-    // Remove it from the tree and list if it was inserted
-    //
+        pObjectInfo = (AFSObjectInfoCB *) InterlockedCompareExchangePointer( (PVOID *)ppObjectInfo,
+                                                                             NULL,
+                                                                             *ppObjectInfo);
 
-    if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_INSERTED_HASH_TREE))
-    {
+        if ( pObjectInfo == NULL)
+        {
 
-        AFSRemoveHashEntry( &pObjectInfo->VolumeCB->ObjectInfoTree.TreeHead,
-                            &pObjectInfo->TreeEntry);
-    }
+            try_return( NOTHING);
+        }
 
-    if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_INSERTED_VOLUME_LIST))
-    {
+        ASSERT( *ppObjectInfo == NULL);
 
-        if( pObjectInfo->ListEntry.fLink == NULL)
+        if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
         {
 
-            pObjectInfo->VolumeCB->ObjectInfoListTail = (AFSObjectInfoCB *)pObjectInfo->ListEntry.bLink;
+            pParentObjectInfo = AFSFindObjectInfo( pVolume,
+                                                   &pObjectInfo->ParentFileId,
+                                                   FALSE);
 
-            if( pObjectInfo->VolumeCB->ObjectInfoListTail != NULL)
+            if( pParentObjectInfo != NULL)
             {
 
-                pObjectInfo->VolumeCB->ObjectInfoListTail->ListEntry.fLink = NULL;
+                ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID);
+
+                AFSAcquireShared( pParentObjectInfo->VolumeCB->ObjectInfoTree.TreeLock,
+                                  TRUE);
+
+                lCount = AFSObjectInfoDecrement( pParentObjectInfo,
+                                                 AFS_OBJECT_REFERENCE_CHILD);
+
+                AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSDeleteObjectInfo Decrement count on parent object %p Cnt %d\n",
+                              pParentObjectInfo,
+                              lCount));
+
+                AFSReleaseResource( pParentObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
+
+                AFSReleaseObjectInfo( &pParentObjectInfo);
             }
         }
-        else
+
+        //
+        // Remove it from the tree and list if it was inserted
+        //
+
+        if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_INSERTED_HASH_TREE))
         {
 
-            ((AFSObjectInfoCB *)(pObjectInfo->ListEntry.fLink))->ListEntry.bLink = pObjectInfo->ListEntry.bLink;
+            AFSRemoveHashEntry( &pVolume->ObjectInfoTree.TreeHead,
+                                &pObjectInfo->TreeEntry);
         }
 
-        if( pObjectInfo->ListEntry.bLink == NULL)
+        if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_INSERTED_VOLUME_LIST))
         {
 
-            pObjectInfo->VolumeCB->ObjectInfoListHead = (AFSObjectInfoCB *)pObjectInfo->ListEntry.fLink;
+            if( pObjectInfo->ListEntry.fLink == NULL)
+            {
+
+                pVolume->ObjectInfoListTail = (AFSObjectInfoCB *)pObjectInfo->ListEntry.bLink;
 
-            if( pObjectInfo->VolumeCB->ObjectInfoListHead != NULL)
+                if( pVolume->ObjectInfoListTail != NULL)
+                {
+
+                    pVolume->ObjectInfoListTail->ListEntry.fLink = NULL;
+                }
+            }
+            else
             {
 
-                pObjectInfo->VolumeCB->ObjectInfoListHead->ListEntry.bLink = NULL;
+                ((AFSObjectInfoCB *)(pObjectInfo->ListEntry.fLink))->ListEntry.bLink = pObjectInfo->ListEntry.bLink;
             }
-        }
-        else
-        {
 
-            ((AFSObjectInfoCB *)(pObjectInfo->ListEntry.bLink))->ListEntry.fLink = pObjectInfo->ListEntry.fLink;
-        }
-    }
+            if( pObjectInfo->ListEntry.bLink == NULL)
+            {
 
-    if( pParentObjectInfo != NULL)
-    {
+                pVolume->ObjectInfoListHead = (AFSObjectInfoCB *)pObjectInfo->ListEntry.fLink;
 
-        ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID);
+                if( pVolume->ObjectInfoListHead != NULL)
+                {
 
-        lCount = AFSObjectInfoDecrement( pParentObjectInfo,
-                                         AFS_OBJECT_REFERENCE_CHILD);
+                    pVolume->ObjectInfoListHead->ListEntry.bLink = NULL;
+                }
+            }
+            else
+            {
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSDeleteObjectInfo Decrement count on parent object %p Cnt %d\n",
-                      pParentObjectInfo,
-                      lCount);
+                ((AFSObjectInfoCB *)(pObjectInfo->ListEntry.bLink))->ListEntry.fLink = pObjectInfo->ListEntry.fLink;
+            }
+        }
 
-        AFSReleaseObjectInfo( &pParentObjectInfo);
-    }
+        bHeldInService = BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE);
 
-    if( bAcquiredTreeLock)
-    {
+        if( bHeldInService)
+        {
 
-        AFSReleaseResource( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
-    }
+            FileId = pObjectInfo->FileId;
+        }
 
-    if( bHeldInService)
-    {
+        ASSERT( pObjectInfo->ObjectReferenceCount == 0);
 
-        FileId = pObjectInfo->FileId;
-    }
+        ExDeleteResourceLite( &pObjectInfo->NonPagedInfo->ObjectInfoLock);
 
-    ExDeleteResourceLite( &pObjectInfo->NonPagedInfo->ObjectInfoLock);
+        ExDeleteResourceLite( &pObjectInfo->NonPagedInfo->DirectoryNodeHdrLock);
 
-    ExDeleteResourceLite( &pObjectInfo->NonPagedInfo->DirectoryNodeHdrLock);
+        AFSExFreePoolWithTag( pObjectInfo->NonPagedInfo, AFS_NP_OBJECT_INFO_TAG);
 
-    AFSExFreePoolWithTag( pObjectInfo->NonPagedInfo, AFS_NP_OBJECT_INFO_TAG);
+        AFSExFreePoolWithTag( pObjectInfo, AFS_OBJECT_INFO_TAG);
 
-    AFSExFreePoolWithTag( pObjectInfo, AFS_OBJECT_INFO_TAG);
+try_exit:
 
-    //
-    // Release the fid in the service
-    //
+        if( bAcquiredTreeLock)
+        {
 
-    if( bHeldInService)
-    {
+            AFSReleaseResource( pVolume->ObjectInfoTree.TreeLock);
+        }
+
+        //
+        // Release the fid in the service
+        //
+
+        if( bHeldInService)
+        {
 
-        AFSReleaseFid( &FileId);
+            AFSReleaseFid( &FileId);
+        }
     }
 
     return;
@@ -7092,22 +6803,22 @@ AFSEvaluateRootEntry( IN AFSDirectoryCB *DirectoryCB,
         lCount = AFSVolumeIncrement( pVolumeCB,
                                      VolumeReferenceReason);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSEvaluateRootEntry Increment count on volume %p Reason %u Cnt %d\n",
                       pVolumeCB,
                       VolumeReferenceReason,
-                      lCount);
+                      lCount));
 
         lCount = InterlockedIncrement( &pParentDirEntry->DirOpenReferenceCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSEvaluateRootEntry Increment count on %wZ DE %p Ccb %p Cnt %d\n",
                       &pParentDirEntry->NameInformation.FileName,
                       pParentDirEntry,
                       NULL,
-                      lCount);
+                      lCount));
 
         ntStatus = AFSLocateNameEntry( NULL,
                                        NULL,
@@ -7121,33 +6832,37 @@ AFSEvaluateRootEntry( IN AFSDirectoryCB *DirectoryCB,
                                        &VolumeReferenceReason,
                                        &pNewParentDirEntry,
                                        &pDirectoryEntry,
-                                       NULL);
+                                       NULL,
+                                      NULL);
 
-        //
-        // AFSLocateNameEntry returns pNewVolumeCB with a reference held
-        // even if pVolumeCB == pNewVolumeCB.  It is always safe to release
-        // the reference on pVolumeCB that was held prior to the call.
-        // If pVolumeCB == pNewVolumeCB, the reference from AFSLocateNameEntry
-        // will be released second.
-        //
+        if ( pNewVolumeCB != NULL)
+        {
+            //
+            // AFSLocateNameEntry returns pNewVolumeCB with a reference held
+            // even if pVolumeCB == pNewVolumeCB.  It is always safe to release
+            // the reference on pVolumeCB that was held prior to the call.
+            // If pVolumeCB == pNewVolumeCB, the reference from AFSLocateNameEntry
+            // will be released second.
+            //
 
-        lCount = AFSVolumeDecrement( pVolumeCB,
-                                     VolumeReferenceReason);
+            lCount = AFSVolumeDecrement( pVolumeCB,
+                                         VolumeReferenceReason);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSEvaluateRootEntry Decrement count on volume %p Reason %u Cnt %d\n",
-                      pVolumeCB,
-                      VolumeReferenceReason,
-                      lCount);
+            AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSEvaluateRootEntry Decrement count on volume %p Reason %u Cnt %d\n",
+                          pVolumeCB,
+                          VolumeReferenceReason,
+                          lCount));
 
-        pVolumeCB = pNewVolumeCB;
+            pVolumeCB = pNewVolumeCB;
 
-        pNewVolumeCB = NULL;
+            pNewVolumeCB = NULL;
 
-        VolumeReferenceReason = NewVolumeReferenceReason;
+            VolumeReferenceReason = NewVolumeReferenceReason;
 
-        NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
+            NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
+        }
 
         //
         // AFSLocateNameEntry does not alter the reference count of
@@ -7157,12 +6872,12 @@ AFSEvaluateRootEntry( IN AFSDirectoryCB *DirectoryCB,
 
         lCount = InterlockedDecrement( &pParentDirEntry->DirOpenReferenceCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSEvaluateRootEntry DecrementX count on %wZ DE %p Cnt %d\n",
                       &pParentDirEntry->NameInformation.FileName,
                       pParentDirEntry,
-                      lCount);
+                      lCount));
 
         pParentDirEntry = pNewParentDirEntry;
 
@@ -7193,13 +6908,13 @@ try_exit:
 
             lCount = InterlockedDecrement( &pDirectoryEntry->DirOpenReferenceCount);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSEvaluateRootEntry Decrement1 count on %wZ DE %p Ccb %p Cnt %d\n",
                           &pDirectoryEntry->NameInformation.FileName,
                           pDirectoryEntry,
                           NULL,
-                          lCount);
+                          lCount));
 
             ASSERT( lCount >= 0);
         }
@@ -7209,13 +6924,13 @@ try_exit:
 
             lCount = InterlockedDecrement( &pParentDirEntry->DirOpenReferenceCount);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSEvaluateRootEntry Decrement2 count on %wZ DE %p Ccb %p Cnt %d\n",
                           &pParentDirEntry->NameInformation.FileName,
                           pParentDirEntry,
                           NULL,
-                          lCount);
+                          lCount));
 
             ASSERT( lCount >= 0);
         }
@@ -7232,12 +6947,12 @@ try_exit:
             lCount = AFSVolumeDecrement( pVolumeCB,
                                          VolumeReferenceReason);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSEvaluateRootEntry Decrement2 count on volume %p Reason %u Cnt %d\n",
                           pVolumeCB,
                           VolumeReferenceReason,
-                          lCount);
+                          lCount));
         }
 
         if( pNameArray != NULL)
@@ -7295,23 +7010,23 @@ AFSCleanupFcb( IN AFSFcb *Fcb,
                 !BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED))
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCleanupEntry Acquiring Fcb lock %p SHARED %08lX\n",
+                             "AFSCleanupEntry Acquiring Fcb lock %p EXCL %08lX\n",
                               &Fcb->NPFcb->Resource,
-                              PsGetCurrentThread());
+                              PsGetCurrentThread()));
 
-                AFSAcquireShared( &Fcb->NPFcb->Resource,
+               AFSAcquireExcl( &Fcb->NPFcb->Resource,
                                   TRUE);
 
                 if( Fcb->OpenReferenceCount > 0)
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                   AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSCleanupEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
                                   &Fcb->NPFcb->SectionObjectResource,
-                                  PsGetCurrentThread());
+                                  PsGetCurrentThread()));
 
                     AFSAcquireExcl( &Fcb->NPFcb->SectionObjectResource,
                                     TRUE);
@@ -7327,7 +7042,7 @@ AFSCleanupFcb( IN AFSFcb *Fcb,
                         if( !NT_SUCCESS( stIoStatus.Status))
                         {
 
-                            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+                            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                                           AFS_TRACE_LEVEL_ERROR,
                                           "AFSCleanupFcb CcFlushCache [1] failure FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX Bytes 0x%08lX\n",
                                           Fcb->ObjectInformation->FileId.Cell,
@@ -7335,7 +7050,7 @@ AFSCleanupFcb( IN AFSFcb *Fcb,
                                           Fcb->ObjectInformation->FileId.Vnode,
                                           Fcb->ObjectInformation->FileId.Unique,
                                           stIoStatus.Status,
-                                          stIoStatus.Information);
+                                          stIoStatus.Information));
 
                             ntStatus = stIoStatus.Status;
                         }
@@ -7349,116 +7064,127 @@ AFSCleanupFcb( IN AFSFcb *Fcb,
                                                        FALSE))
                             {
 
-                                AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+                                AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                                               AFS_TRACE_LEVEL_WARNING,
                                               "AFSCleanupFcb CcPurgeCacheSection [1] failure FID %08lX-%08lX-%08lX-%08lX\n",
                                               Fcb->ObjectInformation->FileId.Cell,
                                               Fcb->ObjectInformation->FileId.Volume,
                                               Fcb->ObjectInformation->FileId.Vnode,
-                                              Fcb->ObjectInformation->FileId.Unique);
+                                              Fcb->ObjectInformation->FileId.Unique));
 
                                 SetFlag( Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
                             }
                         }
                     }
-                    __except( EXCEPTION_EXECUTE_HANDLER)
+                   __except( EXCEPTION_EXECUTE_HANDLER)
                     {
 
                         ntStatus = GetExceptionCode();
 
-                        AFSDbgLogMsg( 0,
+                        AFSDbgTrace(( 0,
                                       0,
                                       "EXCEPTION - AFSCleanupFcb Cc [1] FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
                                       Fcb->ObjectInformation->FileId.Cell,
                                       Fcb->ObjectInformation->FileId.Volume,
                                       Fcb->ObjectInformation->FileId.Vnode,
                                       Fcb->ObjectInformation->FileId.Unique,
-                                      ntStatus);
+                                      ntStatus));
 
                         SetFlag( Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
                     }
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                   AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSCleanupFcb Releasing Fcb SectionObject lock %p EXCL %08lX\n",
                                   &Fcb->NPFcb->SectionObjectResource,
-                                  PsGetCurrentThread());
+                                  PsGetCurrentThread()));
 
                     AFSReleaseResource( &Fcb->NPFcb->SectionObjectResource);
                 }
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCleanupEntry Releasing Fcb lock %p SHARED %08lX\n",
+                             "AFSCleanupEntry Releasing Fcb lock %p EXCL %08lX\n",
                               &Fcb->NPFcb->Resource,
-                              PsGetCurrentThread());
+                              PsGetCurrentThread()));
 
                 AFSReleaseResource( &Fcb->NPFcb->Resource);
 
-                //
-                // Wait for any currently running flush or release requests to complete
-                //
+               if( !BooleanFlagOn( pRDRDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+               {
+                   //
+                   // Wait for any currently running flush or release requests to complete
+                   //
 
-                AFSWaitOnQueuedFlushes( Fcb);
+                   AFSWaitOnQueuedFlushes( Fcb);
 
-                //
-                // Now perform another flush on the file
-                //
+                   //
+                   // Now perform another flush on the file
+                   //
 
-                if( !NT_SUCCESS( AFSFlushExtents( Fcb,
-                                                  NULL)))
-                {
+                   if( !NT_SUCCESS( AFSFlushExtents( Fcb,
+                                                     NULL)))
+                   {
 
-                    AFSReleaseExtentsWithFlush( Fcb,
-                                                NULL,
-                                                TRUE);
-                }
-            }
+                       AFSReleaseExtentsWithFlush( Fcb,
+                                                   NULL,
+                                                   TRUE);
+                   }
+               }
+           }
 
-            if( Fcb->OpenReferenceCount == 0 ||
-                BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID) ||
-                BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED))
-            {
+           if( !BooleanFlagOn( pRDRDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+           {
 
-                AFSTearDownFcbExtents( Fcb,
-                                       NULL);
-            }
+               if( Fcb->OpenReferenceCount == 0 ||
+                   BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID) ||
+                   BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED))
+               {
+
+                   AFSTearDownFcbExtents( Fcb,
+                                          NULL);
+               }
+           }
 
             try_return( ntStatus);
         }
 
         KeQueryTickCount( &liTime);
 
-        //
-        // First up are there dirty extents in the cache to flush?
-        //
+       if( !BooleanFlagOn( pRDRDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+       {
+           //
+           // First up are there dirty extents in the cache to flush?
+           //
 
-        if( BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID) ||
-            BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED))
-        {
+           if( BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID) ||
+               BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED))
+           {
 
-            //
-            // The file has been marked as invalid.  Dump it
-            //
+               //
+               // The file has been marked as invalid.  Dump it
+               //
 
-            AFSTearDownFcbExtents( Fcb,
-                                   NULL);
-        }
-        else if( ForceFlush ||
-            ( ( Fcb->Specific.File.ExtentsDirtyCount ||
-                Fcb->Specific.File.ExtentCount) &&
-              (liTime.QuadPart - Fcb->Specific.File.LastServerFlush.QuadPart)
-                                                    >= pControlDeviceExt->Specific.Control.FcbFlushTimeCount.QuadPart))
-        {
-            if( !NT_SUCCESS( AFSFlushExtents( Fcb,
-                                              NULL)) &&
-                Fcb->OpenReferenceCount == 0)
-            {
+               AFSTearDownFcbExtents( Fcb,
+                                      NULL);
+           }
+           else if( ForceFlush ||
+                    ( ( Fcb->Specific.File.ExtentsDirtyCount ||
+                        Fcb->Specific.File.ExtentCount) &&
+                      (liTime.QuadPart - Fcb->Specific.File.LastServerFlush.QuadPart)
+                      >= pControlDeviceExt->Specific.Control.FcbFlushTimeCount.QuadPart))
+           {
 
-                AFSReleaseExtentsWithFlush( Fcb,
-                                            NULL,
-                                            TRUE);
-            }
+               if( !NT_SUCCESS( AFSFlushExtents( Fcb,
+                                                 NULL)) &&
+                   Fcb->OpenReferenceCount == 0)
+               {
+
+                   AFSReleaseExtentsWithFlush( Fcb,
+                                               NULL,
+                                               TRUE);
+               }
+           }
         }
 
         //
@@ -7473,11 +7199,29 @@ AFSCleanupFcb( IN AFSFcb *Fcb,
                                         (AFS_SERVER_PURGE_SLEEP * pControlDeviceExt->Specific.Control.FcbPurgeTimeCount.QuadPart))))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+           AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                         AFS_TRACE_LEVEL_VERBOSE,
+                         "AFSCleanupFcb Acquiring Fcb lock %p EXCL %08lX\n",
+                         &Fcb->NPFcb->Resource,
+                         PsGetCurrentThread()));
+
+           if ( AFSAcquireExcl( &Fcb->NPFcb->Resource, ForceFlush) == FALSE)
+           {
+
+               AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                             AFS_TRACE_LEVEL_VERBOSE,
+                             "AFSCleanupFcb Failed to Acquire Fcb lock %p EXCL %08lX\n",
+                             &Fcb->NPFcb->Resource,
+                             PsGetCurrentThread()));
+
+               try_return( ntStatus = STATUS_RETRY);
+           }
+
+           AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSCleanupFcb Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
                           &Fcb->NPFcb->SectionObjectResource,
-                          PsGetCurrentThread());
+                          PsGetCurrentThread()));
 
             if ( AFSAcquireExcl( &Fcb->NPFcb->SectionObjectResource, ForceFlush))
             {
@@ -7493,7 +7237,7 @@ AFSCleanupFcb( IN AFSFcb *Fcb,
                     if( !NT_SUCCESS( stIoStatus.Status))
                     {
 
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+                        AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                                       AFS_TRACE_LEVEL_ERROR,
                                       "AFSCleanupFcb CcFlushCache [2] failure FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX Bytes 0x%08lX\n",
                                       Fcb->ObjectInformation->FileId.Cell,
@@ -7501,7 +7245,7 @@ AFSCleanupFcb( IN AFSFcb *Fcb,
                                       Fcb->ObjectInformation->FileId.Vnode,
                                       Fcb->ObjectInformation->FileId.Unique,
                                       stIoStatus.Status,
-                                      stIoStatus.Information);
+                                      stIoStatus.Information));
 
                         ntStatus = stIoStatus.Status;
                     }
@@ -7516,55 +7260,81 @@ AFSCleanupFcb( IN AFSFcb *Fcb,
                                                    FALSE))
                         {
 
-                            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+                            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                                           AFS_TRACE_LEVEL_WARNING,
                                           "AFSCleanupFcb CcPurgeCacheSection [2] failure FID %08lX-%08lX-%08lX-%08lX\n",
                                           Fcb->ObjectInformation->FileId.Cell,
                                           Fcb->ObjectInformation->FileId.Volume,
                                           Fcb->ObjectInformation->FileId.Vnode,
-                                          Fcb->ObjectInformation->FileId.Unique);
+                                          Fcb->ObjectInformation->FileId.Unique));
 
                             SetFlag( Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
                         }
                     }
                 }
-                __except( EXCEPTION_EXECUTE_HANDLER)
+               __except( EXCEPTION_EXECUTE_HANDLER)
                 {
 
                     ntStatus = GetExceptionCode();
 
-                    AFSDbgLogMsg( 0,
+                    AFSDbgTrace(( 0,
                                   0,
                                   "EXCEPTION - AFSCleanupFcb Cc [2] FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
                                   Fcb->ObjectInformation->FileId.Cell,
                                   Fcb->ObjectInformation->FileId.Volume,
                                   Fcb->ObjectInformation->FileId.Vnode,
                                   Fcb->ObjectInformation->FileId.Unique,
-                                  ntStatus);
+                                  ntStatus));
                 }
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+               AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSCleanupFcb Releasing Fcb SectionObject lock %p EXCL %08lX\n",
                               &Fcb->NPFcb->SectionObjectResource,
-                              PsGetCurrentThread());
+                              PsGetCurrentThread()));
 
                 AFSReleaseResource( &Fcb->NPFcb->SectionObjectResource);
 
-                if( Fcb->OpenReferenceCount <= 0)
-                {
+               AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                             AFS_TRACE_LEVEL_VERBOSE,
+                             "AFSCleanupFcb Releasing Fcb lock %p EXCL %08lX\n",
+                             &Fcb->NPFcb->Resource,
+                             PsGetCurrentThread()));
 
-                    //
-                    // Tear em down we'll not be needing them again
-                    //
+               AFSReleaseResource( &Fcb->NPFcb->Resource);
 
-                    AFSTearDownFcbExtents( Fcb,
-                                           NULL);
-                }
+               if( !BooleanFlagOn( pRDRDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+               {
+
+                   if( Fcb->OpenReferenceCount <= 0)
+                   {
+
+                       //
+                       // Tear em down we'll not be needing them again
+                       //
+
+                       AFSTearDownFcbExtents( Fcb,
+                                              NULL);
+                   }
+               }
             }
             else
             {
 
+               AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+                             AFS_TRACE_LEVEL_VERBOSE,
+                             "AFSCleanupFcb Failed to Acquire Fcb SectionObject lock %p EXCL %08lX\n",
+                             &Fcb->NPFcb->SectionObjectResource,
+                             PsGetCurrentThread()));
+
+               AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                             AFS_TRACE_LEVEL_VERBOSE,
+                             "AFSCleanupFcb Releasing Fcb lock %p EXCL %08lX\n",
+                             &Fcb->NPFcb->Resource,
+                             PsGetCurrentThread()));
+
+               AFSReleaseResource( &Fcb->NPFcb->Resource);
+
                 ntStatus = STATUS_RETRY;
             }
         }
@@ -7808,6 +7578,8 @@ AFSIsDirectoryEmptyForDelete( IN AFSFcb *Fcb)
     __Enter
     {
 
+        ASSERT( Fcb->ObjectInformation->FileType == AFS_FILE_TYPE_DIRECTORY);
+
         AFSAcquireShared( Fcb->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
                           TRUE);
 
@@ -7854,11 +7626,11 @@ AFSRemoveNameEntry( IN AFSObjectInfoCB *ParentObjectInfo,
         if( BooleanFlagOn( DirEntry->Flags, AFS_DIR_ENTRY_NOT_IN_PARENT_TREE))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSRemoveNameEntry DE %p for %wZ has NOT_IN flag set\n",
                           DirEntry,
-                          &DirEntry->NameInformation.FileName);
+                          &DirEntry->NameInformation.FileName));
 
             try_return( ntStatus);
         }
@@ -7869,20 +7641,20 @@ AFSRemoveNameEntry( IN AFSObjectInfoCB *ParentObjectInfo,
         // Remove the entry from the parent tree
         //
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSRemoveNameEntry DE %p for %wZ removing from case sensitive tree\n",
                       DirEntry,
-                      &DirEntry->NameInformation.FileName);
+                      &DirEntry->NameInformation.FileName));
 
         AFSRemoveCaseSensitiveDirEntry( &ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.CaseSensitiveTreeHead,
                                         DirEntry);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSRemoveNameEntry DE %p for %wZ removing from case insensitive tree\n",
                       DirEntry,
-                      &DirEntry->NameInformation.FileName);
+                      &DirEntry->NameInformation.FileName));
 
         AFSRemoveCaseInsensitiveDirEntry( &ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.CaseInsensitiveTreeHead,
                                           DirEntry);
@@ -7894,11 +7666,11 @@ AFSRemoveNameEntry( IN AFSObjectInfoCB *ParentObjectInfo,
             // From the short name tree
             //
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSRemoveNameEntry DE %p for %wZ removing from shortname tree\n",
                           DirEntry,
-                          &DirEntry->NameInformation.FileName);
+                          &DirEntry->NameInformation.FileName));
 
             AFSRemoveShortNameDirEntry( &ParentObjectInfo->Specific.Directory.ShortNameTree,
                                         DirEntry);
@@ -7906,11 +7678,11 @@ AFSRemoveNameEntry( IN AFSObjectInfoCB *ParentObjectInfo,
             ClearFlag( DirEntry->Flags, AFS_DIR_ENTRY_INSERTED_SHORT_NAME);
         }
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSRemoveNameEntry DE %p for %wZ setting NOT_IN flag\n",
                       DirEntry,
-                      &DirEntry->NameInformation.FileName);
+                      &DirEntry->NameInformation.FileName));
 
         SetFlag( DirEntry->Flags, AFS_DIR_ENTRY_NOT_IN_PARENT_TREE);
 
@@ -7953,9 +7725,9 @@ AFSGetAuthenticationId()
             if( hToken == NULL)
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_NETWORK_PROVIDER,
+                AFSDbgTrace(( AFS_SUBSYSTEM_NETWORK_PROVIDER,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSGetAuthenticationId Failed to retrieve impersonation or primary token\n");
+                              "AFSGetAuthenticationId Failed to retrieve impersonation or primary token\n"));
 
                 try_return( ntStatus);
             }
@@ -7970,9 +7742,10 @@ AFSGetAuthenticationId()
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_NETWORK_PROVIDER,
+            AFSDbgTrace(( AFS_SUBSYSTEM_NETWORK_PROVIDER,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSGetAuthenticationId Failed to retrieve information Status %08lX\n", ntStatus);
+                          "AFSGetAuthenticationId Failed to retrieve information Status %08lX\n",
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -7980,10 +7753,10 @@ AFSGetAuthenticationId()
         liAuthId.HighPart = pTokenInfo->AuthenticationId.HighPart;
         liAuthId.LowPart = pTokenInfo->AuthenticationId.LowPart;
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_NETWORK_PROVIDER,
+        AFSDbgTrace(( AFS_SUBSYSTEM_NETWORK_PROVIDER,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSGetAuthenticationId Successfully retrieved authentication ID %I64X\n",
-                      liAuthId.QuadPart);
+                      liAuthId.QuadPart));
 
 try_exit:
 
@@ -8020,27 +7793,27 @@ AFSUnwindFileInfo( IN AFSFcb *Fcb,
     UNREFERENCED_PARAMETER(Fcb);
     if( Ccb->FileUnwindInfo.FileAttributes != (ULONG)-1)
     {
-        Ccb->DirectoryCB->ObjectInformation->FileAttributes = Ccb->FileUnwindInfo.FileAttributes;
+        Fcb->ObjectInformation->FileAttributes = Ccb->FileUnwindInfo.FileAttributes;
     }
 
     if( Ccb->FileUnwindInfo.CreationTime.QuadPart != (ULONGLONG)-1)
     {
-        Ccb->DirectoryCB->ObjectInformation->CreationTime.QuadPart = Ccb->FileUnwindInfo.CreationTime.QuadPart;
+        Fcb->ObjectInformation->CreationTime.QuadPart = Ccb->FileUnwindInfo.CreationTime.QuadPart;
     }
 
     if( Ccb->FileUnwindInfo.LastAccessTime.QuadPart != (ULONGLONG)-1)
     {
-        Ccb->DirectoryCB->ObjectInformation->LastAccessTime.QuadPart = Ccb->FileUnwindInfo.LastAccessTime.QuadPart;
+        Fcb->ObjectInformation->LastAccessTime.QuadPart = Ccb->FileUnwindInfo.LastAccessTime.QuadPart;
     }
 
     if( Ccb->FileUnwindInfo.LastWriteTime.QuadPart != (ULONGLONG)-1)
     {
-        Ccb->DirectoryCB->ObjectInformation->LastWriteTime.QuadPart = Ccb->FileUnwindInfo.LastWriteTime.QuadPart;
+        Fcb->ObjectInformation->LastWriteTime.QuadPart = Ccb->FileUnwindInfo.LastWriteTime.QuadPart;
     }
 
     if( Ccb->FileUnwindInfo.ChangeTime.QuadPart != (ULONGLONG)-1)
     {
-        Ccb->DirectoryCB->ObjectInformation->ChangeTime.QuadPart = Ccb->FileUnwindInfo.ChangeTime.QuadPart;
+        Fcb->ObjectInformation->ChangeTime.QuadPart = Ccb->FileUnwindInfo.ChangeTime.QuadPart;
     }
 
     return;
@@ -8160,6 +7933,8 @@ AFSInitializeLibrary( IN AFSLibraryInitCB *LibraryInit)
 
         AFSDbgLogMsg = LibraryInit->AFSDbgLogMsg;
 
+        AFSDebugTraceFnc = AFSDbgLogMsg;
+
         AFSAddConnectionEx = LibraryInit->AFSAddConnectionEx;
 
         AFSExAllocatePoolWithTag = LibraryInit->AFSExAllocatePoolWithTag;
@@ -8208,10 +7983,10 @@ AFSInitializeLibrary( IN AFSLibraryInitCB *LibraryInit)
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSInitializeLibrary AFSInitVolume failure %08lX\n",
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -8222,19 +7997,19 @@ AFSInitializeLibrary( IN AFSLibraryInitCB *LibraryInit)
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSInitializeLibrary AFSInitRootFcb failure %08lX\n",
-                          ntStatus);
+                          ntStatus));
 
             lCount = AFSVolumeDecrement( AFSGlobalRoot,
                                          AFS_VOLUME_REFERENCE_GLOBAL_ROOT);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSInitializeLibrary Decrement count on volume %p Cnt %d\n",
                           AFSGlobalRoot,
-                          lCount);
+                          lCount));
 
             AFSReleaseResource( AFSGlobalRoot->VolumeLock);
 
@@ -8265,11 +8040,11 @@ AFSInitializeLibrary( IN AFSLibraryInitCB *LibraryInit)
         lCount = AFSVolumeDecrement( AFSGlobalRoot,
                                      AFS_VOLUME_REFERENCE_GLOBAL_ROOT);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSInitializeLibrary Decrement count on volume %p Cnt %d\n",
                       AFSGlobalRoot,
-                      lCount);
+                      lCount));
 
         AFSReleaseResource( AFSGlobalRoot->VolumeLock);
 
@@ -8300,13 +8075,25 @@ AFSCloseLibrary()
             lCount = AFSObjectInfoDecrement( AFSGlobalDotDirEntry->ObjectInformation,
                                              AFS_OBJECT_REFERENCE_GLOBAL);
 
-            AFSDeleteObjectInfo( &AFSGlobalDotDirEntry->ObjectInformation);
+            AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSCloseLibrary Decrement count on parent object %p Cnt %d\n",
+                          AFSGlobalDotDirEntry->ObjectInformation,
+                          lCount));
+
+            if ( lCount == 0)
+            {
+
+                AFSDeleteObjectInfo( &AFSGlobalDotDirEntry->ObjectInformation);
+            }
 
             ExDeleteResourceLite( &AFSGlobalDotDirEntry->NonPaged->Lock);
 
-            ExFreePool( AFSGlobalDotDirEntry->NonPaged);
+           AFSLibExFreePoolWithTag( AFSGlobalDotDirEntry->NonPaged,
+                                    AFS_DIR_ENTRY_NP_TAG);
 
-            ExFreePool( AFSGlobalDotDirEntry);
+           AFSLibExFreePoolWithTag( AFSGlobalDotDirEntry,
+                                    AFS_DIR_ENTRY_TAG);
 
             AFSGlobalDotDirEntry = NULL;
         }
@@ -8317,13 +8104,25 @@ AFSCloseLibrary()
             lCount = AFSObjectInfoDecrement( AFSGlobalDotDotDirEntry->ObjectInformation,
                                              AFS_OBJECT_REFERENCE_GLOBAL);
 
-            AFSDeleteObjectInfo( &AFSGlobalDotDotDirEntry->ObjectInformation);
+            AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSCloseLibrary Decrement count on parent object %p Cnt %d\n",
+                          AFSGlobalDotDotDirEntry->ObjectInformation,
+                          lCount));
+
+            if ( lCount == 0)
+            {
+
+                AFSDeleteObjectInfo( &AFSGlobalDotDotDirEntry->ObjectInformation);
+            }
 
             ExDeleteResourceLite( &AFSGlobalDotDotDirEntry->NonPaged->Lock);
 
-            ExFreePool( AFSGlobalDotDotDirEntry->NonPaged);
+           AFSLibExFreePoolWithTag( AFSGlobalDotDotDirEntry->NonPaged,
+                                 AFS_DIR_ENTRY_NP_TAG);
 
-            ExFreePool( AFSGlobalDotDotDirEntry);
+           AFSLibExFreePoolWithTag( AFSGlobalDotDotDirEntry,
+                                 AFS_DIR_ENTRY_TAG);
 
             AFSGlobalDotDotDirEntry = NULL;
         }
@@ -8341,13 +8140,25 @@ AFSCloseLibrary()
                 lCount = AFSObjectInfoDecrement( pDirNode->ObjectInformation,
                                                  AFS_OBJECT_REFERENCE_GLOBAL);
 
-                AFSDeleteObjectInfo( &pDirNode->ObjectInformation);
+                AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSCloseLibrary Decrement count on parent object %p Cnt %d\n",
+                              pDirNode->ObjectInformation,
+                              lCount));
+
+                if ( lCount == 0)
+                {
+
+                    AFSDeleteObjectInfo( &pDirNode->ObjectInformation);
+                }
 
                 ExDeleteResourceLite( &pDirNode->NonPaged->Lock);
 
-                ExFreePool( pDirNode->NonPaged);
+               AFSLibExFreePoolWithTag( pDirNode->NonPaged,
+                                        AFS_DIR_ENTRY_NP_TAG);
 
-                ExFreePool( pDirNode);
+               AFSLibExFreePoolWithTag( pDirNode,
+                                        AFS_DIR_ENTRY_TAG);
 
                 pDirNode = pLastDirNode;
             }
@@ -8448,12 +8259,12 @@ AFSGetObjectStatus( IN AFSGetStatusInfoCB *GetStatusInfo,
                 lCount = AFSVolumeIncrement( pVolumeCB,
                                              VolumeReferenceReason);
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSGetObjectStatus Increment count on volume %p Reason %u Cnt %d\n",
                               pVolumeCB,
                               VolumeReferenceReason,
-                              lCount);
+                              lCount));
             }
 
             AFSReleaseResource( &pDevExt->Specific.RDR.VolumeTreeLock);
@@ -8469,20 +8280,25 @@ AFSGetObjectStatus( IN AFSGetStatusInfoCB *GetStatusInfo,
 
                 pObjectInfo = &pVolumeCB->ObjectInformation;
 
+                AFSAcquireShared( pVolumeCB->ObjectInfoTree.TreeLock,
+                                  TRUE);
+
                 lCount = AFSObjectInfoIncrement( pObjectInfo,
                                                  AFS_OBJECT_REFERENCE_STATUS);
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSGetObjectStatus Increment1 count on object %p Cnt %d\n",
                               pObjectInfo,
-                              lCount);
+                              lCount));
+
+                AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
             }
             else
             {
 
-                AFSAcquireShared( pVolumeCB->ObjectInfoTree.TreeLock,
-                                  TRUE);
+                AFSAcquireExcl( pVolumeCB->ObjectInfoTree.TreeLock,
+                                TRUE);
 
                 ullIndex = AFSCreateLowIndex( &GetStatusInfo->FileID);
 
@@ -8500,11 +8316,13 @@ AFSGetObjectStatus( IN AFSGetStatusInfoCB *GetStatusInfo,
                     lCount = AFSObjectInfoIncrement( pObjectInfo,
                                                      AFS_OBJECT_REFERENCE_STATUS);
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSGetObjectStatus Increment2 count on object %p Cnt %d\n",
                                   pObjectInfo,
-                                  lCount);
+                                  lCount));
+
+                    KeQueryTickCount( &pObjectInfo->LastAccessCount);
                 }
 
                 AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
@@ -8542,10 +8360,10 @@ AFSGetObjectStatus( IN AFSGetStatusInfoCB *GetStatusInfo,
                                          &AFSServerName,
                                          TRUE) != 0)
             {
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSGetObjectStatus Name %wZ contains invalid server name\n",
-                              &uniFullPathName);
+                              &uniFullPathName));
 
                 try_return( ntStatus = STATUS_OBJECT_PATH_INVALID);
             }
@@ -8579,22 +8397,22 @@ AFSGetObjectStatus( IN AFSGetStatusInfoCB *GetStatusInfo,
             lCount = AFSVolumeIncrement( pVolumeCB,
                                          VolumeReferenceReason);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSGetObjectStatus Increment2 count on volume %p Reason %u Cnt %d\n",
                           pVolumeCB,
                           VolumeReferenceReason,
-                          lCount);
+                          lCount));
 
             lCount = InterlockedIncrement( &pParentDirEntry->DirOpenReferenceCount);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSGetObjectStatus Increment count on %wZ DE %p Ccb %p Cnt %d\n",
                           &pParentDirEntry->NameInformation.FileName,
                           pParentDirEntry,
                           NULL,
-                          lCount);
+                          lCount));
 
             ntStatus = AFSLocateNameEntry( NULL,
                                            NULL,
@@ -8609,33 +8427,38 @@ AFSGetObjectStatus( IN AFSGetStatusInfoCB *GetStatusInfo,
                                            &NewVolumeReferenceReason,
                                            &pNewParentDirEntry,
                                            &pDirectoryEntry,
-                                           NULL);
+                                           NULL,
+                                          NULL);
 
-            //
-            // AFSLocateNameEntry returns pNewVolumeCB with a reference held
-            // even if pVolumeCB == pNewVolumeCB.  It is always safe to release
-            // the reference on pVolumeCB that was held prior to the call.
-            // If pVolumeCB == pNewVolumeCB, the reference from AFSLocateNameEntry
-            // will be released second.
-            //
+            if ( pNewVolumeCB != NULL)
+            {
 
-            lCount = AFSVolumeDecrement( pVolumeCB,
-                                         VolumeReferenceReason);
+                //
+                // AFSLocateNameEntry returns pNewVolumeCB with a reference held
+                // even if pVolumeCB == pNewVolumeCB.  It is always safe to release
+                // the reference on pVolumeCB that was held prior to the call.
+                // If pVolumeCB == pNewVolumeCB, the reference from AFSLocateNameEntry
+                // will be released second.
+                //
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSGetObjectStatus Decrement count on volume %p Reason %u Cnt %d\n",
-                          pVolumeCB,
-                          VolumeReferenceReason,
-                          lCount);
+                lCount = AFSVolumeDecrement( pVolumeCB,
+                                             VolumeReferenceReason);
 
-            pVolumeCB = pNewVolumeCB;
+                AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSGetObjectStatus Decrement count on volume %p Reason %u Cnt %d\n",
+                              pVolumeCB,
+                              VolumeReferenceReason,
+                              lCount));
 
-            pNewVolumeCB = NULL;
+                pVolumeCB = pNewVolumeCB;
 
-            VolumeReferenceReason = NewVolumeReferenceReason;
+                pNewVolumeCB = NULL;
 
-            NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
+                VolumeReferenceReason = NewVolumeReferenceReason;
+
+                NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
+            }
 
             //
             // AFSLocateNameEntry does not alter the reference count of
@@ -8645,12 +8468,12 @@ AFSGetObjectStatus( IN AFSGetStatusInfoCB *GetStatusInfo,
 
             lCount = InterlockedDecrement( &pParentDirEntry->DirOpenReferenceCount);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSGetObjectStatus DecrementX count on %wZ DE %p Cnt %d\n",
                           &pParentDirEntry->NameInformation.FileName,
                           pParentDirEntry,
-                          lCount);
+                          lCount));
 
             pParentDirEntry = pNewParentDirEntry;
 
@@ -8667,14 +8490,19 @@ AFSGetObjectStatus( IN AFSGetStatusInfoCB *GetStatusInfo,
 
             pObjectInfo = pDirectoryEntry->ObjectInformation;
 
+            AFSAcquireExcl( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock,
+                            TRUE);
+
             lCount = AFSObjectInfoIncrement( pObjectInfo,
                                              AFS_OBJECT_REFERENCE_STATUS);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSGetObjectStatus Increment3 count on object %p Cnt %d\n",
                           pObjectInfo,
-                          lCount);
+                          lCount));
+
+            AFSReleaseResource( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
         }
 
         //
@@ -8724,13 +8552,13 @@ try_exit:
 
             lCount = InterlockedDecrement( &pDirectoryEntry->DirOpenReferenceCount);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSGetObjectStatus Decrement1 count on %wZ DE %p Ccb %p Cnt %d\n",
                           &pDirectoryEntry->NameInformation.FileName,
                           pDirectoryEntry,
                           NULL,
-                          lCount);
+                          lCount));
 
             ASSERT( lCount >= 0);
         }
@@ -8740,42 +8568,47 @@ try_exit:
 
             lCount = InterlockedDecrement( &pParentDirEntry->DirOpenReferenceCount);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSGetObjectStatus Decrement2 count on %wZ DE %p Ccb %p Cnt %d\n",
                           &pParentDirEntry->NameInformation.FileName,
                           pParentDirEntry,
                           NULL,
-                          lCount);
+                          lCount));
 
             ASSERT( lCount >= 0);
         }
 
-        if( pObjectInfo != NULL)
+        if( pVolumeCB != NULL)
         {
 
-            lCount = AFSObjectInfoDecrement( pObjectInfo,
-                                             AFS_OBJECT_REFERENCE_STATUS);
+            if( pObjectInfo != NULL)
+            {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSGetObjectStatus Decrement count on object %p Cnt %d\n",
-                          pObjectInfo,
-                          lCount);
-        }
+                AFSAcquireShared( pVolumeCB->ObjectInfoTree.TreeLock,
+                                  TRUE);
 
-        if( pVolumeCB != NULL)
-        {
+                lCount = AFSObjectInfoDecrement( pObjectInfo,
+                                                 AFS_OBJECT_REFERENCE_STATUS);
+
+                AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSGetObjectStatus Decrement count on object %p Cnt %d\n",
+                              pObjectInfo,
+                              lCount));
+
+                AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
+            }
 
             lCount = AFSVolumeDecrement( pVolumeCB,
                                          VolumeReferenceReason);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSGetObjectStatus Decrement4 count on volume %p Reason %u Cnt %d\n",
                           pVolumeCB,
                           VolumeReferenceReason,
-                          lCount);
+                          lCount));
         }
 
         if( pNameArray != NULL)
@@ -8806,10 +8639,10 @@ AFSCheckSymlinkAccess( IN AFSDirectoryCB *ParentDirectoryCB,
         // Search for the entry in the parent
         //
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE_2,
                       "AFSCheckSymlinkAccess Searching for entry %wZ case sensitive\n",
-                      ComponentName);
+                      ComponentName));
 
         ulCRC = AFSGenerateCRC( ComponentName,
                                 FALSE);
@@ -8828,10 +8661,10 @@ AFSCheckSymlinkAccess( IN AFSDirectoryCB *ParentDirectoryCB,
             // Missed so perform a case insensitive lookup
             //
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE_2,
                           "AFSCheckSymlinkAccess Searching for entry %wZ case insensitive\n",
-                          ComponentName);
+                          ComponentName));
 
             ulCRC = AFSGenerateCRC( ComponentName,
                                     TRUE);
@@ -8854,10 +8687,10 @@ AFSCheckSymlinkAccess( IN AFSDirectoryCB *ParentDirectoryCB,
                                             NULL))
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE_2,
                                   "AFSCheckSymlinkAccess Searching for entry %wZ short name\n",
-                                  ComponentName);
+                                  ComponentName));
 
                     AFSLocateShortNameDirEntry( ParentDirectoryCB->ObjectInformation->Specific.Directory.ShortNameTree,
                                                 ulCRC,
@@ -8870,13 +8703,13 @@ AFSCheckSymlinkAccess( IN AFSDirectoryCB *ParentDirectoryCB,
         {
             lCount = InterlockedIncrement( &pDirEntry->DirOpenReferenceCount);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSCheckSymlinkAccess Increment count on %wZ DE %p Ccb %p Cnt %d\n",
                           &pDirEntry->NameInformation.FileName,
                           pDirEntry,
                           NULL,
-                          lCount);
+                          lCount));
 
             ASSERT( lCount >= 0);
         }
@@ -8886,11 +8719,11 @@ AFSCheckSymlinkAccess( IN AFSDirectoryCB *ParentDirectoryCB,
         if( pDirEntry == NULL)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE_2,
                           "AFSCheckSymlinkAccess Failed to locate entry %wZ ntStatus %08X\n",
                           ComponentName,
-                          STATUS_OBJECT_NAME_NOT_FOUND);
+                          STATUS_OBJECT_NAME_NOT_FOUND));
 
             try_return( ntStatus = STATUS_OBJECT_NAME_NOT_FOUND);
         }
@@ -8900,22 +8733,22 @@ AFSCheckSymlinkAccess( IN AFSDirectoryCB *ParentDirectoryCB,
         // denied.
         //
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE_2,
                       "AFSCheckSymlinkAccess Failing symlink access to entry %wZ REPARSE_POINT_NOT_RESOLVED\n",
-                      ComponentName);
+                      ComponentName));
 
         ntStatus = STATUS_REPARSE_POINT_NOT_RESOLVED;
 
         lCount = InterlockedDecrement( &pDirEntry->DirOpenReferenceCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSCheckSymlinkAccess Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
                       &pDirEntry->NameInformation.FileName,
                       pDirEntry,
                       NULL,
-                      lCount);
+                      lCount));
 
         ASSERT( lCount >= 0);
 
@@ -9025,6 +8858,7 @@ AFSCreateDefaultSecurityDescriptor()
         if( pWorldSID == NULL)
         {
             AFSPrint( "AFSCreateDefaultSecurityDescriptor unable to allocate World SID\n");
+
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
 
@@ -9198,9 +9032,9 @@ AFSCreateDefaultSecurityDescriptor()
             try_return( ntStatus = STATUS_INVALID_PARAMETER);
         }
 
-        pRelativeSecurityDescr = (SECURITY_DESCRIPTOR *)ExAllocatePoolWithTag( NonPagedPool,
-                                                                               PAGE_SIZE,
-                                                                               AFS_GENERIC_MEMORY_27_TAG);
+       pRelativeSecurityDescr = (SECURITY_DESCRIPTOR *)AFSLibExAllocatePoolWithTag( NonPagedPool,
+                                                                                    PAGE_SIZE,
+                                                                                    AFS_GENERIC_MEMORY_27_TAG);
 
         if( pRelativeSecurityDescr == NULL)
         {
@@ -9234,28 +9068,38 @@ try_exit:
 
             if( pRelativeSecurityDescr != NULL)
             {
-                ExFreePool( pRelativeSecurityDescr);
+
+               AFSLibExFreePoolWithTag( pRelativeSecurityDescr,
+                                        AFS_GENERIC_MEMORY_27_TAG);
             }
         }
 
         if( pSecurityDescr != NULL)
         {
-            ExFreePool( pSecurityDescr);
+
+           AFSLibExFreePoolWithTag( pSecurityDescr,
+                                    AFS_GENERIC_MEMORY_27_TAG);
         }
 
         if( pSACL != NULL)
         {
-            ExFreePool( pSACL);
+
+           AFSLibExFreePoolWithTag( pSACL,
+                                    AFS_GENERIC_MEMORY_29_TAG);
         }
 
         if( pACE != NULL)
         {
-            ExFreePool( pACE);
+
+           AFSLibExFreePoolWithTag( pACE,
+                                    AFS_GENERIC_MEMORY_29_TAG);
         }
 
         if( pWorldSID != NULL)
         {
-            ExFreePool( pWorldSID);
+
+           AFSLibExFreePoolWithTag( pWorldSID,
+                                    AFS_GENERIC_MEMORY_29_TAG);
         }
     }
 
@@ -9273,12 +9117,14 @@ AFSRetrieveParentPath( IN UNICODE_STRING *FullFileName,
     // If the final character is a \, jump over it
     //
 
-    if( ParentPath->Buffer[ (ParentPath->Length/sizeof( WCHAR)) - 1] == L'\\')
+    if( ParentPath->Length >= sizeof( WCHAR)
+       && ParentPath->Buffer[ (ParentPath->Length/sizeof( WCHAR)) - 1] == L'\\')
     {
         ParentPath->Length -= sizeof( WCHAR);
     }
 
-    while( ParentPath->Buffer[ (ParentPath->Length/sizeof( WCHAR)) - 1] != L'\\')
+    while( ParentPath->Length >= sizeof( WCHAR)
+          && ParentPath->Buffer[ (ParentPath->Length/sizeof( WCHAR)) - 1] != L'\\')
     {
         ParentPath->Length -= sizeof( WCHAR);
     }
@@ -9287,7 +9133,10 @@ AFSRetrieveParentPath( IN UNICODE_STRING *FullFileName,
     // And the separator
     //
 
-    ParentPath->Length -= sizeof( WCHAR);
+    if ( ParentPath->Length >= sizeof( WCHAR))
+    {
+       ParentPath->Length -= sizeof( WCHAR);
+    }
 
     return;
 }
@@ -9400,48 +9249,58 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
                             IN ULONG InvalidateReason)
 {
 
+    AFSDeviceExt       *pRDRDevExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
     NTSTATUS            ntStatus = STATUS_SUCCESS;
-    LIST_ENTRY         *le;
-    AFSExtent          *pEntry;
-    ULONG               ulProcessCount = 0;
-    ULONG               ulCount = 0;
     LONG                lCount;
 
     __Enter
     {
 
-        switch( InvalidateReason)
+       switch( InvalidateReason)
         {
 
             case AFS_INVALIDATE_DELETED:
             {
 
-                if( ObjectInfo->FileType == AFS_FILE_TYPE_FILE &&
+               AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                             AFS_TRACE_LEVEL_VERBOSE,
+                             "AFSPerformObjectInvalidation on node type %d for FID %08lX-%08lX-%08lX-%08lX Reason DELETED\n",
+                             ObjectInfo->FileType,
+                             ObjectInfo->FileId.Cell,
+                             ObjectInfo->FileId.Volume,
+                             ObjectInfo->FileId.Vnode,
+                             ObjectInfo->FileId.Unique));
+
+               if( ObjectInfo->FileType == AFS_FILE_TYPE_FILE &&
                     ObjectInfo->Fcb != NULL)
                 {
 
-                    AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource,
-                                    TRUE);
+                   if( !BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+                   {
 
-                    ObjectInfo->Links = 0;
+                       AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource,
+                                       TRUE);
 
-                    ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_FILE_DELETED;
+                       ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_FILE_DELETED;
 
-                    KeSetEvent( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestComplete,
-                                0,
-                                FALSE);
+                       KeSetEvent( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestComplete,
+                                   0,
+                                   FALSE);
 
-                    //
-                    // Clear out the extents
-                    // And get rid of them (note this involves waiting
-                    // for any writes or reads to the cache to complete)
-                    //
+                       //
+                       // Clear out the extents
+                       // And get rid of them (note this involves waiting
+                       // for any writes or reads to the cache to complete)
+                       //
 
-                    AFSTearDownFcbExtents( ObjectInfo->Fcb,
-                                           NULL);
+                       AFSTearDownFcbExtents( ObjectInfo->Fcb,
+                                              NULL);
 
-                    AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource);
-                }
+                       AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource);
+                   }
+               }
+
+               ObjectInfo->Links = 0;
 
                 break;
             }
@@ -9449,418 +9308,728 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
             case AFS_INVALIDATE_DATA_VERSION:
             {
 
-                LARGE_INTEGER liCurrentOffset = {0,0};
-                LARGE_INTEGER liFlushLength = {0,0};
-                ULONG ulFlushLength = 0;
-                BOOLEAN bLocked = FALSE;
-                BOOLEAN bExtentsLocked = FALSE;
-                BOOLEAN bCleanExtents = FALSE;
-
                 if( ObjectInfo->FileType == AFS_FILE_TYPE_FILE &&
                     ObjectInfo->Fcb != NULL)
                 {
 
-                    AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->Resource,
-                                    TRUE);
+                   AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                 AFS_TRACE_LEVEL_VERBOSE,
+                                 "AFSPerformObjectInvalidation on node type %d for FID %08lX-%08lX-%08lX-%08lX Reason DATA_VERSION FCB %0p\n",
+                                 ObjectInfo->FileType,
+                                 ObjectInfo->FileId.Cell,
+                                 ObjectInfo->FileId.Volume,
+                                 ObjectInfo->FileId.Vnode,
+                                 ObjectInfo->FileId.Unique,
+                                 ObjectInfo->Fcb));
+
+                    if( BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+                    {
 
-                    bLocked = TRUE;
+                       AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                                     AFS_TRACE_LEVEL_VERBOSE,
+                                     "AFSPerformObjectInvalidate Acquiring Fcb lock %p EXCL %08lX\n",
+                                     &ObjectInfo->Fcb->NPFcb->Resource,
+                                     PsGetCurrentThread()));
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
-                                  AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSPerformObjectInvalidate Acquiring Fcb extents lock %p SHARED %08lX\n",
-                                  &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource,
-                                  PsGetCurrentThread());
+                       AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->Resource,
+                                       TRUE);
 
-                    AFSAcquireShared( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource,
-                                      TRUE);
+                       AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+                                      AFS_TRACE_LEVEL_VERBOSE,
+                                      "AFSPerformObjectInvalidation DirectIO Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+                                      &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
+                                      PsGetCurrentThread()));
 
-                    bExtentsLocked = TRUE;
+                        AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
+                                        TRUE);
 
-                    //
-                    // There are several possibilities here:
-                    //
-                    // 0. If there are no extents or all of the extents are dirty, do nothing.
-                    //
-                    // 1. There could be nothing dirty and an open reference count of zero
-                    //    in which case we can just tear down all of the extents without
-                    //    holding any resources.
-                    //
-                    // 2. There could be nothing dirty and a non-zero open reference count
-                    //    in which case we can issue a CcPurge against the entire file
-                    //    while holding just the Fcb Resource.
-                    //
-                    // 3. There can be dirty extents in which case we need to identify
-                    //    the non-dirty ranges and then perform a CcPurge on just the
-                    //    non-dirty ranges while holding just the Fcb Resource.
-                    //
+                       __try
+                        {
 
-                    if ( ObjectInfo->Fcb->Specific.File.ExtentCount != ObjectInfo->Fcb->Specific.File.ExtentsDirtyCount)
-                    {
+                            if( ObjectInfo->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL &&
+                                !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
+                                                      NULL,
+                                                      0,
+                                                      FALSE))
+                            {
+
+                                AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+                                              AFS_TRACE_LEVEL_WARNING,
+                                              "AFSPerformObjectInvalidation DirectIO CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
+                                              ObjectInfo->FileId.Cell,
+                                              ObjectInfo->FileId.Volume,
+                                              ObjectInfo->FileId.Vnode,
+                                              ObjectInfo->FileId.Unique));
+
+                                SetFlag( ObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
 
-                        if ( ObjectInfo->Fcb->Specific.File.ExtentsDirtyCount == 0)
+                               SetFlag( ObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
+                            }
+                        }
+                       __except( EXCEPTION_EXECUTE_HANDLER)
                         {
 
-                            AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource );
+                            ntStatus = GetExceptionCode();
 
-                            bExtentsLocked = FALSE;
+                            AFSDbgTrace(( 0,
+                                          0,
+                                          "EXCEPTION - AFSPerformObjectInvalidation DirectIO FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+                                          ObjectInfo->FileId.Cell,
+                                          ObjectInfo->FileId.Volume,
+                                          ObjectInfo->FileId.Vnode,
+                                          ObjectInfo->FileId.Unique,
+                                          ntStatus));
 
-                            if ( ObjectInfo->Fcb->OpenReferenceCount == 0)
-                            {
+                            SetFlag( ObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
 
-                                AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
+                           SetFlag( ObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
+                       }
 
-                                bLocked = FALSE;
+                       AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+                                      AFS_TRACE_LEVEL_VERBOSE,
+                                      "AFSPerformObjectInvalidation DirectIO Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+                                      &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
+                                      PsGetCurrentThread()));
 
-                                AFSTearDownFcbExtents( ObjectInfo->Fcb,
-                                                       NULL);
-                            }
-                            else
+                        AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->SectionObjectResource);
+
+                       AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                                     AFS_TRACE_LEVEL_VERBOSE,
+                                     "AFSPerformObjectInvalidation DirectIO Releasing Fcb lock %p EXCL %08lX\n",
+                                     &ObjectInfo->Fcb->NPFcb->Resource,
+                                     PsGetCurrentThread()));
+
+                       AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
+                   }
+                    else
+                    {
+                       LIST_ENTRY         *le;
+                       AFSExtent          *pEntry;
+                       ULONG               ulProcessCount = 0;
+                       ULONG               ulCount = 0;
+                       LARGE_INTEGER liCurrentOffset = {0,0};
+                       LARGE_INTEGER liFlushLength = {0,0};
+                       ULONG ulFlushLength = 0;
+                       BOOLEAN bLocked = FALSE;
+                       BOOLEAN bExtentsLocked = FALSE;
+                       BOOLEAN bCleanExtents = FALSE;
+
+                       AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                                     AFS_TRACE_LEVEL_VERBOSE,
+                                     "AFSPerformObjectInvalidate Acquiring Fcb lock %p EXCL %08lX\n",
+                                     &ObjectInfo->Fcb->NPFcb->Resource,
+                                     PsGetCurrentThread()));
+
+                       AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->Resource,
+                                       TRUE);
+
+                       bLocked = TRUE;
+
+                        AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                                      AFS_TRACE_LEVEL_VERBOSE,
+                                      "AFSPerformObjectInvalidate Acquiring Fcb extents lock %p SHARED %08lX\n",
+                                      &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource,
+                                      PsGetCurrentThread()));
+
+                        AFSAcquireShared( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource,
+                                          TRUE);
+
+                        bExtentsLocked = TRUE;
+
+                        //
+                        // There are several possibilities here:
+                        //
+                        // 0. If there are no extents or all of the extents are dirty, do nothing.
+                        //
+                        // 1. There could be nothing dirty and an open reference count of zero
+                        //    in which case we can just tear down all of the extents without
+                        //    holding any resources.
+                        //
+                        // 2. There could be nothing dirty and a non-zero open reference count
+                        //    in which case we can issue a CcPurge against the entire file
+                        //    while holding just the Fcb Resource.
+                        //
+                        // 3. There can be dirty extents in which case we need to identify
+                        //    the non-dirty ranges and then perform a CcPurge on just the
+                        //    non-dirty ranges while holding just the Fcb Resource.
+                        //
+
+                        if ( ObjectInfo->Fcb->Specific.File.ExtentCount != ObjectInfo->Fcb->Specific.File.ExtentsDirtyCount)
+                        {
+
+                            if ( ObjectInfo->Fcb->Specific.File.ExtentsDirtyCount == 0)
                             {
 
-                                AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
-                                              AFS_TRACE_LEVEL_VERBOSE,
-                                              "AFSPerformObjectInvalidation Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
-                                              &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
-                                              PsGetCurrentThread());
+                                AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource );
 
-                                AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
-                                                TRUE);
+                                bExtentsLocked = FALSE;
 
-                                AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
+                                if ( ObjectInfo->Fcb->OpenReferenceCount == 0)
+                                {
 
-                                bLocked = FALSE;
+                                    AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
 
-                                __try
+                                    bLocked = FALSE;
+
+                                    AFSTearDownFcbExtents( ObjectInfo->Fcb,
+                                                           NULL);
+                                }
+                                else
                                 {
 
-                                    if( ObjectInfo->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL &&
-                                        !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
-                                                              NULL,
-                                                              0,
-                                                              FALSE))
+                                   AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+                                                  AFS_TRACE_LEVEL_VERBOSE,
+                                                  "AFSPerformObjectInvalidation Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+                                                  &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
+                                                  PsGetCurrentThread()));
+
+                                    AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
+                                                    TRUE);
+
+                                    __try
+                                    {
+
+                                        if( ObjectInfo->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL &&
+                                            !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
+                                                                  NULL,
+                                                                  0,
+                                                                  FALSE))
+                                        {
+
+                                            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+                                                          AFS_TRACE_LEVEL_WARNING,
+                                                          "AFSPerformObjectInvalidation CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
+                                                          ObjectInfo->FileId.Cell,
+                                                          ObjectInfo->FileId.Volume,
+                                                          ObjectInfo->FileId.Vnode,
+                                                          ObjectInfo->FileId.Unique));
+
+                                           SetFlag( ObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
+
+                                           SetFlag( ObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
+                                       }
+                                        else
+                                        {
+
+                                            bCleanExtents = TRUE;
+                                        }
+                                    }
+                                   __except( EXCEPTION_EXECUTE_HANDLER)
                                     {
 
-                                        AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
-                                                      AFS_TRACE_LEVEL_WARNING,
-                                                      "AFSPerformObjectInvalidation CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
+                                        ntStatus = GetExceptionCode();
+
+                                        AFSDbgTrace(( 0,
+                                                      0,
+                                                      "EXCEPTION - AFSPerformObjectInvalidation FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
                                                       ObjectInfo->FileId.Cell,
                                                       ObjectInfo->FileId.Volume,
                                                       ObjectInfo->FileId.Vnode,
-                                                      ObjectInfo->FileId.Unique);
+                                                      ObjectInfo->FileId.Unique,
+                                                      ntStatus));
 
                                         SetFlag( ObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
-                                    }
-                                    else
-                                    {
 
-                                        bCleanExtents = TRUE;
+                                       SetFlag( ObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
                                     }
-                                }
-                                __except( EXCEPTION_EXECUTE_HANDLER)
-                                {
-
-                                    ntStatus = GetExceptionCode();
 
-                                    AFSDbgLogMsg( 0,
-                                                  0,
-                                                  "EXCEPTION - AFSPerformObjectInvalidation FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
-                                                  ObjectInfo->FileId.Cell,
-                                                  ObjectInfo->FileId.Volume,
-                                                  ObjectInfo->FileId.Vnode,
-                                                  ObjectInfo->FileId.Unique,
-                                                  ntStatus);
+                                   AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+                                                  AFS_TRACE_LEVEL_VERBOSE,
+                                                  "AFSPerformObjectInvalidation Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+                                                  &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
+                                                  PsGetCurrentThread()));
 
-                                    SetFlag( ObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
-                                }
+                                    AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->SectionObjectResource);
 
-                                AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
-                                              AFS_TRACE_LEVEL_VERBOSE,
-                                              "AFSPerformObjectInvalidation Releasing Fcb SectionObject lock %p EXCL %08lX\n",
-                                              &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
-                                              PsGetCurrentThread());
+                                   AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
 
-                                AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->SectionObjectResource);
+                                   bLocked = FALSE;
+                                }
                             }
-                        }
-                        else
-                        {
+                            else
+                            {
 
-                            AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource );
+                                AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource );
 
-                            bExtentsLocked = FALSE;
+                                bExtentsLocked = FALSE;
 
-                            AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
-                                          AFS_TRACE_LEVEL_VERBOSE,
-                                          "AFSPerformObjectInvalidation Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
-                                          &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
-                                          PsGetCurrentThread());
+                               AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+                                              AFS_TRACE_LEVEL_VERBOSE,
+                                              "AFSPerformObjectInvalidation Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+                                              &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
+                                              PsGetCurrentThread()));
 
-                            AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
-                                            TRUE);
+                                AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
+                                                TRUE);
 
-                            AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
+                                //
+                                // Must build a list of non-dirty ranges from the beginning of the file
+                                // to the end.  There can be at most (Fcb->Specific.File.ExtentsDirtyCount + 1)
+                                // ranges.  In all but the most extreme random data write scenario there will
+                                // be significantly fewer.
+                                //
+                                // For each range we need offset and size.
+                                //
 
-                            bLocked = FALSE;
+                                AFSByteRange * ByteRangeList = NULL;
+                                ULONG          ulByteRangeCount = 0;
+                                ULONG          ulIndex;
+                                BOOLEAN        bPurgeOnClose = FALSE;
 
-                            //
-                            // Must build a list of non-dirty ranges from the beginning of the file
-                            // to the end.  There can be at most (Fcb->Specific.File.ExtentsDirtyCount + 1)
-                            // ranges.  In all but the most extreme random data write scenario there will
-                            // be significantly fewer.
-                            //
-                            // For each range we need offset and size.
-                            //
+                                __try
+                                {
 
-                            AFSByteRange * ByteRangeList = NULL;
-                            ULONG          ulByteRangeCount = 0;
-                            ULONG          ulIndex;
-                            BOOLEAN        bPurgeOnClose = FALSE;
+                                    ulByteRangeCount = AFSConstructCleanByteRangeList( ObjectInfo->Fcb,
+                                                                                       &ByteRangeList);
 
-                            __try
-                            {
+                                    if ( ByteRangeList != NULL ||
+                                         ulByteRangeCount == 0)
+                                    {
 
-                                ulByteRangeCount = AFSConstructCleanByteRangeList( ObjectInfo->Fcb,
-                                                                                   &ByteRangeList);
+                                        for ( ulIndex = 0; ulIndex < ulByteRangeCount; ulIndex++)
+                                        {
 
-                                if ( ByteRangeList != NULL ||
-                                     ulByteRangeCount == 0)
-                                {
+                                            ULONG ulSize;
 
-                                    for ( ulIndex = 0; ulIndex < ulByteRangeCount; ulIndex++)
-                                    {
+                                            do {
 
-                                        ULONG ulSize;
+                                                ulSize = ByteRangeList[ulIndex].Length.QuadPart > DWORD_MAX ? DWORD_MAX : ByteRangeList[ulIndex].Length.LowPart;
 
-                                        do {
+                                               __try
+                                               {
 
-                                            ulSize = ByteRangeList[ulIndex].Length.QuadPart > DWORD_MAX ? DWORD_MAX : ByteRangeList[ulIndex].Length.LowPart;
+                                                   if( ObjectInfo->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL &&
+                                                       !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
+                                                                             &ByteRangeList[ulIndex].FileOffset,
+                                                                             ulSize,
+                                                                             FALSE))
+                                                   {
 
-                                            if( ObjectInfo->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL &&
-                                                !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
-                                                                      &ByteRangeList[ulIndex].FileOffset,
-                                                                      ulSize,
-                                                                      FALSE))
-                                            {
+                                                       AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+                                                                     AFS_TRACE_LEVEL_WARNING,
+                                                                     "AFSPerformObjectInvalidation [1] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
+                                                                     ObjectInfo->FileId.Cell,
+                                                                     ObjectInfo->FileId.Volume,
+                                                                     ObjectInfo->FileId.Vnode,
+                                                                     ObjectInfo->FileId.Unique));
 
-                                                AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
-                                                              AFS_TRACE_LEVEL_WARNING,
-                                                              "AFSPerformObjectInvalidation [1] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
-                                                              ObjectInfo->FileId.Cell,
-                                                              ObjectInfo->FileId.Volume,
-                                                              ObjectInfo->FileId.Vnode,
-                                                              ObjectInfo->FileId.Unique);
+                                                       bPurgeOnClose = TRUE;
+                                                   }
+                                                   else
+                                                   {
 
-                                                bPurgeOnClose = TRUE;
-                                            }
-                                            else
-                                            {
+                                                       bCleanExtents = TRUE;
+                                                   }
+                                               }
+                                               __except( EXCEPTION_EXECUTE_HANDLER)
+                                               {
 
-                                                bCleanExtents = TRUE;
-                                            }
+                                                   ntStatus = GetExceptionCode();
 
-                                            ByteRangeList[ulIndex].Length.QuadPart -= ulSize;
+                                                   AFSDbgTrace(( 0,
+                                                                 0,
+                                                                 "EXCEPTION - AFSPerformObjectInvalidation CcPurgeCacheSection (1) FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                                                                 ObjectInfo->FileId.Cell,
+                                                                 ObjectInfo->FileId.Volume,
+                                                                 ObjectInfo->FileId.Vnode,
+                                                                 ObjectInfo->FileId.Unique,
+                                                                 ntStatus));
+                                               }
 
-                                            ByteRangeList[ulIndex].FileOffset.QuadPart += ulSize;
+                                                ByteRangeList[ulIndex].Length.QuadPart -= ulSize;
 
-                                        } while ( ByteRangeList[ulIndex].Length.QuadPart > 0);
-                                    }
-                                }
-                                else
-                                {
+                                                ByteRangeList[ulIndex].FileOffset.QuadPart += ulSize;
 
-                                    //
-                                    // We couldn't allocate the memory to build the purge list
-                                    // so just walk the extent list while holding the ExtentsList Resource.
-                                    // This could deadlock but we do not have much choice.
-                                    //
+                                            } while ( ByteRangeList[ulIndex].Length.QuadPart > 0);
+                                        }
+                                    }
+                                    else
+                                    {
 
-                                    AFSAcquireExcl(  &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource,
-                                                    TRUE);
-                                    bExtentsLocked = TRUE;
+                                        //
+                                        // We couldn't allocate the memory to build the purge list
+                                        // so just walk the extent list while holding the ExtentsList Resource.
+                                        // This could deadlock but we do not have much choice.
+                                        //
 
-                                    le = ObjectInfo->Fcb->Specific.File.ExtentsLists[AFS_EXTENTS_LIST].Flink;
+                                        AFSAcquireExcl(  &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource,
+                                                        TRUE);
+                                        bExtentsLocked = TRUE;
 
-                                    ulProcessCount = 0;
+                                        le = ObjectInfo->Fcb->Specific.File.ExtentsLists[AFS_EXTENTS_LIST].Flink;
 
-                                    ulCount = (ULONG)ObjectInfo->Fcb->Specific.File.ExtentCount;
+                                        ulProcessCount = 0;
 
-                                    if( ulCount > 0)
-                                    {
-                                        pEntry = ExtentFor( le, AFS_EXTENTS_LIST );
+                                        ulCount = (ULONG)ObjectInfo->Fcb->Specific.File.ExtentCount;
 
-                                        while( ulProcessCount < ulCount)
+                                        if( ulCount > 0)
                                         {
                                             pEntry = ExtentFor( le, AFS_EXTENTS_LIST );
 
-                                            if( !BooleanFlagOn( pEntry->Flags, AFS_EXTENT_DIRTY))
+                                            while( ulProcessCount < ulCount)
                                             {
-                                                if( !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
-                                                                          &pEntry->FileOffset,
-                                                                          pEntry->Size,
-                                                                          FALSE))
-                                                {
+                                                pEntry = ExtentFor( le, AFS_EXTENTS_LIST );
 
-                                                    AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
-                                                                  AFS_TRACE_LEVEL_WARNING,
-                                                                  "AFSPerformObjectInvalidation [2] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
-                                                                  ObjectInfo->FileId.Cell,
-                                                                  ObjectInfo->FileId.Volume,
-                                                                  ObjectInfo->FileId.Vnode,
-                                                                  ObjectInfo->FileId.Unique);
-
-                                                    bPurgeOnClose = TRUE;
-                                                }
-                                                else
+                                                if( !BooleanFlagOn( pEntry->Flags, AFS_EXTENT_DIRTY))
                                                 {
-
-                                                    bCleanExtents = TRUE;
+                                                   __try
+                                                   {
+                                                       if( !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
+                                                                                 &pEntry->FileOffset,
+                                                                                 pEntry->Size,
+                                                                                 FALSE))
+                                                       {
+
+                                                           AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+                                                                         AFS_TRACE_LEVEL_WARNING,
+                                                                         "AFSPerformObjectInvalidation [2] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
+                                                                         ObjectInfo->FileId.Cell,
+                                                                         ObjectInfo->FileId.Volume,
+                                                                         ObjectInfo->FileId.Vnode,
+                                                                         ObjectInfo->FileId.Unique));
+
+                                                           bPurgeOnClose = TRUE;
+                                                       }
+                                                       else
+                                                       {
+
+                                                           bCleanExtents = TRUE;
+                                                       }
+                                                   }
+                                                   __except( EXCEPTION_EXECUTE_HANDLER)
+                                                   {
+
+                                                       ntStatus = GetExceptionCode();
+
+                                                       AFSDbgTrace(( 0,
+                                                                     0,
+                                                                     "EXCEPTION - AFSPerformObjectInvalidation CcPurgeCacheSection (2) FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                                                                     ObjectInfo->FileId.Cell,
+                                                                     ObjectInfo->FileId.Volume,
+                                                                     ObjectInfo->FileId.Vnode,
+                                                                     ObjectInfo->FileId.Unique,
+                                                                     ntStatus));
+                                                   }
                                                 }
-                                            }
-
-                                            if( liCurrentOffset.QuadPart < pEntry->FileOffset.QuadPart)
-                                            {
 
-                                                liFlushLength.QuadPart = pEntry->FileOffset.QuadPart - liCurrentOffset.QuadPart;
-
-                                                while( liFlushLength.QuadPart > 0)
+                                                if( liCurrentOffset.QuadPart < pEntry->FileOffset.QuadPart)
                                                 {
 
-                                                    if( liFlushLength.QuadPart > 512 * 1024000)
-                                                    {
-                                                        ulFlushLength = 512 * 1024000;
-                                                    }
-                                                    else
-                                                    {
-                                                        ulFlushLength = liFlushLength.LowPart;
-                                                    }
-
-                                                    if( !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
-                                                                              &liCurrentOffset,
-                                                                              ulFlushLength,
-                                                                              FALSE))
-                                                    {
-
-                                                        AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
-                                                                      AFS_TRACE_LEVEL_WARNING,
-                                                                      "AFSPerformObjectInvalidation [3] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
-                                                                      ObjectInfo->FileId.Cell,
-                                                                      ObjectInfo->FileId.Volume,
-                                                                      ObjectInfo->FileId.Vnode,
-                                                                      ObjectInfo->FileId.Unique);
+                                                    liFlushLength.QuadPart = pEntry->FileOffset.QuadPart - liCurrentOffset.QuadPart;
 
-                                                        bPurgeOnClose = TRUE;
-                                                    }
-                                                    else
+                                                    while( liFlushLength.QuadPart > 0)
                                                     {
 
-                                                        bCleanExtents = TRUE;
+                                                        if( liFlushLength.QuadPart > 512 * 1024000)
+                                                        {
+                                                            ulFlushLength = 512 * 1024000;
+                                                        }
+                                                        else
+                                                        {
+                                                            ulFlushLength = liFlushLength.LowPart;
+                                                        }
+
+                                                       __try
+                                                       {
+                                                           if( !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
+                                                                                     &liCurrentOffset,
+                                                                                     ulFlushLength,
+                                                                                     FALSE))
+                                                           {
+
+                                                               AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+                                                                             AFS_TRACE_LEVEL_WARNING,
+                                                                             "AFSPerformObjectInvalidation [3] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
+                                                                             ObjectInfo->FileId.Cell,
+                                                                             ObjectInfo->FileId.Volume,
+                                                                             ObjectInfo->FileId.Vnode,
+                                                                             ObjectInfo->FileId.Unique));
+
+                                                               bPurgeOnClose = TRUE;
+                                                           }
+                                                           else
+                                                           {
+
+                                                               bCleanExtents = TRUE;
+                                                           }
+                                                       }
+                                                       __except( EXCEPTION_EXECUTE_HANDLER)
+                                                       {
+
+                                                           ntStatus = GetExceptionCode();
+
+                                                           AFSDbgTrace(( 0,
+                                                                         0,
+                                                                         "EXCEPTION - AFSPerformObjectInvalidation CcPurgeCacheSection (3) FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                                                                         ObjectInfo->FileId.Cell,
+                                                                         ObjectInfo->FileId.Volume,
+                                                                         ObjectInfo->FileId.Vnode,
+                                                                         ObjectInfo->FileId.Unique,
+                                                                         ntStatus));
+                                                       }
+
+                                                        liFlushLength.QuadPart -= ulFlushLength;
                                                     }
-
-                                                    liFlushLength.QuadPart -= ulFlushLength;
                                                 }
-                                            }
 
-                                            liCurrentOffset.QuadPart = pEntry->FileOffset.QuadPart + pEntry->Size;
+                                                liCurrentOffset.QuadPart = pEntry->FileOffset.QuadPart + pEntry->Size;
 
-                                            ulProcessCount++;
-                                            le = le->Flink;
+                                                ulProcessCount++;
+                                                le = le->Flink;
+                                            }
                                         }
-                                    }
-                                    else
-                                    {
-                                        if( !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
-                                                                  NULL,
-                                                                  0,
-                                                                  FALSE))
+                                        else
                                         {
-
-                                            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
-                                                          AFS_TRACE_LEVEL_WARNING,
-                                                          "AFSPerformObjectInvalidation [4] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
-                                                          ObjectInfo->FileId.Cell,
-                                                          ObjectInfo->FileId.Volume,
-                                                          ObjectInfo->FileId.Vnode,
-                                                          ObjectInfo->FileId.Unique);
-
-                                            bPurgeOnClose = TRUE;
+                                           __try
+                                           {
+                                               if( !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
+                                                                         NULL,
+                                                                         0,
+                                                                         FALSE))
+                                               {
+
+                                                   AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+                                                                 AFS_TRACE_LEVEL_WARNING,
+                                                                 "AFSPerformObjectInvalidation [4] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
+                                                                 ObjectInfo->FileId.Cell,
+                                                                 ObjectInfo->FileId.Volume,
+                                                                 ObjectInfo->FileId.Vnode,
+                                                                 ObjectInfo->FileId.Unique));
+
+                                                   bPurgeOnClose = TRUE;
+                                               }
+                                               else
+                                               {
+
+                                                   bCleanExtents = TRUE;
+                                               }
+                                           }
+                                           __except( EXCEPTION_EXECUTE_HANDLER)
+                                           {
+
+                                               ntStatus = GetExceptionCode();
+
+                                               AFSDbgTrace(( 0,
+                                                             0,
+                                                             "EXCEPTION - AFSPerformObjectInvalidation CcPurgeCacheSection (4) FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                                                             ObjectInfo->FileId.Cell,
+                                                             ObjectInfo->FileId.Volume,
+                                                             ObjectInfo->FileId.Vnode,
+                                                             ObjectInfo->FileId.Unique,
+                                                             ntStatus));
+                                           }
                                         }
-                                        else
+
+                                        if ( bPurgeOnClose)
                                         {
 
-                                            bCleanExtents = TRUE;
+                                            SetFlag( ObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
                                         }
                                     }
+                                }
+                               __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+                                {
 
-                                    if ( bPurgeOnClose)
-                                    {
+                                    ntStatus = GetExceptionCode();
 
-                                        SetFlag( ObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
-                                    }
+                                    AFSDbgTrace(( 0,
+                                                  0,
+                                                  "EXCEPTION - AFSPerformObjectInvalidation FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                                                  ObjectInfo->FileId.Cell,
+                                                  ObjectInfo->FileId.Volume,
+                                                  ObjectInfo->FileId.Vnode,
+                                                  ObjectInfo->FileId.Unique,
+                                                  ntStatus));
                                 }
-                            }
-                            __except( EXCEPTION_EXECUTE_HANDLER)
-                            {
 
-                                ntStatus = GetExceptionCode();
+                               AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+                                              AFS_TRACE_LEVEL_VERBOSE,
+                                              "AFSPerformObjectInvalidation Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+                                              &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
+                                              PsGetCurrentThread()));
 
-                                AFSDbgLogMsg( 0,
-                                              0,
-                                              "EXCEPTION - AFSPerformObjectInvalidation FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
-                                              ObjectInfo->FileId.Cell,
-                                              ObjectInfo->FileId.Volume,
-                                              ObjectInfo->FileId.Vnode,
-                                              ObjectInfo->FileId.Unique,
-                                              ntStatus);
-                            }
+                                AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->SectionObjectResource);
 
-                            AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
-                                          AFS_TRACE_LEVEL_VERBOSE,
-                                          "AFSPerformObjectInvalidation Releasing Fcb SectionObject lock %p EXCL %08lX\n",
-                                          &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
-                                          PsGetCurrentThread());
+                               AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
 
-                            AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->SectionObjectResource);
+                               bLocked = FALSE;
+                            }
                         }
-                    }
 
-                    if ( bExtentsLocked)
-                    {
+                        if ( bExtentsLocked)
+                        {
 
-                        AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource );
-                    }
+                            AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource );
+                        }
 
-                    if ( bLocked)
-                    {
+                       if ( bLocked)
+                       {
 
-                        AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
-                    }
+                           AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
+                       }
 
-                    if ( bCleanExtents)
-                    {
+                       if ( bCleanExtents)
+                       {
 
-                        AFSReleaseCleanExtents( ObjectInfo->Fcb,
-                                                NULL);
-                    }
+                           AFSReleaseCleanExtents( ObjectInfo->Fcb,
+                                                   NULL);
+                       }
+                   }
                 }
+               else if ( ObjectInfo->FileType == AFS_FILE_TYPE_FILE)
+               {
+
+                   AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                 AFS_TRACE_LEVEL_VERBOSE,
+                                 "AFSPerformObjectInvalidation on node type %d for FID %08lX-%08lX-%08lX-%08lX Reason DATA_VERSION FCB NULL\n",
+                                 ObjectInfo->FileType,
+                                 ObjectInfo->FileId.Cell,
+                                 ObjectInfo->FileId.Volume,
+                                 ObjectInfo->FileId.Vnode,
+                                 ObjectInfo->FileId.Unique));
+
+                   SetFlag( ObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
+               }
 
                 break;
             }
-        }
+       }
 
         //
         // Destroy the reference passed in by the caller to AFSInvalidateObject
         // or AFSQueueInvalidateObject
         //
 
+        AFSAcquireShared( ObjectInfo->VolumeCB->ObjectInfoTree.TreeLock,
+                          TRUE);
+
         lCount = AFSObjectInfoDecrement( ObjectInfo,
                                          AFS_OBJECT_REFERENCE_INVALIDATION);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSPerformObjectInvalidation Decrement count on object %p Cnt %d\n",
                       ObjectInfo,
-                      lCount);
+                      lCount));
+
+        AFSReleaseResource( ObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
+    }
+
+    return ntStatus;
+}
+
+BOOLEAN
+AFSIgnoreReparsePointToFile( void)
+{
+    AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
+    BOOLEAN bIgnoreReparsePoint;
+
+    {
+
+       bIgnoreReparsePoint = BooleanFlagOn( pDeviceExt->Specific.RDR.ReparsePointPolicy,
+                                            AFS_REPARSE_POINT_TO_FILE_AS_FILE);
+    }
+
+    return bIgnoreReparsePoint;
+}
+
+NTSTATUS
+AFSRetrieveTargetFileInfo( IN PUNICODE_STRING TargetName,
+                          OUT AFSFileInfoCB *FileInfo)
+{
+
+    NTSTATUS ntStatus = STATUS_SUCCESS;
+    OBJECT_ATTRIBUTES stObjectAttribs;
+    HANDLE hFile = NULL;
+    IO_STATUS_BLOCK stIoStatus;
+    FILE_NETWORK_OPEN_INFORMATION stFileInfo;
+
+    __Enter
+    {
+
+       InitializeObjectAttributes( &stObjectAttribs,
+                                   TargetName,
+                                   OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,
+                                   NULL,
+                                   NULL);
+
+       ntStatus = ZwCreateFile( &hFile,
+                                FILE_READ_ATTRIBUTES,
+                                &stObjectAttribs,
+                                &stIoStatus,
+                                NULL,
+                                0,
+                                FILE_SHARE_READ | FILE_SHARE_WRITE,
+                                FILE_OPEN,
+                                FILE_SYNCHRONOUS_IO_NONALERT,
+                                NULL,
+                                0);
+
+       if( !NT_SUCCESS( ntStatus))
+       {
+
+           try_return( ntStatus);
+       }
+
+       ntStatus = ZwQueryInformationFile( hFile,
+                                          &stIoStatus,
+                                          &stFileInfo,
+                                          sizeof( FILE_NETWORK_OPEN_INFORMATION),
+                                          FileNetworkOpenInformation);
+
+       if( !NT_SUCCESS( ntStatus))
+       {
+
+           try_return( ntStatus);
+       }
+
+       FileInfo->FileAttributes = stFileInfo.FileAttributes;
+
+       FileInfo->AllocationSize = stFileInfo.AllocationSize;
+
+       FileInfo->EndOfFile = stFileInfo.EndOfFile;
+
+       FileInfo->CreationTime = stFileInfo.CreationTime;
+
+       FileInfo->LastAccessTime = stFileInfo.LastAccessTime;
+
+       FileInfo->LastWriteTime = stFileInfo.LastWriteTime;
+
+       FileInfo->ChangeTime = stFileInfo.ChangeTime;
+
+try_exit:
+
+       if( hFile != NULL)
+       {
+           ZwClose( hFile);
+       }
     }
 
     return ntStatus;
 }
+
+BOOLEAN
+AFSIsShareName( IN UNICODE_STRING *FileName)
+{
+
+    BOOLEAN     bIsShareName = TRUE;
+    USHORT      usIndex = 1; // Skip the first \
+
+    //
+    // A share name will be of the form \Share so only a single \ at the beginning
+    //
+
+    while( usIndex < FileName->Length/sizeof( WCHAR))
+    {
+
+       if( FileName->Buffer[ usIndex] == L'\\')
+       {
+           bIsShareName = FALSE;
+           break;
+       }
+
+       usIndex++;
+    }
+
+    return bIsShareName;
+}
\ No newline at end of file