Windows: Remove trailing slash on non-root directories
[openafs.git] / src / WINNT / afsrdr / kernel / lib / AFSGeneric.cpp
index 3acfa8e..f2ea340 100644 (file)
@@ -723,7 +723,8 @@ AFSInitializeGlobalDirectoryEntries()
         if( pNonPagedDirEntry == NULL)
         {
 
-            ExFreePool( pDirNode);
+           AFSLibExFreePoolWithTag( pDirNode,
+                                    AFS_DIR_ENTRY_TAG);
 
             lCount = AFSObjectInfoDecrement( pObjectInfoCB,
                                              AFS_OBJECT_REFERENCE_GLOBAL);
@@ -862,7 +863,8 @@ AFSInitializeGlobalDirectoryEntries()
         if( pNonPagedDirEntry == NULL)
         {
 
-            ExFreePool( pDirNode);
+           AFSLibExFreePoolWithTag( pDirNode,
+                                    AFS_DIR_ENTRY_TAG);
 
             lCount = AFSObjectInfoDecrement( pObjectInfoCB,
                                              AFS_OBJECT_REFERENCE_GLOBAL);
@@ -951,9 +953,11 @@ try_exit:
 
                 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;
             }
@@ -978,9 +982,11 @@ try_exit:
 
                 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;
             }
@@ -1140,10 +1146,18 @@ AFSInitDirEntry( IN AFSObjectInfoCB *ParentObjectInfo,
 
             pObjectInfoCB->Expiration = DirEnumEntry->Expiration;
 
-            pObjectInfoCB->DataVersion = DirEnumEntry->DataVersion;
+           pObjectInfoCB->DataVersion = DirEnumEntry->DataVersion;
 
-            ClearFlag( pObjectInfoCB->Flags, AFS_OBJECT_FLAGS_VERIFY);
-        }
+           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
@@ -1159,6 +1173,8 @@ AFSInitDirEntry( IN AFSObjectInfoCB *ParentObjectInfo,
                       pObjectInfoCB,
                       lCount));
 
+        KeQueryTickCount( &pObjectInfoCB->LastAccessCount);
+
         AFSReleaseResource( ParentObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
 
         ntStatus = STATUS_SUCCESS;
@@ -1687,6 +1703,7 @@ AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo,
 {
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
+    AFSDeviceExt *pRDRDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
     IO_STATUS_BLOCK stIoStatus;
     ULONG ulFilter = 0;
     AFSObjectInfoCB * pParentObjectInfo = NULL;
@@ -1705,7 +1722,8 @@ AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo,
     {
 
         pParentObjectInfo = AFSFindObjectInfo( (*ppObjectInfo)->VolumeCB,
-                                               &(*ppObjectInfo)->ParentFileId);
+                                               &(*ppObjectInfo)->ParentFileId,
+                                               FALSE);
     }
 
     if( (*ppObjectInfo)->FileType == AFS_FILE_TYPE_SYMLINK ||
@@ -1729,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;
@@ -1861,6 +1877,21 @@ AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo,
                               (*ppObjectInfo)->FileId.Vnode,
                               (*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);
 
@@ -1910,7 +1941,7 @@ AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo,
                         }
                     }
                 }
-                __except( EXCEPTION_EXECUTE_HANDLER)
+               __except( EXCEPTION_EXECUTE_HANDLER)
                 {
 
                     ntStatus = GetExceptionCode();
@@ -1927,16 +1958,34 @@ AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo,
                     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()));
+
+               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);
+                   AFSTearDownFcbExtents( (*ppObjectInfo)->Fcb,
+                                          NULL);
+               }
             }
 
             (*ppObjectInfo)->DataVersion.QuadPart = (ULONGLONG)-1;
@@ -2141,7 +2190,7 @@ AFSInvalidateCache( IN AFSInvalidateCacheCB *InvalidateCB)
             try_return( ntStatus);
         }
 
