Windows: AFSInvalidateObject can overwrite input param
[openafs.git] / src / WINNT / afsrdr / kernel / lib / AFSCommSupport.cpp
index 3d702e0..9afcdf9 100644 (file)
@@ -165,6 +165,9 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
 
                     pDirEnumResponse = (AFSDirEnumResp *)pBuffer;
 
+                    AFSAcquireExcl( ObjectInfoCB->Specific.Directory.DirectoryNodeHdr.TreeLock,
+                                    TRUE);
+
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSEnumerateDirectory Directory Complete FID %08lX-%08lX-%08lX-%08lX Snapshot-DV %08lX:%08lX Current-DV %08lX:%08lX Status %08lX\n",
@@ -195,6 +198,8 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
                                       ObjectInfoCB->FileId.Vnode,
                                       ObjectInfoCB->FileId.Unique);
                     }
+
+                    AFSReleaseResource( ObjectInfoCB->Specific.Directory.DirectoryNodeHdr.TreeLock);
                 }
                 else
                 {
@@ -298,26 +303,26 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
                         if( pDirNode->ObjectInformation->DataVersion.QuadPart != pCurrentDirEntry->DataVersion.QuadPart)
                         {
 
-                            AFSUpdateMetaData( pDirNode,
-                                               pCurrentDirEntry);
+                            LONG lCount;
+                            AFSObjectInfoCB *pObjectInfo = pDirNode->ObjectInformation;
 
-                            if( pDirNode->ObjectInformation->FileType == AFS_FILE_TYPE_DIRECTORY)
-                            {
+                            lCount = InterlockedIncrement( &pObjectInfo->ObjectReferenceCount);
 
-                                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                                              AFS_TRACE_LEVEL_VERBOSE,
-                                              "AFSEnumerateDirectory Setting VERIFY on entry %wZ for FID %08lX-%08lX-%08lX-%08lX\n",
-                                              &uniDirName,
-                                              pDirNode->ObjectInformation->FileId.Cell,
-                                              pDirNode->ObjectInformation->FileId.Volume,
-                                              pDirNode->ObjectInformation->FileId.Vnode,
-                                              pDirNode->ObjectInformation->FileId.Unique);
+                            AFSInvalidateObject( &pObjectInfo,
+                                                 AFS_INVALIDATE_DATA_VERSION);
 
-                                SetFlag( pDirNode->ObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
+                            if( pObjectInfo != NULL)
+                            {
 
-                                pDirNode->ObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+                                lCount = InterlockedDecrement( &pObjectInfo->ObjectReferenceCount);
                             }
                         }
+                        else
+                        {
+
+                            AFSUpdateMetaData( pDirNode,
+                                               pCurrentDirEntry);
+                        }
 
                         continue;
                     }
@@ -392,21 +397,26 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
                 AFSUpdateMetaData( pDirNode,
                                    pCurrentDirEntry);
 
-                if( ObjectInfoCB->FileType == AFS_FILE_TYPE_DIRECTORY)
+                if( pDirNode->ObjectInformation->FileType == AFS_FILE_TYPE_DIRECTORY)
                 {
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSEnumerateDirectory Setting VERIFY on entry %wZ for FID %08lX-%08lX-%08lX-%08lX\n",
                                   &uniDirName,
-                                  ObjectInfoCB->FileId.Cell,
-                                  ObjectInfoCB->FileId.Volume,
-                                  ObjectInfoCB->FileId.Vnode,
-                                  ObjectInfoCB->FileId.Unique);
+                                  pDirNode->ObjectInformation->FileId.Cell,
+                                  pDirNode->ObjectInformation->FileId.Volume,
+                                  pDirNode->ObjectInformation->FileId.Vnode,
+                                  pDirNode->ObjectInformation->FileId.Unique);
 
-                    SetFlag( ObjectInfoCB->Flags, AFS_OBJECT_FLAGS_VERIFY);
+                    AFSAcquireExcl( pDirNode->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
+                                    TRUE);
 
