From cb9d0ff3da5c42667afb6f702523d1ffd2d72a5f Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Wed, 17 Apr 2013 20:17:09 -0400 Subject: [PATCH] Windows: AFSLocateNameEntry incorrect pCurrentObject pCurrentObject is supposed to be an alias for pDirEntry->ObjectInformation but it was not always being updated when pDirEntry was replaced. As a result several tests were being performed incorrectly and the wrong data was being logged. Change-Id: I69913788acd243d0bfdfee88e281a1eaa2adca6a Reviewed-on: http://gerrit.openafs.org/9809 Tested-by: BuildBot Reviewed-by: Rod Widdowson Reviewed-by: Jeffrey Altman --- src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp | 279 +++++++++++++------------ 1 file changed, 150 insertions(+), 129 deletions(-) diff --git a/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp b/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp index 18c8a3d..a0fb120 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp @@ -641,6 +641,8 @@ AFSLocateNameEntry( IN GUID *AuthGroup, pDirEntry = AFSBackupEntry( pNameArray); + pCurrentObject = pDirEntry->ObjectInformation; + // // Increment our reference on this dir entry // @@ -894,6 +896,8 @@ AFSLocateNameEntry( IN GUID *AuthGroup, pDirEntry = pCurrentVolume->DirectoryCB; + pCurrentObject = pDirEntry->ObjectInformation; + // // Reference the new dir entry // @@ -1068,6 +1072,8 @@ AFSLocateNameEntry( IN GUID *AuthGroup, pDirEntry = pCurrentVolume->DirectoryCB; + pCurrentObject = pDirEntry->ObjectInformation; + lCount = InterlockedIncrement( &pDirEntry->DirOpenReferenceCount); AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING, @@ -1432,6 +1438,8 @@ AFSLocateNameEntry( IN GUID *AuthGroup, try_return(ntStatus = STATUS_OBJECT_PATH_INVALID); } + pCurrentObject = pDirEntry->ObjectInformation; + lCount = InterlockedIncrement( &pDirEntry->DirOpenReferenceCount); AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING, @@ -1535,6 +1543,8 @@ AFSLocateNameEntry( IN GUID *AuthGroup, pDirEntry = NULL; + pCurrentObject = NULL; + uniSearchName = uniComponentName; while( pDirEntry == NULL) @@ -1749,13 +1759,13 @@ AFSLocateNameEntry( IN GUID *AuthGroup, AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING, AFS_TRACE_LEVEL_VERBOSE, - "AFSLocateNameEntry (FO: %p) Returning path not found for %wZ FID %08lX-%08lX-%08lX-%08lX\n", + "AFSLocateNameEntry (FO: %p) Returning path not found for %wZ in Parent FID %08lX-%08lX-%08lX-%08lX\n", FileObject, &uniSearchName, - pCurrentObject->FileId.Cell, - pCurrentObject->FileId.Volume, - pCurrentObject->FileId.Vnode, - pCurrentObject->FileId.Unique)); + pParentDirEntry->ObjectInformation->FileId.Cell, + pParentDirEntry->ObjectInformation->FileId.Volume, + pParentDirEntry->ObjectInformation->FileId.Vnode, + pParentDirEntry->ObjectInformation->FileId.Unique)); } else { @@ -1764,13 +1774,13 @@ AFSLocateNameEntry( IN GUID *AuthGroup, AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING, AFS_TRACE_LEVEL_VERBOSE, - "AFSLocateNameEntry (FO: %p) Returning name not found for %wZ FID %08lX-%08lX-%08lX-%08lX\n", + "AFSLocateNameEntry (FO: %p) Returning name not found for %wZ in Parent FID %08lX-%08lX-%08lX-%08lX\n", FileObject, &uniSearchName, - pCurrentObject->FileId.Cell, - pCurrentObject->FileId.Volume, - pCurrentObject->FileId.Vnode, - pCurrentObject->FileId.Unique)); + pParentDirEntry->ObjectInformation->FileId.Cell, + pParentDirEntry->ObjectInformation->FileId.Volume, + pParentDirEntry->ObjectInformation->FileId.Vnode, + pParentDirEntry->ObjectInformation->FileId.Unique)); // // Pass back the directory entries @@ -1808,6 +1818,8 @@ AFSLocateNameEntry( IN GUID *AuthGroup, // Is more than one link entry for this node then fail the lookup request // + pCurrentObject = pDirEntry->ObjectInformation; + if( !BooleanFlagOn( pDirEntry->Flags, AFS_DIR_ENTRY_CASE_INSENSTIVE_LIST_HEAD) || pDirEntry->CaseInsensitiveList.fLink != NULL) { @@ -1841,6 +1853,8 @@ AFSLocateNameEntry( IN GUID *AuthGroup, // revalidate the parent and search again. // + pCurrentObject = pDirEntry->ObjectInformation; + if( BooleanFlagOn( pDirEntry->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED) && BooleanFlagOn( pParentDirEntry->ObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY)) { @@ -1896,6 +1910,8 @@ AFSLocateNameEntry( IN GUID *AuthGroup, pDirEntry = NULL; + pCurrentObject = NULL; + continue; } @@ -1922,175 +1938,180 @@ AFSLocateNameEntry( IN GUID *AuthGroup, // If we have a dirEntry for this component, perform some basic validation on it // - if( pDirEntry != NULL && - BooleanFlagOn( pDirEntry->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED)) + if( pDirEntry != NULL) { pCurrentObject = pDirEntry->ObjectInformation; - AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING, - AFS_TRACE_LEVEL_ERROR, - "AFSLocateNameEntry (FO: %p) Deleted entry %wZ FID %08lX-%08lX-%08lX-%08lX\n", - FileObject, - &pDirEntry->NameInformation.FileName, - pCurrentObject->FileId.Cell, - pCurrentObject->FileId.Volume, - pCurrentObject->FileId.Vnode, - pCurrentObject->FileId.Unique)); - - // - // This entry was deleted through the invalidation call back so perform cleanup - // on the entry - // - - if( BooleanFlagOn( pCurrentObject->Flags, AFS_OBJECT_FLAGS_PARENT_FID)) + if (BooleanFlagOn( pDirEntry->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED)) { - pParentObjectInfo = AFSFindObjectInfo( pCurrentObject->VolumeCB, - &pCurrentObject->ParentFileId, - FALSE); - } + AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING, + AFS_TRACE_LEVEL_ERROR, + "AFSLocateNameEntry (FO: %p) Deleted entry %wZ FID %08lX-%08lX-%08lX-%08lX\n", + FileObject, + &pDirEntry->NameInformation.FileName, + pCurrentObject->FileId.Cell, + pCurrentObject->FileId.Volume, + pCurrentObject->FileId.Vnode, + pCurrentObject->FileId.Unique)); - ASSERT( pParentObjectInfo != NULL); + // + // This entry was deleted through the invalidation call back so perform cleanup + // on the entry + // - AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock, - TRUE); + if( BooleanFlagOn( pCurrentObject->Flags, AFS_OBJECT_FLAGS_PARENT_FID)) + { - AFSAcquireExcl( pCurrentObject->VolumeCB->ObjectInfoTree.TreeLock, - TRUE); + pParentObjectInfo = AFSFindObjectInfo( pCurrentObject->VolumeCB, + &pCurrentObject->ParentFileId, + FALSE); + } - lCount = InterlockedDecrement( &pDirEntry->DirOpenReferenceCount); + ASSERT( pParentObjectInfo != NULL); - AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING, - AFS_TRACE_LEVEL_VERBOSE, - "AFSLocateNameEntry Decrement count on %wZ DE %p Ccb %p Cnt %d\n", - &pDirEntry->NameInformation.FileName, - pDirEntry, - NULL, - lCount)); + AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock, + TRUE); - ASSERT( lCount >= 0); + AFSAcquireExcl( pCurrentObject->VolumeCB->ObjectInfoTree.TreeLock, + TRUE); - if( lCount == 0 && - pDirEntry->NameArrayReferenceCount <= 0) - { + lCount = InterlockedDecrement( &pDirEntry->DirOpenReferenceCount); - AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING|AFS_SUBSYSTEM_CLEANUP_PROCESSING, + AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING, AFS_TRACE_LEVEL_VERBOSE, - "AFSLocateNameEntry Deleting dir entry %p (%p) for %wZ\n", + "AFSLocateNameEntry Decrement count on %wZ DE %p Ccb %p Cnt %d\n", + &pDirEntry->NameInformation.FileName, pDirEntry, - pCurrentObject, - &pDirEntry->NameInformation.FileName)); + NULL, + lCount)); - // - // Remove and delete the directory entry from the parent list - // + ASSERT( lCount >= 0); - AFSDeleteDirEntry( pParentObjectInfo, - &pDirEntry); + if( lCount == 0 && + pDirEntry->NameArrayReferenceCount <= 0) + { - AFSAcquireShared( &pCurrentObject->NonPagedInfo->ObjectInfoLock, - TRUE); + AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING|AFS_SUBSYSTEM_CLEANUP_PROCESSING, + AFS_TRACE_LEVEL_VERBOSE, + "AFSLocateNameEntry Deleting dir entry %p (%p) for %wZ\n", + pDirEntry, + pCurrentObject, + &pDirEntry->NameInformation.FileName)); - if( pCurrentObject->ObjectReferenceCount <= 0) - { + // + // Remove and delete the directory entry from the parent list + // + + AFSDeleteDirEntry( pParentObjectInfo, + &pDirEntry); - if( BooleanFlagOn( pCurrentObject->Flags, AFS_OBJECT_INSERTED_HASH_TREE)) + AFSAcquireShared( &pCurrentObject->NonPagedInfo->ObjectInfoLock, + TRUE); + + if( pCurrentObject->ObjectReferenceCount <= 0) { - AFSDbgTrace(( AFS_SUBSYSTEM_CLEANUP_PROCESSING, - AFS_TRACE_LEVEL_VERBOSE, - "AFSLocateNameEntry Removing object %p from volume tree\n", - pCurrentObject)); + if( BooleanFlagOn( pCurrentObject->Flags, AFS_OBJECT_INSERTED_HASH_TREE)) + { + + AFSDbgTrace(( AFS_SUBSYSTEM_CLEANUP_PROCESSING, + AFS_TRACE_LEVEL_VERBOSE, + "AFSLocateNameEntry Removing object %p from volume tree\n", + pCurrentObject)); - AFSRemoveHashEntry( &pCurrentObject->VolumeCB->ObjectInfoTree.TreeHead, - &pCurrentObject->TreeEntry); + AFSRemoveHashEntry( &pCurrentObject->VolumeCB->ObjectInfoTree.TreeHead, + &pCurrentObject->TreeEntry); - ClearFlag( pCurrentObject->Flags, AFS_OBJECT_INSERTED_HASH_TREE); + ClearFlag( pCurrentObject->Flags, AFS_OBJECT_INSERTED_HASH_TREE); + } } + + AFSReleaseResource( &pCurrentObject->NonPagedInfo->ObjectInfoLock); } + else + { - AFSReleaseResource( &pCurrentObject->NonPagedInfo->ObjectInfoLock); - } - else - { + AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING, + AFS_TRACE_LEVEL_VERBOSE, + "AFSLocateNameEntry Setting DELETE flag in dir entry %p for %wZ\n", + pDirEntry, + &pDirEntry->NameInformation.FileName)); - AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING, - AFS_TRACE_LEVEL_VERBOSE, - "AFSLocateNameEntry Setting DELETE flag in dir entry %p for %wZ\n", - pDirEntry, - &pDirEntry->NameInformation.FileName)); + SetFlag( pDirEntry->Flags, AFS_DIR_ENTRY_DELETED); - SetFlag( pDirEntry->Flags, AFS_DIR_ENTRY_DELETED); + AFSRemoveNameEntry( pParentObjectInfo, + pDirEntry); + } - AFSRemoveNameEntry( pParentObjectInfo, - pDirEntry); - } + AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock); - AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock); + AFSReleaseResource( pCurrentObject->VolumeCB->ObjectInfoTree.TreeLock); - AFSReleaseResource( pCurrentObject->VolumeCB->ObjectInfoTree.TreeLock); + // + // We deleted the dir entry so check if there is any remaining portion + // of the name to process. + // - AFSReleaseObjectInfo( &pParentObjectInfo); + if( uniRemainingPath.Length > 0) + { - // - // We deleted the dir entry so check if there is any remaining portion - // of the name to process. - // + ntStatus = STATUS_OBJECT_PATH_NOT_FOUND; - if( uniRemainingPath.Length > 0) - { + AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING, + AFS_TRACE_LEVEL_VERBOSE, + "AFSLocateNameEntry (FO: %p) Returning path not found(2) for %wZ in Parent FID %08lX-%08lX-%08lX-%08lX\n", + FileObject, + &uniComponentName, + pParentObjectInfo->FileId.Cell, + pParentObjectInfo->FileId.Volume, + pParentObjectInfo->FileId.Vnode, + pParentObjectInfo->FileId.Unique)); - ntStatus = STATUS_OBJECT_PATH_NOT_FOUND; + AFSReleaseObjectInfo( &pParentObjectInfo); + } + else + { - AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING, - AFS_TRACE_LEVEL_VERBOSE, - "AFSLocateNameEntry (FO: %p) Returning path not found(2) for %wZ FID %08lX-%08lX-%08lX-%08lX\n", - FileObject, - &uniComponentName, - pCurrentObject->FileId.Cell, - pCurrentObject->FileId.Volume, - pCurrentObject->FileId.Vnode, - pCurrentObject->FileId.Unique)); - } - else - { + ntStatus = STATUS_OBJECT_NAME_NOT_FOUND; - ntStatus = STATUS_OBJECT_NAME_NOT_FOUND; + AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING, + AFS_TRACE_LEVEL_VERBOSE, + "AFSLocateNameEntry (FO: %p) Returning name not found(2) for %wZ in Parent FID %08lX-%08lX-%08lX-%08lX\n", + FileObject, + &uniComponentName, + pParentObjectInfo->FileId.Cell, + pParentObjectInfo->FileId.Volume, + pParentObjectInfo->FileId.Vnode, + pParentObjectInfo->FileId.Unique)); - AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING, - AFS_TRACE_LEVEL_VERBOSE, - "AFSLocateNameEntry (FO: %p) Returning name not found(2) for %wZ FID %08lX-%08lX-%08lX-%08lX\n", - FileObject, - &uniComponentName, - pCurrentObject->FileId.Cell, - pCurrentObject->FileId.Volume, - pCurrentObject->FileId.Vnode, - pCurrentObject->FileId.Unique)); + AFSReleaseObjectInfo( &pParentObjectInfo); - // - // Pass back the directory entries - // + // + // Pass back the directory entries + // - *OutParentDirectoryCB = pParentDirEntry; + *OutParentDirectoryCB = pParentDirEntry; - pParentDirEntry = NULL; + pParentDirEntry = NULL; - *OutDirectoryCB = NULL; + *OutDirectoryCB = NULL; - *OutVolumeCB = pCurrentVolume; + *OutVolumeCB = pCurrentVolume; - *OutVolumeReferenceReason = VolumeReferenceReason; + *OutVolumeReferenceReason = VolumeReferenceReason; - bReleaseCurrentVolume = FALSE; + bReleaseCurrentVolume = FALSE; - if( ComponentName != NULL) - { + if( ComponentName != NULL) + { - *ComponentName = uniComponentName; - } + *ComponentName = uniComponentName; + } - *RootPathName = uniFullPathName; + *RootPathName = uniFullPathName; + } } } -- 1.9.4