-        AFSAcquireShared( pVolumeCB->ObjectInfoTree.TreeLock,
+        AFSAcquireExcl( pVolumeCB->ObjectInfoTree.TreeLock,
                           TRUE);
 
         if ( AFSIsVolumeFID( &InvalidateCB->FileID))
@@ -2251,7 +2300,8 @@ AFSIsChildOfParent( IN AFSFcb *Dcb,
         }
 
         pParentObjectInfo = AFSFindObjectInfo( pCurrentFcb->ObjectInformation->VolumeCB,
-                                               &pCurrentFcb->ObjectInformation->ParentFileId);
+                                               &pCurrentFcb->ObjectInformation->ParentFileId,
+                                               FALSE);
 
         if ( pParentObjectInfo != NULL)
         {
@@ -2424,7 +2474,7 @@ AFSSubstituteSysName( IN UNICODE_STRING *ComponentName,
             AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE_2,
                           "AFSSubstituteSysName No sysname %wZ Status %08lX\n",
-                          &ComponentName,
+                         ComponentName,
                           STATUS_OBJECT_NAME_NOT_FOUND));
 
             try_return( ntStatus = STATUS_OBJECT_NAME_NOT_FOUND);
@@ -2671,6 +2721,9 @@ AFSInvalidateVolume( IN AFSVolumeCB *VolumeCB,
             }
         }
 
+        AFSAcquireShared( VolumeCB->ObjectInfoTree.TreeLock,
+                          TRUE);
+
         //
         // Invalidate the volume root directory
         //
@@ -2689,9 +2742,14 @@ AFSInvalidateVolume( IN AFSVolumeCB *VolumeCB,
                           pCurrentObject,
                           lCount));
 
+            AFSReleaseResource( VolumeCB->ObjectInfoTree.TreeLock);
+
             AFSInvalidateObject( &pCurrentObject,
                                  Reason);
 
+            AFSAcquireShared( VolumeCB->ObjectInfoTree.TreeLock,
+                              TRUE);
+
             if ( pCurrentObject)
             {
 
@@ -2710,9 +2768,6 @@ AFSInvalidateVolume( IN AFSVolumeCB *VolumeCB,
         // Apply invalidation to all other volume objects
         //
 
-        AFSAcquireShared( VolumeCB->ObjectInfoTree.TreeLock,
-                          TRUE);
-
         pCurrentObject = VolumeCB->ObjectInfoListHead;
 
         if ( pCurrentObject)
@@ -2759,6 +2814,9 @@ AFSInvalidateVolume( IN AFSVolumeCB *VolumeCB,
             AFSInvalidateObject( &pCurrentObject,
                                  Reason);
 
+            AFSAcquireShared( VolumeCB->ObjectInfoTree.TreeLock,
+                              TRUE);
+
             if ( pCurrentObject )
             {
 
@@ -2772,9 +2830,6 @@ AFSInvalidateVolume( IN AFSVolumeCB *VolumeCB,
                               lCount));
             }
 
-            AFSAcquireShared( VolumeCB->ObjectInfoTree.TreeLock,
-                              TRUE);
-
             pCurrentObject = pNextObject;
         }
 
@@ -2868,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;
@@ -2890,7 +2947,7 @@ AFSVerifyEntry( IN GUID *AuthGroup,
 
         ntStatus = AFSEvaluateTargetByID( pObjectInfo,
                                           AuthGroup,
-                                          FALSE,
+                                         bFollowMountPoint ? FALSE : TRUE,
                                           &pDirEnumEntry);
 
         if( !NT_SUCCESS( ntStatus))
@@ -2913,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))
+       {
 
-                AFSDbgTrace(( 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);
         }
 
         //
@@ -2968,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);
                 }
 
@@ -2987,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);
                 }
 