-                    ObjectInfoCB->DataVersion.QuadPart = (ULONGLONG)-1;
+                    SetFlag( pDirNode->ObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
+
+                    pDirNode->ObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+
+                    AFSReleaseResource( pDirNode->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
                 }
 
                 //
@@ -749,6 +759,7 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
     AFSObjectInfoCB *pObjectInfo = NULL;
     ULONGLONG ullIndex = 0;
     UNICODE_STRING uniGUID;
+    LONG lCount;
 
     __Enter
     {
@@ -850,6 +861,9 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
 
                     pDirEnumResponse = (AFSDirEnumResp *)pBuffer;
 
+                    AFSAcquireExcl( ObjectInfoCB->Specific.Directory.DirectoryNodeHdr.TreeLock,
+                                    TRUE);
+
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSVerifyDirectoryContent Directory Complete FID %08lX-%08lX-%08lX-%08lX Snapshot-DV %08lX:%08lX Current-DV %08lX:%08lX Status %08lX\n",
@@ -865,14 +879,12 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
 
                     ntStatus = STATUS_SUCCESS;
 
-                    ObjectInfoCB->DataVersion = pDirEnumResponse->SnapshotDataVersion;
-
                     if ( pDirEnumResponse->SnapshotDataVersion.QuadPart != pDirEnumResponse->CurrentDataVersion.QuadPart )
                     {
 
                         SetFlag( ObjectInfoCB->Flags, AFS_OBJECT_FLAGS_VERIFY);
 
-                        pDirNode->ObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+                        ObjectInfoCB->DataVersion.QuadPart = (ULONGLONG)-1;
 
                         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_VERBOSE,
@@ -882,6 +894,13 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
                                       ObjectInfoCB->FileId.Vnode,
                                       ObjectInfoCB->FileId.Unique);
                     }
+                    else
+                    {
+
+                        ObjectInfoCB->DataVersion = pDirEnumResponse->SnapshotDataVersion;
+                    }
+
+                    AFSReleaseResource( ObjectInfoCB->Specific.Directory.DirectoryNodeHdr.TreeLock);
                 }
                 else
                 {
@@ -957,140 +976,142 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
                                            pCurrentDirEntry->FileNameLength +
                                            pCurrentDirEntry->TargetNameLength);
 
