Windows: AFSLocateNameEntry incorrect pCurrentObject
authorJeffrey Altman <jaltman@your-file-system.com>
Thu, 18 Apr 2013 00:17:09 +0000 (20:17 -0400)
committerJeffrey Altman <jaltman@your-file-system.com>
Fri, 26 Apr 2013 13:24:32 +0000 (06:24 -0700)
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 <buildbot@rampaginggeek.com>
Reviewed-by: Rod Widdowson <rdw@steadingsoftware.com>
Reviewed-by: Jeffrey Altman <jaltman@your-file-system.com>

src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp

index 18c8a3d..a0fb120 100644 (file)
@@ -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;
+                    }
                 }
             }