@@ -2996,30 +3067,10 @@ AFSVerifyEntry( IN GUID *AuthGroup,
             case AFS_FILE_TYPE_FILE:
             {
                 FILE_OBJECT * pCCFileObject = NULL;
-                BOOLEAN bPurgeExtents = FALSE;
-
-                if ( pObjectInfo->DataVersion.QuadPart != pDirEnumEntry->DataVersion.QuadPart)
-                {
-
-                    AFSDbgTrace(( 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;
-
                     AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSVerifyEntry Clearing VERIFY_DATA flag %wZ FID %08lX-%08lX-%08lX-%08lX\n",
@@ -3044,6 +3095,21 @@ AFSVerifyEntry( IN GUID *AuthGroup,
                                   pObjectInfo->FileId.Vnode,
                                   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);
 
@@ -3072,8 +3138,7 @@ AFSVerifyEntry( IN GUID *AuthGroup,
                             ntStatus = stIoStatus.Status;
                         }
 
-                        if ( bPurgeExtents &&
-                             pObjectInfo->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
+                       if ( pObjectInfo->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
                         {
 
                             if ( !CcPurgeCacheSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
@@ -3095,7 +3160,7 @@ AFSVerifyEntry( IN GUID *AuthGroup,
                             }
                         }
                     }
-                    __except( EXCEPTION_EXECUTE_HANDLER)
+                   __except( EXCEPTION_EXECUTE_HANDLER)
                     {
                         ntStatus = GetExceptionCode();
 
@@ -3112,26 +3177,41 @@ AFSVerifyEntry( IN GUID *AuthGroup,
                         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()));
 
-                    AFSDbgTrace(( 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
@@ -3152,43 +3232,68 @@ AFSVerifyEntry( IN GUID *AuthGroup,
                                       pObjectInfo->FileId.Vnode,
                                       pObjectInfo->FileId.Unique,
                                       ntStatus));
-
-                        break;
                     }
-
-                    //
-                    // 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_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);
                     }
 
                     AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSVerifyEntry Releasing Fcb SectionObject lock %p EXCL %08lX\n",
-                                  &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+                                 "AFSVerifyEntry Releasing Fcb lock %p EXCL %08lX\n",
+                                 &pObjectInfo->Fcb->NPFcb->Resource,
                                   PsGetCurrentThread()));
 
-                    AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
-
                     AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->Resource);
                 }
                 else
@@ -3213,22 +3318,34 @@ AFSVerifyEntry( IN GUID *AuthGroup,
                                       pObjectInfo->FileId.Vnode,
                                       pObjectInfo->FileId.Unique,
                                       ntStatus));
-
-                        break;
                     }
-
-                    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));
+                   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;
             }
 
@@ -3277,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);
                 }
 
@@ -3337,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);
                 }
 
@@ -3933,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;
@@ -4058,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);
                 }
 
@@ -4078,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);
                 }
 
@@ -4114,173 +4264,166 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
                         AFSAcquireExcl( &pCurrentFcb->NPFcb->Resource,
                                         TRUE);
 
-                        bReleaseFcb = TRUE;
-                    }
-
-                    if( pCurrentFcb != NULL)
-                    {
-
-                        IO_STATUS_BLOCK stIoStatus;
-
-                        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_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))
-                                {
-
-                                    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 &&
-                                     pObjectInfo->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
-                                {
-
-                                    if ( !CcPurgeCacheSection( &pObjectInfo->Fcb->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( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
-                            }
-
-                            AFSDbgTrace(( 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.
@@ -4313,6 +4456,14 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
                         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);
 
                     //
@@ -4323,7 +4474,7 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
                     {
                         FILE_OBJECT *pCCFileObject;
 
-                        AFSDbgTrace(( 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,
@@ -4332,19 +4483,37 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
                         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));
                         }
 
-                        AFSDbgTrace(( 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,
@@ -4421,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);
                 }
 
@@ -4539,7 +4716,8 @@ AFSInitializeSpecialShareNameList()
         if( pNonPagedDirEntry == NULL)
         {
 
-            ExFreePool( pDirNode);
+           AFSLibExFreePoolWithTag( pDirNode,
+                                    AFS_DIR_ENTRY_TAG);
 
             lCount = AFSObjectInfoDecrement( pObjectInfoCB,
                                              AFS_OBJECT_REFERENCE_GLOBAL);
@@ -4658,7 +4836,8 @@ AFSInitializeSpecialShareNameList()
         if( pNonPagedDirEntry == NULL)
         {
 
-            ExFreePool( pDirNode);
+           AFSLibExFreePoolWithTag( pDirNode,
+                                    AFS_DIR_ENTRY_TAG);
 
             lCount = AFSObjectInfoDecrement( pObjectInfoCB,
                                              AFS_OBJECT_REFERENCE_GLOBAL);
@@ -4745,9 +4924,11 @@ try_exit:
 
                     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;
                 }
@@ -5048,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:
 
@@ -5501,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
         //
 
@@ -5782,7 +5969,8 @@ AFSRetrieveFileAttributes( IN AFSDirectoryCB *ParentDirectoryCB,
                                        &NewVolumeReferenceReason,
                                        &pNewParentDirEntry,
                                        &pDirectoryEntry,
-                                       NULL);
+                                       NULL,
+                                      &uniDFSTargetName);
 
         if ( pNewVolumeCB != NULL)
         {
@@ -5832,10 +6020,21 @@ AFSRetrieveFileAttributes( IN AFSDirectoryCB *ParentDirectoryCB,
 
         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);
         }
 
@@ -5962,6 +6161,13 @@ try_exit:
 
             AFSExFreePoolWithTag( pwchBuffer, 0);
         }
+
+       if ( uniDFSTargetName.Buffer != NULL)
+       {
+
+           AFSExFreePoolWithTag( uniDFSTargetName.Buffer,
+                                 AFS_REPARSE_NAME_TAG);
+       }
     }
 
     return ntStatus;
@@ -6019,6 +6225,9 @@ 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);
 
@@ -6027,6 +6236,8 @@ AFSAllocateObjectInfo( IN AFSObjectInfoCB *ParentObjectInfo,
                           "AFSAllocateObjectInfo Increment count on parent object %p Cnt %d\n",
                           ParentObjectInfo,
                           lCount));
+
+            AFSReleaseResource( ParentObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
         }
 
         //
@@ -6170,7 +6381,8 @@ AFSObjectInfoDecrement( IN AFSObjectInfoCB *ObjectInfo,
 
 AFSObjectInfoCB *
 AFSFindObjectInfo( IN AFSVolumeCB *VolumeCB,
-                   IN AFSFileID   *FileId)
+                   IN AFSFileID   *FileId,
+                   IN BOOLEAN      bUpdateLastUse)
 {
     DWORD            ntStatus = STATUS_SUCCESS;
     ULONGLONG        ullIndex;
@@ -6205,6 +6417,12 @@ AFSFindObjectInfo( IN AFSVolumeCB *VolumeCB,
                       "AFSFindObjectInfo Decrement count on object %p Cnt %d\n",
                       pObjectInfo,
                       lCount));
+
+        if ( bUpdateLastUse)
+        {
+
+            KeQueryTickCount( &pObjectInfo->LastAccessCount);
+        }
     }
 
     AFSReleaseResource( VolumeCB->ObjectInfoTree.TreeLock);