-                if( pDirNode != NULL)
+                if( pDirNode &&
+                    AFSIsEqualFID( &pCurrentDirEntry->FileId,
+                                   &pDirNode->ObjectInformation->FileId))
                 {
 
                     //
-                    // Check that the FIDs are the same
+                    // Found matching directory entry by name and FileID
                     //
 
-                    if( AFSIsEqualFID( &pCurrentDirEntry->FileId,
-                                       &pDirNode->ObjectInformation->FileId))
-                    {
+                    AFSAcquireShared( ObjectInfoCB->VolumeCB->ObjectInfoTree.TreeLock,
+                                      TRUE);
 
-                        AFSAcquireShared( ObjectInfoCB->VolumeCB->ObjectInfoTree.TreeLock,
-                                          TRUE);
+                    ullIndex = AFSCreateLowIndex( &pCurrentDirEntry->FileId);
 
-                        ullIndex = AFSCreateLowIndex( &pCurrentDirEntry->FileId);
+                    ntStatus = AFSLocateHashEntry( ObjectInfoCB->VolumeCB->ObjectInfoTree.TreeHead,
+                                                   ullIndex,
+                                                   (AFSBTreeEntry **)&pObjectInfo);
 
-                        ntStatus = AFSLocateHashEntry( ObjectInfoCB->VolumeCB->ObjectInfoTree.TreeHead,
-                                                       ullIndex,
-                                                       (AFSBTreeEntry **)&pObjectInfo);
+                    AFSReleaseResource( ObjectInfoCB->VolumeCB->ObjectInfoTree.TreeLock);
 
-                        AFSReleaseResource( ObjectInfoCB->VolumeCB->ObjectInfoTree.TreeLock);
-
-                        if( NT_SUCCESS( ntStatus) &&
-                            pObjectInfo != NULL)
-                        {
+                    if( NT_SUCCESS( ntStatus) &&
+                        pObjectInfo != NULL)
+                    {
 
-                            //
-                            // Indicate this is a valid entry
-                            //
+                        //
+                        // Indicate this is a valid entry
+                        //
 
-                            SetFlag( pDirNode->Flags, AFS_DIR_ENTRY_VALID);
+                        SetFlag( pDirNode->Flags, AFS_DIR_ENTRY_VALID);
 
-                            if( pCurrentDirEntry->ShortNameLength > 0 &&
-                                pDirNode->NameInformation.ShortNameLength > 0)
-                            {
-                                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                                              AFS_TRACE_LEVEL_VERBOSE,
-                                              "AFSVerifyDirectoryContent Verified entry %wZ (%wZ) parent FID %08lX-%08lX-%08lX-%08lX old short name %S New short name %S\n",
-                                              &uniDirName,
-                                              &pDirNode->NameInformation.FileName,
-                                              ObjectInfoCB->FileId.Cell,
-                                              ObjectInfoCB->FileId.Volume,
-                                              ObjectInfoCB->FileId.Vnode,
-                                              ObjectInfoCB->FileId.Unique,
-                                              pDirNode->NameInformation.ShortName,
-                                              pCurrentDirEntry->ShortName);
-                            }
-                            else if( pCurrentDirEntry->ShortNameLength == 0 &&
-                                     pDirNode->NameInformation.ShortNameLength > 0)
-                            {
-                                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                                              AFS_TRACE_LEVEL_VERBOSE,
-                                              "AFSVerifyDirectoryContent Verified entry %wZ (%wZ) parent FID %08lX-%08lX-%08lX-%08lX old short name %S New short name NULL\n",
-                                              &uniDirName,
-                                              &pDirNode->NameInformation.FileName,
-                                              ObjectInfoCB->FileId.Cell,
-                                              ObjectInfoCB->FileId.Volume,
-                                              ObjectInfoCB->FileId.Vnode,
-                                              ObjectInfoCB->FileId.Unique,
-                                              pDirNode->NameInformation.ShortName);
-                            }
-                            else if( pCurrentDirEntry->ShortNameLength > 0 &&
-                                     pDirNode->NameInformation.ShortNameLength == 0)
-                            {
-                                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                                              AFS_TRACE_LEVEL_VERBOSE,
-                                              "AFSVerifyDirectoryContent Verified entry %wZ (%wZ) parent FID %08lX-%08lX-%08lX-%08lX old short name NULL New short name %S\n",
-                                              &uniDirName,
-                                              &pDirNode->NameInformation.FileName,
-                                              ObjectInfoCB->FileId.Cell,
-                                              ObjectInfoCB->FileId.Volume,
-                                              ObjectInfoCB->FileId.Vnode,
-                                              ObjectInfoCB->FileId.Unique,
-                                              pCurrentDirEntry->ShortName);
-                            }
-                            else
-                            {
-                                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                                              AFS_TRACE_LEVEL_VERBOSE,
-                                              "AFSVerifyDirectoryContent Verified entry %wZ (%wZ) parent FID %08lX-%08lX-%08lX-%08lX old short name NULL New short name NULL\n",
-                                              &uniDirName,
-                                              &pDirNode->NameInformation.FileName,
-                                              ObjectInfoCB->FileId.Cell,
-                                              ObjectInfoCB->FileId.Volume,
-                                              ObjectInfoCB->FileId.Vnode,
-                                              ObjectInfoCB->FileId.Unique);
-                            }
+                        if( pCurrentDirEntry->ShortNameLength > 0 &&
+                            pDirNode->NameInformation.ShortNameLength > 0)
+                        {
+                            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                          AFS_TRACE_LEVEL_VERBOSE,
+                                          "AFSVerifyDirectoryContent Verified entry %wZ (%wZ) parent FID %08lX-%08lX-%08lX-%08lX old short name %S New short name %S\n",
+                                          &uniDirName,
+                                          &pDirNode->NameInformation.FileName,
+                                          ObjectInfoCB->FileId.Cell,
+                                          ObjectInfoCB->FileId.Volume,
+                                          ObjectInfoCB->FileId.Vnode,
+                                          ObjectInfoCB->FileId.Unique,
+                                          pDirNode->NameInformation.ShortName,
+                                          pCurrentDirEntry->ShortName);
+                        }
+                        else if( pCurrentDirEntry->ShortNameLength == 0 &&
+                                 pDirNode->NameInformation.ShortNameLength > 0)
+                        {
 
-                            //
-                            // Update the metadata for the entry
-                            //
+                            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                          AFS_TRACE_LEVEL_VERBOSE,
+                                          "AFSVerifyDirectoryContent Verified entry %wZ (%wZ) parent FID %08lX-%08lX-%08lX-%08lX old short name %S New short name NULL\n",
+                                          &uniDirName,
+                                          &pDirNode->NameInformation.FileName,
+                                          ObjectInfoCB->FileId.Cell,
+                                          ObjectInfoCB->FileId.Volume,
+                                          ObjectInfoCB->FileId.Vnode,
+                                          ObjectInfoCB->FileId.Unique,
+                                          pDirNode->NameInformation.ShortName);
+                        }
+                        else if( pCurrentDirEntry->ShortNameLength > 0 &&
+                                 pDirNode->NameInformation.ShortNameLength == 0)
+                        {
+                            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                          AFS_TRACE_LEVEL_VERBOSE,
+                                          "AFSVerifyDirectoryContent Verified entry %wZ (%wZ) parent FID %08lX-%08lX-%08lX-%08lX old short name NULL New short name %S\n",
+                                          &uniDirName,
+                                          &pDirNode->NameInformation.FileName,
+                                          ObjectInfoCB->FileId.Cell,
+                                          ObjectInfoCB->FileId.Volume,
+                                          ObjectInfoCB->FileId.Vnode,
+                                          ObjectInfoCB->FileId.Unique,
+                                          pCurrentDirEntry->ShortName);
+                        }
+                        else
+                        {
+                            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                          AFS_TRACE_LEVEL_VERBOSE,
+                                          "AFSVerifyDirectoryContent Verified entry %wZ (%wZ) parent FID %08lX-%08lX-%08lX-%08lX old short name NULL New short name NULL\n",
+                                          &uniDirName,
+                                          &pDirNode->NameInformation.FileName,
+                                          ObjectInfoCB->FileId.Cell,
+                                          ObjectInfoCB->FileId.Volume,
+                                          ObjectInfoCB->FileId.Vnode,
+                                          ObjectInfoCB->FileId.Unique);
+                        }
 
-                            if( pObjectInfo->DataVersion.QuadPart != pCurrentDirEntry->DataVersion.QuadPart)
-                            {
+                        //
+                        // Update the metadata for the entry
+                        //
 
-                                AFSUpdateMetaData( pDirNode,
-                                                   pCurrentDirEntry);
+                        if( pObjectInfo->DataVersion.QuadPart != pCurrentDirEntry->DataVersion.QuadPart)
+                        {
 
-                                if( pObjectInfo->FileType == AFS_FILE_TYPE_DIRECTORY)
-                                {
+                            lCount = InterlockedIncrement( &pObjectInfo->ObjectReferenceCount);
 
-                                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                                                  AFS_TRACE_LEVEL_VERBOSE,
-                                                  "AFSVerifyDirectoryContent Setting VERIFY on entry %wZ for FID %08lX-%08lX-%08lX-%08lX\n",
-                                                  &uniDirName,
-                                                  pObjectInfo->FileId.Cell,
-                                                  pObjectInfo->FileId.Volume,
-                                                  pObjectInfo->FileId.Vnode,
-                                                  pObjectInfo->FileId.Unique);
+                            AFSInvalidateObject( &pObjectInfo,
+                                                 AFS_INVALIDATE_DATA_VERSION);
 
-                                    SetFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+                            if( pObjectInfo != NULL)
+                            {
 
-                                    pObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
-                                }
+                                lCount = InterlockedDecrement( &pObjectInfo->ObjectReferenceCount);
                             }
+                        }
+                        else
+                        {
 
-                            //
-                            // Next dir entry
-                            //
+                            AFSUpdateMetaData( pDirNode,
+                                               pCurrentDirEntry);
+                        }
 