@@ -6292,12 +6510,17 @@ AFSDeleteObjectInfo( IN AFSObjectInfoCB **ppObjectInfo)
         {
 
             pParentObjectInfo = AFSFindObjectInfo( pVolume,
-                                                   &pObjectInfo->ParentFileId);
+                                                   &pObjectInfo->ParentFileId,
+                                                   FALSE);
+
             if( pParentObjectInfo != NULL)
             {
 
                 ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID);
 
+                AFSAcquireShared( pParentObjectInfo->VolumeCB->ObjectInfoTree.TreeLock,
+                                  TRUE);
+
                 lCount = AFSObjectInfoDecrement( pParentObjectInfo,
                                                  AFS_OBJECT_REFERENCE_CHILD);
 
@@ -6307,6 +6530,8 @@ AFSDeleteObjectInfo( IN AFSObjectInfoCB **ppObjectInfo)
                               pParentObjectInfo,
                               lCount));
 
+                AFSReleaseResource( pParentObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
+
                 AFSReleaseObjectInfo( &pParentObjectInfo);
             }
         }
@@ -6607,7 +6832,8 @@ AFSEvaluateRootEntry( IN AFSDirectoryCB *DirectoryCB,
                                        &VolumeReferenceReason,
                                        &pNewParentDirEntry,
                                        &pDirectoryEntry,
-                                       NULL);
+                                       NULL,
+                                      NULL);
 
         if ( pNewVolumeCB != NULL)
         {
@@ -6786,17 +7012,17 @@ AFSCleanupFcb( IN AFSFcb *Fcb,
 
                 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()));
 
-                AFSAcquireShared( &Fcb->NPFcb->Resource,
+               AFSAcquireExcl( &Fcb->NPFcb->Resource,
                                   TRUE);
 
                 if( Fcb->OpenReferenceCount > 0)
                 {
 
-                    AFSDbgTrace(( 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,
@@ -6850,7 +7076,7 @@ AFSCleanupFcb( IN AFSFcb *Fcb,
                             }
                         }
                     }
-                    __except( EXCEPTION_EXECUTE_HANDLER)
+                   __except( EXCEPTION_EXECUTE_HANDLER)
                     {
 
                         ntStatus = GetExceptionCode();
@@ -6867,7 +7093,7 @@ AFSCleanupFcb( IN AFSFcb *Fcb,
                         SetFlag( Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
                     }
 
-                    AFSDbgTrace(( 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,
@@ -6878,76 +7104,87 @@ AFSCleanupFcb( IN AFSFcb *Fcb,
 
                 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()));
 
                 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);
+               }
+           }
         }
 
         //
@@ -6962,7 +7199,25 @@ AFSCleanupFcb( IN AFSFcb *Fcb,
                                         (AFS_SERVER_PURGE_SLEEP * pControlDeviceExt->Specific.Control.FcbPurgeTimeCount.QuadPart))))
         {
 
-            AFSDbgTrace(( 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,
@@ -7017,7 +7272,7 @@ AFSCleanupFcb( IN AFSFcb *Fcb,
                         }
                     }
                 }
-                __except( EXCEPTION_EXECUTE_HANDLER)
+               __except( EXCEPTION_EXECUTE_HANDLER)
                 {
 
                     ntStatus = GetExceptionCode();
@@ -7032,7 +7287,7 @@ AFSCleanupFcb( IN AFSFcb *Fcb,
                                   ntStatus));
                 }
 