-                            pCurrentDirEntry = (AFSDirEnumEntry *)((char *)pCurrentDirEntry + ulEntryLength);
+                        //
+                        // Next dir entry
+                        //
 
-                            if( ulResultLen >= ulEntryLength)
-                            {
-                                ulResultLen -= ulEntryLength;
-                            }
-                            else
-                            {
-                                ulResultLen = 0;
-                            }
+                        pCurrentDirEntry = (AFSDirEnumEntry *)((char *)pCurrentDirEntry + ulEntryLength);
 
-                            continue;
+                        if( ulResultLen >= ulEntryLength)
+                        {
+                            ulResultLen -= ulEntryLength;
+                        }
+                        else
+                        {
+                            ulResultLen = 0;
                         }
+
+                        continue;
                     }
+                }
+                else if ( pDirNode)
+                {
+
+                    //
+                    // File name matches but FileID does not.
+                    //
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
@@ -1179,21 +1200,26 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
                 AFSUpdateMetaData( pDirNode,
                                    pCurrentDirEntry);
 
-                if( ObjectInfoCB->FileType == AFS_FILE_TYPE_DIRECTORY)
+                if( pDirNode->ObjectInformation->FileType == AFS_FILE_TYPE_DIRECTORY)
                 {
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSVerifyDirectoryContent Setting VERIFY on entry %wZ for FID %08lX-%08lX-%08lX-%08lX\n",
                                   &uniDirName,
-                                  ObjectInfoCB->FileId.Cell,
-                                  ObjectInfoCB->FileId.Volume,
-                                  ObjectInfoCB->FileId.Vnode,
-                                  ObjectInfoCB->FileId.Unique);
+                                  pDirNode->ObjectInformation->FileId.Cell,
+                                  pDirNode->ObjectInformation->FileId.Volume,
+                                  pDirNode->ObjectInformation->FileId.Vnode,
+                                  pDirNode->ObjectInformation->FileId.Unique);
 
-                    SetFlag( ObjectInfoCB->Flags, AFS_OBJECT_FLAGS_VERIFY);
+                    AFSAcquireExcl( pDirNode->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
+                                    TRUE);
 
-                    ObjectInfoCB->DataVersion.QuadPart = (ULONGLONG)-1;
+                    SetFlag( pDirNode->ObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
+
+                    pDirNode->ObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+
+                    AFSReleaseResource( pDirNode->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
                 }
 
                 //
@@ -1690,27 +1716,6 @@ AFSNotifyFileCreate( IN GUID            *AuthGroup,
 
             ParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
         }
-        else
-        {
-
-            //
-            // Update the parent data version
-            //
-
-            ParentObjectInfo->DataVersion = pResultCB->ParentDataVersion;
-
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSNotifyFileCreate entry %wZ ParentFID %08lX-%08lX-%08lX-%08lX Version %08lX:%08lX\n",
-                          FileName,
-                          ParentObjectInfo->FileId.Cell,
-                          ParentObjectInfo->FileId.Volume,
-                          ParentObjectInfo->FileId.Vnode,
-                          ParentObjectInfo->FileId.Unique,
-                          ParentObjectInfo->DataVersion.QuadPart);
-        }
-
-        AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
@@ -1736,6 +1741,12 @@ AFSNotifyFileCreate( IN GUID            *AuthGroup,
         if( pDirNode == NULL)
         {
 
+            SetFlag( ParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+
+            ParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
+
+            AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
 
@@ -1772,6 +1783,28 @@ AFSNotifyFileCreate( IN GUID            *AuthGroup,
                           &pDirNode->NameInformation.FileName);
         }
 
+        if ( !BooleanFlagOn( ParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY))
+        {
+
+            //
+            // Update the parent data version
+            //
+
+            ParentObjectInfo->DataVersion = pResultCB->ParentDataVersion;
+
+            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSNotifyFileCreate entry %wZ ParentFID %08lX-%08lX-%08lX-%08lX Version %08lX:%08lX\n",
+                          FileName,
+                          ParentObjectInfo->FileId.Cell,
+                          ParentObjectInfo->FileId.Volume,
+                          ParentObjectInfo->FileId.Vnode,
+                          ParentObjectInfo->FileId.Unique,
+                          ParentObjectInfo->DataVersion.QuadPart);
+        }
+
+        AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+
         //
         // Return the directory node
         //
@@ -1869,7 +1902,16 @@ AFSUpdateFileInformation( IN AFSFileID *ParentFid,
         // Update the data version
         //
 
-        ObjectInfo->DataVersion = pUpdateResultCB->DirEnum.DataVersion;
+        AFSAcquireExcl( ObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+                        TRUE);
+
+        if ( !BooleanFlagOn( ObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY))
+        {
+
+            ObjectInfo->DataVersion = pUpdateResultCB->DirEnum.DataVersion;
+        }
+
+        AFSReleaseResource( ObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
 
 try_exit:
 
@@ -1923,16 +1965,24 @@ AFSNotifyDelete( IN AFSDirectoryCB *DirectoryCB,
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSNotifyDelete failed FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
-                          &DirectoryCB->ObjectInformation->FileId.Cell,
-                          &DirectoryCB->ObjectInformation->FileId.Volume,
-                          &DirectoryCB->ObjectInformation->FileId.Vnode,
-                          &DirectoryCB->ObjectInformation->FileId.Unique,
+                          "AFSNotifyDelete failed ParentFID %08lX-%08lX-%08lX-%08lX %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                          stDelete.ParentId.Cell,
+                          stDelete.ParentId.Volume,
+                          stDelete.ParentId.Vnode,
+                          stDelete.ParentId.Unique,
+                          &DirectoryCB->NameInformation.FileName,
+                          DirectoryCB->ObjectInformation->FileId.Cell,
+                          DirectoryCB->ObjectInformation->FileId.Volume,
+                          DirectoryCB->ObjectInformation->FileId.Vnode,
+                          DirectoryCB->ObjectInformation->FileId.Unique,
                           ntStatus);
 
             try_return( ntStatus);
         }
 
+        AFSAcquireExcl( DirectoryCB->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
+                        TRUE);
+
         if( CheckOnly)
         {
 
@@ -1945,7 +1995,7 @@ AFSNotifyDelete( IN AFSDirectoryCB *DirectoryCB,
 
                 SetFlag( DirectoryCB->ObjectInformation->ParentObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
 
-                DirectoryCB->ObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+                DirectoryCB->ObjectInformation->ParentObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
             }
         }
         else
@@ -1960,7 +2010,7 @@ AFSNotifyDelete( IN AFSDirectoryCB *DirectoryCB,
 
                 SetFlag( DirectoryCB->ObjectInformation->ParentObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
 
-                DirectoryCB->ObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+                DirectoryCB->ObjectInformation->ParentObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
             }
             else
             {
@@ -1977,9 +2027,10 @@ AFSNotifyDelete( IN AFSDirectoryCB *DirectoryCB,
 
                 DirectoryCB->ObjectInformation->ParentObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
             }
-
         }
 
+        AFSReleaseResource( DirectoryCB->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
+
 try_exit:
 
         NOTHING;
@@ -2070,6 +2121,9 @@ AFSNotifyRename( IN AFSObjectInfoCB *ObjectInfo,
         // Update the information from the returned data
         //
 
+        AFSAcquireExcl( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+                        TRUE);
+
         if ( ParentObjectInfo->DataVersion.QuadPart == pRenameResultCB->SourceParentDataVersion.QuadPart - 1)
         {
 
@@ -2083,17 +2137,21 @@ AFSNotifyRename( IN AFSObjectInfoCB *ObjectInfo,
             ParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
         }
 
-        if ( TargetParentObjectInfo->DataVersion.QuadPart == pRenameResultCB->TargetParentDataVersion.QuadPart - 1)
+        if ( ParentObjectInfo != TargetParentObjectInfo)
         {
 
-            TargetParentObjectInfo->DataVersion = pRenameResultCB->TargetParentDataVersion;
-        }
-        else
-        {
+            if ( TargetParentObjectInfo->DataVersion.QuadPart == pRenameResultCB->TargetParentDataVersion.QuadPart - 1)
+            {
+
+                TargetParentObjectInfo->DataVersion = pRenameResultCB->TargetParentDataVersion;
+            }
+            else
+            {
 
-            SetFlag( TargetParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+                SetFlag( TargetParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
 
-            TargetParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
+                TargetParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
+            }
         }
 
         //
@@ -2156,6 +2214,8 @@ AFSNotifyRename( IN AFSObjectInfoCB *ObjectInfo,
             DirectoryCB->Type.Data.ShortNameTreeEntry.HashIndex = 0;
         }
 
+        AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+
         if( UpdatedFID != NULL)
         {
             *UpdatedFID = pRenameResultCB->DirEnum.FileId;
@@ -2249,9 +2309,14 @@ AFSEvaluateTargetByID( IN AFSObjectInfoCB *ObjectInfo,
                 if( ObjectInfo->ParentObjectInformation != NULL)
                 {
 
+                    AFSAcquireExcl( ObjectInfo->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
+                                    TRUE);
+
                     SetFlag( ObjectInfo->ParentObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
 
                     ObjectInfo->ParentObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+
+                    AFSReleaseResource( ObjectInfo->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
                 }
             }
 
@@ -2262,13 +2327,21 @@ AFSEvaluateTargetByID( IN AFSObjectInfoCB *ObjectInfo,
         // Validate the parent data version
         //
 
-        if ( ObjectInfo->ParentObjectInformation != NULL &&
-             ObjectInfo->ParentObjectInformation->DataVersion.QuadPart != pEvalResultCB->ParentDataVersion.QuadPart)
+        if ( ObjectInfo->ParentObjectInformation != NULL)
         {
 
-            SetFlag( ObjectInfo->ParentObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
+            AFSAcquireExcl( ObjectInfo->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
+                            TRUE);
 
-            ObjectInfo->ParentObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+            if ( ObjectInfo->ParentObjectInformation->DataVersion.QuadPart != pEvalResultCB->ParentDataVersion.QuadPart)
+            {
+
+                SetFlag( ObjectInfo->ParentObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
+
+                ObjectInfo->ParentObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+            }
+
+            AFSReleaseResource( ObjectInfo->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
         }
 
         //
@@ -2372,9 +2445,14 @@ AFSEvaluateTargetByName( IN GUID *AuthGroup,
             if( ntStatus == STATUS_OBJECT_PATH_INVALID)
             {
 
+                AFSAcquireExcl( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+                                TRUE);
+
                 SetFlag( ParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
 
                 ParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
+
+                AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
             }
 
             try_return( ntStatus);
@@ -2384,8 +2462,10 @@ AFSEvaluateTargetByName( IN GUID *AuthGroup,
         // Validate the parent data version
         //
 
-        if ( ParentObjectInfo != NULL &&
-             ParentObjectInfo->DataVersion.QuadPart != pEvalResultCB->ParentDataVersion.QuadPart)
+        AFSAcquireExcl( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+                        TRUE);
+
+        if ( ParentObjectInfo->DataVersion.QuadPart != pEvalResultCB->ParentDataVersion.QuadPart)
         {
 
             SetFlag( ParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
@@ -2393,6 +2473,8 @@ AFSEvaluateTargetByName( IN GUID *AuthGroup,
             ParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
         }
 
+        AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+
         //
         // Pass back the dir enum entry
         //