-                AFSDbgTrace(( 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,
@@ -7040,20 +7295,46 @@ AFSCleanupFcb( IN AFSFcb *Fcb,
 
                 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,9 +8089,11 @@ AFSCloseLibrary()
 
             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;
         }
@@ -7835,9 +8118,11 @@ AFSCloseLibrary()
 
             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;
         }
@@ -7869,9 +8154,11 @@ AFSCloseLibrary()
 
                 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;
             }
@@ -7993,6 +8280,9 @@ AFSGetObjectStatus( IN AFSGetStatusInfoCB *GetStatusInfo,
 
                 pObjectInfo = &pVolumeCB->ObjectInformation;
 
+                AFSAcquireShared( pVolumeCB->ObjectInfoTree.TreeLock,
+                                  TRUE);
+
                 lCount = AFSObjectInfoIncrement( pObjectInfo,
                                                  AFS_OBJECT_REFERENCE_STATUS);
 
@@ -8001,12 +8291,14 @@ AFSGetObjectStatus( IN AFSGetStatusInfoCB *GetStatusInfo,
                               "AFSGetObjectStatus Increment1 count on object %p Cnt %d\n",
                               pObjectInfo,
                               lCount));
+
+                AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
             }
             else
             {
 
-                AFSAcquireShared( pVolumeCB->ObjectInfoTree.TreeLock,
-                                  TRUE);
+                AFSAcquireExcl( pVolumeCB->ObjectInfoTree.TreeLock,
+                                TRUE);
 
                 ullIndex = AFSCreateLowIndex( &GetStatusInfo->FileID);
 
@@ -8029,6 +8321,8 @@ AFSGetObjectStatus( IN AFSGetStatusInfoCB *GetStatusInfo,
                                   "AFSGetObjectStatus Increment2 count on object %p Cnt %d\n",
                                   pObjectInfo,
                                   lCount));
+
+                    KeQueryTickCount( &pObjectInfo->LastAccessCount);
                 }
 
                 AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
@@ -8133,7 +8427,8 @@ AFSGetObjectStatus( IN AFSGetStatusInfoCB *GetStatusInfo,
                                            &NewVolumeReferenceReason,
                                            &pNewParentDirEntry,
                                            &pDirectoryEntry,
-                                           NULL);
+                                           NULL,
+                                          NULL);
 
             if ( pNewVolumeCB != NULL)
             {
@@ -8195,6 +8490,9 @@ AFSGetObjectStatus( IN AFSGetStatusInfoCB *GetStatusInfo,
 
             pObjectInfo = pDirectoryEntry->ObjectInformation;
 
+            AFSAcquireExcl( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock,
+                            TRUE);
+
             lCount = AFSObjectInfoIncrement( pObjectInfo,
                                              AFS_OBJECT_REFERENCE_STATUS);
 
@@ -8203,6 +8501,8 @@ AFSGetObjectStatus( IN AFSGetStatusInfoCB *GetStatusInfo,
                           "AFSGetObjectStatus Increment3 count on object %p Cnt %d\n",
                           pObjectInfo,
                           lCount));
+
+            AFSReleaseResource( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
         }
 
         //
@@ -8279,21 +8579,26 @@ try_exit:
             ASSERT( lCount >= 0);
         }
 
-        if( pObjectInfo != NULL)
+        if( pVolumeCB != NULL)
         {
 
-            lCount = AFSObjectInfoDecrement( pObjectInfo,
-                                             AFS_OBJECT_REFERENCE_STATUS);
+            if( pObjectInfo != NULL)
+            {
 
-            AFSDbgTrace(( 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);
@@ -8727,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)
         {
@@ -8763,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);
         }
     }
 
@@ -8931,47 +9246,56 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
 
     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;
             }
@@ -8979,26 +9303,33 @@ 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);
-
-                    bLocked = 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))
                     {
 
-                        AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                       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);
+
+                       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,
@@ -9007,11 +9338,7 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
                         AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
                                         TRUE);
 
-                        AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
-
-                        bLocked = FALSE;
-
-                        __try
+                       __try
                         {
 
                             if( ObjectInfo->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL &&
@@ -9030,14 +9357,11 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
                                               ObjectInfo->FileId.Unique));
 
                                 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)
+                       __except( EXCEPTION_EXECUTE_HANDLER)
                         {
 
                             ntStatus = GetExceptionCode();
@@ -9052,18 +9376,49 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
                                           ntStatus));
 
                             SetFlag( ObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
-                        }
 
-                        AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                           SetFlag( ObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
+                       }
+
+                       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()));
 
                         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,
@@ -9117,7 +9472,7 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
                                 else
                                 {
 
-                                    AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                                   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,
@@ -9126,10 +9481,6 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
                                     AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
                                                     TRUE);
 
-                                    AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
-
-                                    bLocked = FALSE;
-
                                     __try
                                     {
 
@@ -9148,15 +9499,17 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
                                                           ObjectInfo->FileId.Vnode,
                                                           ObjectInfo->FileId.Unique));
 
-                                            SetFlag( ObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
-                                        }
+                                           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)
+                                   __except( EXCEPTION_EXECUTE_HANDLER)
                                     {
 
                                         ntStatus = GetExceptionCode();
@@ -9171,15 +9524,21 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
                                                       ntStatus));
 
                                         SetFlag( ObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
+
+                                       SetFlag( ObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
                                     }
 
-                                    AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                                   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()));
 
                                     AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->SectionObjectResource);
+
+                                   AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
+
+                                   bLocked = FALSE;
                                 }
                             }
                             else
@@ -9189,7 +9548,7 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
 
                                 bExtentsLocked = FALSE;
 
-                                AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                               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,
@@ -9198,10 +9557,6 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
                                 AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
                                                 TRUE);
 
-                                AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
-
-                                bLocked = 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)
@@ -9235,28 +9590,46 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
 
                                                 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))
-                                                {
-
-                                                    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));
-
-                                                    bPurgeOnClose = TRUE;
-                                                }
-                                                else
-                                                {
-
-                                                    bCleanExtents = TRUE;
-                                                }
+                                               __try
+                                               {
+
+                                                   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));
+
+                                                       bPurgeOnClose = TRUE;
+                                                   }
+                                                   else
+                                                   {
+
+                                                       bCleanExtents = TRUE;
+                                                   }
+                                               }
+                                               __except( EXCEPTION_EXECUTE_HANDLER)
+                                               {
+
+                                                   ntStatus = GetExceptionCode();
+
+                                                   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].Length.QuadPart -= ulSize;
 
@@ -9294,27 +9667,44 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
 
                                                 if( !BooleanFlagOn( pEntry->Flags, AFS_EXTENT_DIRTY))
                                                 {
-                                                    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;
-                                                    }
+                                                   __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)
@@ -9334,27 +9724,44 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
                                                             ulFlushLength = liFlushLength.LowPart;
                                                         }
 
-                                                        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;
-                                                        }
+                                                       __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;
                                                     }
@@ -9368,27 +9775,44 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
                                         }
                                         else
                                         {
-                                            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;
-                                            }
+                                           __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));
+                                           }
                                         }
 
                                         if ( bPurgeOnClose)
@@ -9398,7 +9822,7 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
                                         }
                                     }
                                 }
-                                __except( EXCEPTION_EXECUTE_HANDLER)
+                               __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
                                 {
 
                                     ntStatus = GetExceptionCode();
@@ -9413,13 +9837,17 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
                                                   ntStatus));
                                 }
 
-                                AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                               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()));
 
                                 AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->SectionObjectResource);
+
+                               AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
+
+                               bLocked = FALSE;
                             }
                         }
 
@@ -9428,31 +9856,48 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
 
                             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);
 
@@ -9461,7 +9906,125 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
                       "AFSPerformObjectInvalidation Decrement count on object %p Cnt %d\n",
                       ObjectInfo,
                       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