Windows: Replace ParentObjectInformation pointer
authorJeffrey Altman <jaltman@your-file-system.com>
Fri, 1 Feb 2013 18:40:22 +0000 (13:40 -0500)
committerJeffrey Altman <jaltman@your-file-system.com>
Sat, 2 Feb 2013 17:24:09 +0000 (09:24 -0800)
Although rare there have been crashes which were the result of
the ObjectInformationCB being freed while another ObjectInformationCB
is pointing to it via the ParentObjectInformation pointer.

This patchset removes the pointer and replaces it with the ParentFileId
which is used to lookup the Parent ObjectInformationCB via the VolumeCB
BTree of all volume objects. The reference counting rules remain the
same.

Change-Id: Iaf66587be2619c8c2f06cd586ef8d423b76d1e79
Reviewed-on: http://gerrit.openafs.org/8993
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Jeffrey Altman <jaltman@your-file-system.com>
Tested-by: Jeffrey Altman <jaltman@your-file-system.com>

14 files changed:
src/WINNT/afsrdr/kernel/lib/AFSBTreeSupport.cpp
src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp
src/WINNT/afsrdr/kernel/lib/AFSClose.cpp
src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp
src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp
src/WINNT/afsrdr/kernel/lib/AFSFcbSupport.cpp
src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp
src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp
src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp
src/WINNT/afsrdr/kernel/lib/AFSRead.cpp
src/WINNT/afsrdr/kernel/lib/AFSWrite.cpp
src/WINNT/afsrdr/kernel/lib/Include/AFSCommon.h
src/WINNT/afsrdr/kernel/lib/Include/AFSDefines.h
src/WINNT/afsrdr/kernel/lib/Include/AFSStructs.h

index d818038..45afde0 100644 (file)
@@ -1252,7 +1252,7 @@ AFSLocateHashEntry( IN AFSBTreeEntry *TopNode,
                     IN OUT AFSBTreeEntry **TreeEntry)
 {
 
-    NTSTATUS         ntStatus = STATUS_SUCCESS;
+    NTSTATUS         ntStatus = STATUS_NOT_FOUND;
     AFSBTreeEntry   *pCurrentEntry = NULL;
 
     pCurrentEntry = TopNode;
@@ -1279,7 +1279,7 @@ AFSLocateHashEntry( IN AFSBTreeEntry *TopNode,
 
             *TreeEntry = TopNode;
 
-            try_return( ntStatus);
+            try_return( ntStatus = STATUS_SUCCESS);
         }
 
         //
@@ -1350,6 +1350,8 @@ AFSLocateHashEntry( IN AFSBTreeEntry *TopNode,
 
                 *TreeEntry = pCurrentEntry;
 
+                ntStatus = STATUS_SUCCESS;
+
                 break;
             }
         }
index a6c1ec5..ff2e228 100644 (file)
@@ -106,6 +106,13 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
 
         pObjectInfo = pFcb->ObjectInformation;
 
+        if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+        {
+
+            pParentObjectInfo = AFSFindObjectInfo( pObjectInfo->VolumeCB,
+                                                   &pObjectInfo->ParentFileId);
+        }
+
         pRootFcb = pObjectInfo->VolumeCB->RootFcb;
 
         RtlZeroMemory( &stFileCleanup,
@@ -191,16 +198,16 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
                 // Decrement the open child handle count
                 //
 
-                if( pObjectInfo->ParentObjectInformation != NULL &&
-                    pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount > 0)
+                if( pParentObjectInfo != NULL &&
+                    pParentObjectInfo->Specific.Directory.ChildOpenHandleCount > 0)
                 {
 
-                    lCount = InterlockedDecrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
+                    lCount = InterlockedDecrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSCleanup (IOCtl) Decrement child open handle count on Parent object %p Cnt %d\n",
-                                  pObjectInfo->ParentObjectInformation,
+                                  pParentObjectInfo,
                                   lCount);
                 }
 
@@ -368,10 +375,10 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
 
                 ASSERT( pFcb->OpenHandleCount != 0);
 
-                if( pFcb->ObjectInformation->ParentObjectInformation != NULL)
+                if( pParentObjectInfo != NULL)
                 {
 
-                    stFileCleanup.ParentId = pFcb->ObjectInformation->ParentObjectInformation->FileId;
+                    stFileCleanup.ParentId = pParentObjectInfo->FileId;
                 }
 
                 stFileCleanup.LastAccessTime = pObjectInfo->LastAccessTime;
@@ -522,66 +529,80 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
 
                         ClearFlag( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
 
-                        pParentObjectInfo = pObjectInfo->ParentObjectInformation;
-
                         ASSERT( pParentObjectInfo != NULL);
 
-                        AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
-                                        TRUE);
-
-                        if ( pParentObjectInfo->DataVersion.QuadPart != pResultCB->ParentDataVersion.QuadPart - 1)
+                        if ( pParentObjectInfo != NULL)
                         {
 
-                            SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+                            AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+                                            TRUE);
 
-                            pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
-                        }
-                        else
-                        {
+                            if ( pParentObjectInfo->DataVersion.QuadPart != pResultCB->ParentDataVersion.QuadPart - 1)
+                            {
 
-                            pParentObjectInfo->DataVersion.QuadPart = pResultCB->ParentDataVersion.QuadPart;
-                        }
+                                SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
 
-                        //
-                        // Now that the service has the entry has deleted we need to remove it from the parent
-                        // tree so another lookup on the node will fail
-                        //
+                                pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
+                            }
+                            else
+                            {
 
-                        if( !BooleanFlagOn( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_NOT_IN_PARENT_TREE))
-                        {
+                                pParentObjectInfo->DataVersion.QuadPart = pResultCB->ParentDataVersion.QuadPart;
+                            }
 
-                            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                                          AFS_TRACE_LEVEL_VERBOSE,
-                                          "AFSCleanup DE %p for %wZ removing entry\n",
-                                          pCcb->DirectoryCB,
-                                          &pCcb->DirectoryCB->NameInformation.FileName);
+                            //
+                            // Now that the service has the entry has deleted we need to remove it from the parent
+                            // tree so another lookup on the node will fail
+                            //
+
+                            if( !BooleanFlagOn( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_NOT_IN_PARENT_TREE))
+                            {
 
-                            AFSRemoveNameEntry( pParentObjectInfo,
-                                                pCcb->DirectoryCB);
+                                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                              AFS_TRACE_LEVEL_VERBOSE,
+                                              "AFSCleanup DE %p for %wZ removing entry\n",
+                                              pCcb->DirectoryCB,
+                                              &pCcb->DirectoryCB->NameInformation.FileName);
+
+                                AFSRemoveNameEntry( pParentObjectInfo,
+                                                    pCcb->DirectoryCB);
+                            }
+                            else
+                            {
+
+                                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                              AFS_TRACE_LEVEL_VERBOSE,
+                                              "AFSCleanup DE %p for %wZ NOT removing entry due to flag set\n",
+                                              pCcb->DirectoryCB,
+                                              &pCcb->DirectoryCB->NameInformation.FileName);
+                            }
+
+                            AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+
+                            AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
+                                                            pCcb,
+                                                            (ULONG)FILE_NOTIFY_CHANGE_FILE_NAME,
+                                                            (ULONG)FILE_ACTION_REMOVED);
                         }
                         else
                         {
+                            if( !BooleanFlagOn( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_NOT_IN_PARENT_TREE))
+                            {
 
-                            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                                          AFS_TRACE_LEVEL_VERBOSE,
-                                          "AFSCleanup DE %p for %wZ NOT removing entry due to flag set\n",
-                                          pCcb->DirectoryCB,
-                                          &pCcb->DirectoryCB->NameInformation.FileName);
+                                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                              AFS_TRACE_LEVEL_VERBOSE,
+                                              "AFSCleanup DE %p for %wZ NOT removing entry due to pParentObjectInfo == NULL\n",
+                                              pCcb->DirectoryCB,
+                                              &pCcb->DirectoryCB->NameInformation.FileName);
+                            }
                         }
-
-                        AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
-
-                        AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
-                                                        pCcb,
-                                                        (ULONG)FILE_NOTIFY_CHANGE_FILE_NAME,
-                                                        (ULONG)FILE_ACTION_REMOVED);
-
                     }
                 }
                 else
                 {
 
-                    if( BooleanFlagOn( pFcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED))
+                    if( BooleanFlagOn( pFcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED) &&
+                        pParentObjectInfo != NULL)
                     {
 
                         ULONG ulNotifyFilter = 0;
@@ -590,7 +611,7 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
 
                         ulNotifyFilter |= (FILE_NOTIFY_CHANGE_ATTRIBUTES);
 
-                        AFSFsRtlNotifyFullReportChange( pObjectInfo->ParentObjectInformation,
+                        AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
                                                         pCcb,
                                                         (ULONG)ulNotifyFilter,
                                                         (ULONG)FILE_ACTION_MODIFIED);
@@ -688,8 +709,6 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
                     if ( NT_SUCCESS( ntStatus))
                     {
 
-                        pParentObjectInfo = pObjectInfo->ParentObjectInformation;
-
                         if ( pParentObjectInfo != NULL)
                         {
 
@@ -715,8 +734,6 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
                 // Decrement the open child handle count
                 //
 
-                pParentObjectInfo = pObjectInfo->ParentObjectInformation;
-
                 if( pParentObjectInfo != NULL)
                 {
 
@@ -811,10 +828,10 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
 
                 ASSERT( pFcb->OpenHandleCount != 0);
 
-                if( pFcb->ObjectInformation->ParentObjectInformation != NULL)
+                if( pParentObjectInfo != NULL)
                 {
 
-                    stFileCleanup.ParentId = pFcb->ObjectInformation->ParentObjectInformation->FileId;
+                    stFileCleanup.ParentId = pParentObjectInfo->FileId;
                 }
 
                 stFileCleanup.LastAccessTime = pObjectInfo->LastAccessTime;
@@ -914,54 +931,67 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
 
                         ClearFlag( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
 
-                        pParentObjectInfo = pObjectInfo->ParentObjectInformation;
-
                         ASSERT( pParentObjectInfo != NULL);
 
-                        AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
-                                        TRUE);
-
-                        if ( pParentObjectInfo->DataVersion.QuadPart != pResultCB->ParentDataVersion.QuadPart - 1)
+                        if ( pParentObjectInfo != NULL)
                         {
 
-                            SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+                            AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+                                            TRUE);
 
-                            pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
-                        }
-                        else
-                        {
+                            if ( pParentObjectInfo->DataVersion.QuadPart != pResultCB->ParentDataVersion.QuadPart - 1)
+                            {
 
-                            pParentObjectInfo->DataVersion.QuadPart = pResultCB->ParentDataVersion.QuadPart;
-                        }
+                                SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
 
-                        //
-                        // Now that the service has the entry has deleted we need to remove it from the parent
-                        // tree so another lookup on the node will fail
-                        //
+                                pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
+                            }
+                            else
+                            {
 
-                        if( !BooleanFlagOn( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_NOT_IN_PARENT_TREE))
-                        {
+                                pParentObjectInfo->DataVersion.QuadPart = pResultCB->ParentDataVersion.QuadPart;
+                            }
 
-                            AFSRemoveNameEntry( pParentObjectInfo,
-                                                pCcb->DirectoryCB);
+                            //
+                            // Now that the service has the entry has deleted we need to remove it from the parent
+                            // tree so another lookup on the node will fail
+                            //
+
+                            if( !BooleanFlagOn( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_NOT_IN_PARENT_TREE))
+                            {
+
+                                AFSRemoveNameEntry( pParentObjectInfo,
+                                                    pCcb->DirectoryCB);
+                            }
+                            else
+                            {
+
+                                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                              AFS_TRACE_LEVEL_VERBOSE,
+                                              "AFSCleanup DE %p for %wZ NOT removing entry due to flag set\n",
+                                              pCcb->DirectoryCB,
+                                              &pCcb->DirectoryCB->NameInformation.FileName);
+                            }
+
+                            AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+
+                            AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
+                                                            pCcb,
+                                                            (ULONG)FILE_NOTIFY_CHANGE_FILE_NAME,
+                                                            (ULONG)FILE_ACTION_REMOVED);
                         }
                         else
                         {
+                            if( !BooleanFlagOn( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_NOT_IN_PARENT_TREE))
+                            {
 
-                            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                                          AFS_TRACE_LEVEL_VERBOSE,
-                                          "AFSCleanup DE %p for %wZ NOT removing entry due to flag set\n",
-                                          pCcb->DirectoryCB,
-                                          &pCcb->DirectoryCB->NameInformation.FileName);
+                                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                              AFS_TRACE_LEVEL_VERBOSE,
+                                              "AFSCleanup DE %p for %wZ NOT removing entry due to pParentObjectInfo == NULL\n",
+                                              pCcb->DirectoryCB,
+                                              &pCcb->DirectoryCB->NameInformation.FileName);
+                            }
                         }
-
-                        AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
-
-                        AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
-                                                        pCcb,
-                                                        (ULONG)FILE_NOTIFY_CHANGE_FILE_NAME,
-                                                        (ULONG)FILE_ACTION_REMOVED);
-
                     }
                 }
 
@@ -973,25 +1003,20 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
                 else
                 {
 
-                    if( BooleanFlagOn( pFcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED))
+                    if( BooleanFlagOn( pFcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED) &&
+                        pParentObjectInfo != NULL)
                     {
 
                         ULONG ulNotifyFilter = 0;
 
                         ClearFlag( pFcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED);
 
-                        pParentObjectInfo = pObjectInfo->ParentObjectInformation;
-
-                        if(  pParentObjectInfo != NULL)
-                        {
-
-                            ulNotifyFilter |= (FILE_NOTIFY_CHANGE_ATTRIBUTES);
+                        ulNotifyFilter |= (FILE_NOTIFY_CHANGE_ATTRIBUTES);
 
-                            AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
-                                                            pCcb,
-                                                            (ULONG)ulNotifyFilter,
-                                                            (ULONG)FILE_ACTION_MODIFIED);
-                        }
+                        AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
+                                                        pCcb,
+                                                        (ULONG)ulNotifyFilter,
+                                                        (ULONG)FILE_ACTION_MODIFIED);
                     }
 
                     //
@@ -1013,8 +1038,6 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
                     if ( NT_SUCCESS( ntStatus))
                     {
 
-                        pParentObjectInfo = pObjectInfo->ParentObjectInformation;
-
                         if ( pParentObjectInfo != NULL)
                         {
 
@@ -1067,8 +1090,6 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
                 // Decrement the open child handle count
                 //
 
-                pParentObjectInfo = pObjectInfo->ParentObjectInformation;
-
                 if( pParentObjectInfo != NULL)
                 {
 
@@ -1121,10 +1142,10 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
 
                 ASSERT( pFcb->OpenHandleCount != 0);
 
-                if( pFcb->ObjectInformation->ParentObjectInformation != NULL)
+                if( pParentObjectInfo != NULL)
                 {
 
-                    stFileCleanup.ParentId = pFcb->ObjectInformation->ParentObjectInformation->FileId;
+                    stFileCleanup.ParentId = pParentObjectInfo->FileId;
                 }
 
                 stFileCleanup.LastAccessTime = pObjectInfo->LastAccessTime;
@@ -1224,53 +1245,67 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
 
                         ClearFlag( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
 
-                        pParentObjectInfo = pObjectInfo->ParentObjectInformation;
-
                         ASSERT( pParentObjectInfo != NULL);
 
-                        AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
-                                        TRUE);
-
-                        if ( pParentObjectInfo->DataVersion.QuadPart != pResultCB->ParentDataVersion.QuadPart - 1)
+                        if ( pParentObjectInfo != NULL)
                         {
 
-                            SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+                            AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+                                            TRUE);
 
-                            pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
-                        }
-                        else
-                        {
-                            pParentObjectInfo->DataVersion.QuadPart = pResultCB->ParentDataVersion.QuadPart;
-                        }
+                            if ( pParentObjectInfo->DataVersion.QuadPart != pResultCB->ParentDataVersion.QuadPart - 1)
+                            {
 
-                        //
-                        // Now that the service has the entry has deleted we need to remove it from the parent
-                        // tree so another lookup on the node will fail
-                        //
+                                SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
 
-                        if( !BooleanFlagOn( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_NOT_IN_PARENT_TREE))
-                        {
+                                pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
+                            }
+                            else
+                            {
+                                pParentObjectInfo->DataVersion.QuadPart = pResultCB->ParentDataVersion.QuadPart;
+                            }
+
+                            //
+                            // Now that the service has the entry has deleted we need to remove it from the parent
+                            // tree so another lookup on the node will fail
+                            //
+
+                            if( !BooleanFlagOn( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_NOT_IN_PARENT_TREE))
+                            {
+
+                                AFSRemoveNameEntry( pParentObjectInfo,
+                                                    pCcb->DirectoryCB);
+                            }
+                            else
+                            {
+
+                                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                              AFS_TRACE_LEVEL_VERBOSE,
+                                              "AFSCleanup DE %p for %wZ NOT removing entry due to flag set\n",
+                                              pCcb->DirectoryCB,
+                                              &pCcb->DirectoryCB->NameInformation.FileName);
+                            }
+
+                            AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
 
-                            AFSRemoveNameEntry( pParentObjectInfo,
-                                                pCcb->DirectoryCB);
+                            AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
+                                                            pCcb,
+                                                            (ULONG)FILE_NOTIFY_CHANGE_FILE_NAME,
+                                                            (ULONG)FILE_ACTION_REMOVED);
                         }
                         else
                         {
 
-                            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                                          AFS_TRACE_LEVEL_VERBOSE,
-                                          "AFSCleanup DE %p for %wZ NOT removing entry due to flag set\n",
-                                          pCcb->DirectoryCB,
-                                          &pCcb->DirectoryCB->NameInformation.FileName);
-                        }
-
-                        AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
-
-                        AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
-                                                        pCcb,
-                                                        (ULONG)FILE_NOTIFY_CHANGE_FILE_NAME,
-                                                        (ULONG)FILE_ACTION_REMOVED);
+                            if( !BooleanFlagOn( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_NOT_IN_PARENT_TREE))
+                            {
 
+                                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                              AFS_TRACE_LEVEL_VERBOSE,
+                                              "AFSCleanup DE %p for %wZ NOT removing entry due to pParentObjectInfo == NULL\n",
+                                              pCcb->DirectoryCB,
+                                              &pCcb->DirectoryCB->NameInformation.FileName);
+                            }
+                        }
                     }
                 }
 
@@ -1282,25 +1317,20 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
                 else
                 {
 
-                    if( BooleanFlagOn( pFcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED))
+                    if( BooleanFlagOn( pFcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED) &&
+                        pParentObjectInfo != NULL)
                     {
 
                         ULONG ulNotifyFilter = 0;
 
                         ClearFlag( pFcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED);
 
-                        pParentObjectInfo = pObjectInfo->ParentObjectInformation;
-
-                        if(  pParentObjectInfo != NULL)
-                        {
-
-                            ulNotifyFilter |= (FILE_NOTIFY_CHANGE_ATTRIBUTES);
+                        ulNotifyFilter |= (FILE_NOTIFY_CHANGE_ATTRIBUTES);
 
-                            AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
-                                                            pCcb,
-                                                            (ULONG)ulNotifyFilter,
-                                                            (ULONG)FILE_ACTION_MODIFIED);
-                        }
+                        AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
+                                                        pCcb,
+                                                        (ULONG)ulNotifyFilter,
+                                                        (ULONG)FILE_ACTION_MODIFIED);
                     }
 
                     //
@@ -1322,8 +1352,6 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
                     if ( NT_SUCCESS( ntStatus))
                     {
 
-                        pParentObjectInfo = pObjectInfo->ParentObjectInformation;
-
                         if ( pParentObjectInfo != NULL)
                         {
 
@@ -1368,8 +1396,6 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
                 // Decrement the open child handle count
                 //
 
-                pParentObjectInfo = pObjectInfo->ParentObjectInformation;
-
                 if( pParentObjectInfo != NULL)
                 {
 
@@ -1415,8 +1441,6 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
                 // Decrement the open child handle count
                 //
 
-                pParentObjectInfo = pObjectInfo->ParentObjectInformation;
-
                 if( pParentObjectInfo != NULL &&
                     pParentObjectInfo->Specific.Directory.ChildOpenHandleCount > 0)
                 {
@@ -1456,6 +1480,12 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
 
 try_exit:
 
+        if ( pParentObjectInfo != NULL)
+        {
+
+            AFSReleaseObjectInfo( &pParentObjectInfo);
+        }
+
         if( pResultCB != NULL)
         {
 
index 23e4242..7d90225 100644 (file)
@@ -61,6 +61,7 @@ AFSClose( IN PDEVICE_OBJECT LibDeviceObject,
     AFSDeviceExt *pDeviceExt = NULL;
     AFSCcb *pCcb = NULL;
     AFSObjectInfoCB *pObjectInfo = NULL;
+    AFSObjectInfoCB *pParentObjectInfo = NULL;
     AFSDirectoryCB *pDirCB = NULL;
     LONG lCount;
 
@@ -128,7 +129,7 @@ AFSClose( IN PDEVICE_OBJECT LibDeviceObject,
                 RtlZeroMemory( &stParentFileId,
                                sizeof( AFSFileID));
 
-                stParentFileId = pObjectInfo->ParentObjectInformation->FileId;
+                stParentFileId = pObjectInfo->ParentFileId;
 
                 //
                 // Issue the close request to the service
@@ -155,17 +156,24 @@ AFSClose( IN PDEVICE_OBJECT LibDeviceObject,
                 // If this is not the root then decrement the open child reference count
                 //
 
-                if( pObjectInfo->ParentObjectInformation != NULL &&
-                    pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount > 0)
+                if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
                 {
 
-                    InterlockedDecrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+                    pParentObjectInfo = AFSFindObjectInfo( pObjectInfo->VolumeCB,
+                                                           &pObjectInfo->ParentFileId);
+                }
+
+                if( pParentObjectInfo != NULL &&
+                    pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount > 0)
+                {
+
+                    InterlockedDecrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSClose (IOCtl) Decrement child open ref count on Parent object %p Cnt %d\n",
-                                  pObjectInfo->ParentObjectInformation,
-                                  pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+                                  pParentObjectInfo,
+                                  pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
                 }
 
                 AFSReleaseResource( &pFcb->NPFcb->Resource);
@@ -310,6 +318,17 @@ AFSClose( IN PDEVICE_OBJECT LibDeviceObject,
                 pCcb->DirectoryCB = NULL;
 
                 //
+                // Object the Parent ObjectInformationCB
+                //
+
+                if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+                {
+
+                    pParentObjectInfo = AFSFindObjectInfo( pObjectInfo->VolumeCB,
+                                                           &pObjectInfo->ParentFileId);
+                }
+
+                //
                 // Remove the Ccb and de-allocate it
                 //
 
@@ -355,72 +374,77 @@ AFSClose( IN PDEVICE_OBJECT LibDeviceObject,
                         AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource);
                     }
 
-                    AFSAcquireExcl( pObjectInfo->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
-                                    TRUE);
-
-                    AFSAcquireExcl( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock,
-                                    TRUE);
+                    ASSERT( pParentObjectInfo != NULL);
 
-                    lCount = InterlockedDecrement( &pDirCB->DirOpenReferenceCount);
-
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                                  AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSClose (Other) Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
-                                  &pDirCB->NameInformation.FileName,
-                                  pDirCB,
-                                  pCcb,
-                                  lCount);
+                    if ( pParentObjectInfo != NULL)
+                    {
+                        AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+                                        TRUE);
 
-                    ASSERT( lCount >= 0);
+                        AFSAcquireExcl( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock,
+                                        TRUE);
 
-                    if( lCount == 0)
-                    {
+                        lCount = InterlockedDecrement( &pDirCB->DirOpenReferenceCount);
 
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
+                        AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                                       AFS_TRACE_LEVEL_VERBOSE,
-                                      "AFSClose Deleting dir entry %p (%p) for %wZ  FID %08lX-%08lX-%08lX-%08lX\n",
-                                      pDirCB,
-                                      pObjectInfo,
+                                      "AFSClose (Other) Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
                                       &pDirCB->NameInformation.FileName,
-                                      pObjectInfo->FileId.Cell,
-                                      pObjectInfo->FileId.Volume,
-                                      pObjectInfo->FileId.Vnode,
-                                      pObjectInfo->FileId.Unique);
+                                      pDirCB,
+                                      pCcb,
+                                      lCount);
 
-                        //
-                        // Remove and delete the directory entry from the parent list
-                        //
+                        ASSERT( lCount >= 0);
 
-                        AFSDeleteDirEntry( pObjectInfo->ParentObjectInformation,
-                                           pDirCB);
+                        if( lCount == 0)
+                        {
 
-                        AFSAcquireShared( &pObjectInfo->NonPagedInfo->ObjectInfoLock,
-                                          TRUE);
+                            AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
+                                          AFS_TRACE_LEVEL_VERBOSE,
+                                          "AFSClose Deleting dir entry %p (%p) for %wZ  FID %08lX-%08lX-%08lX-%08lX\n",
+                                          pDirCB,
+                                          pObjectInfo,
+                                          &pDirCB->NameInformation.FileName,
+                                          pObjectInfo->FileId.Cell,
+                                          pObjectInfo->FileId.Volume,
+                                          pObjectInfo->FileId.Vnode,
+                                          pObjectInfo->FileId.Unique);
 
-                        if( pObjectInfo->ObjectReferenceCount <= 0)
-                        {
+                            //
+                            // Remove and delete the directory entry from the parent list
+                            //
 
-                            if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_INSERTED_HASH_TREE))
+                            AFSDeleteDirEntry( pParentObjectInfo,
+                                               pDirCB);
+
+                            AFSAcquireShared( &pObjectInfo->NonPagedInfo->ObjectInfoLock,
+                                              TRUE);
+
+                            if( pObjectInfo->ObjectReferenceCount <= 0)
                             {
 
-                                AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
-                                              AFS_TRACE_LEVEL_VERBOSE,
-                                              "AFSClose Removing object %p from volume tree\n",
-                                              pObjectInfo);
+                                if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_INSERTED_HASH_TREE))
+                                {
+
+                                    AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
+                                                  AFS_TRACE_LEVEL_VERBOSE,
+                                                  "AFSClose Removing object %p from volume tree\n",
+                                                  pObjectInfo);
 
-                                AFSRemoveHashEntry( &pObjectInfo->VolumeCB->ObjectInfoTree.TreeHead,
-                                                    &pObjectInfo->TreeEntry);
+                                    AFSRemoveHashEntry( &pObjectInfo->VolumeCB->ObjectInfoTree.TreeHead,
+                                                        &pObjectInfo->TreeEntry);
 
-                                ClearFlag( pObjectInfo->Flags, AFS_OBJECT_INSERTED_HASH_TREE);
+                                    ClearFlag( pObjectInfo->Flags, AFS_OBJECT_INSERTED_HASH_TREE);
+                                }
                             }
-                        }
 
-                        AFSReleaseResource( &pObjectInfo->NonPagedInfo->ObjectInfoLock);
-                    }
+                            AFSReleaseResource( &pObjectInfo->NonPagedInfo->ObjectInfoLock);
+                        }
 
-                    AFSReleaseResource( pObjectInfo->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
+                        AFSReleaseResource( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
 
-                    AFSReleaseResource( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
+                        AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+                    }
                 }
                 else
                 {
@@ -443,17 +467,17 @@ AFSClose( IN PDEVICE_OBJECT LibDeviceObject,
                 //
 
                 if( pObjectInfo != NULL &&
-                    pObjectInfo->ParentObjectInformation != NULL &&
-                    pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount > 0)
+                    pParentObjectInfo != NULL &&
+                    pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount > 0)
                 {
 
-                    InterlockedDecrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+                    InterlockedDecrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSClose Decrement child open ref count on Parent object %p Cnt %d\n",
-                                  pObjectInfo->ParentObjectInformation,
-                                  pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+                                  pParentObjectInfo,
+                                  pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
                 }
 
                 //
@@ -480,6 +504,17 @@ AFSClose( IN PDEVICE_OBJECT LibDeviceObject,
 
                 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
 
+                //
+                // Object the Parent ObjectInformationCB
+                //
+
+                if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+                {
+
+                    pParentObjectInfo = AFSFindObjectInfo( pObjectInfo->VolumeCB,
+                                                           &pObjectInfo->ParentFileId);
+                }
+
                 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSClose Acquiring Special Share lock %p EXCL %08lX\n",
@@ -523,16 +558,16 @@ AFSClose( IN PDEVICE_OBJECT LibDeviceObject,
                 // If this is not the root then decrement the open child reference count
                 //
 
-                if( pObjectInfo->ParentObjectInformation != NULL &&
-                    pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount > 0)
+                if( pParentObjectInfo != NULL &&
+                    pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount > 0)
                 {
 
-                    lCount = InterlockedDecrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+                    lCount = InterlockedDecrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSClose (Share) Decrement child open ref count on Parent object %p Cnt %d\n",
-                                  pObjectInfo->ParentObjectInformation,
+                                  pParentObjectInfo,
                                   lCount);
                 }
 
@@ -580,5 +615,11 @@ try_exit:
         AFSDumpTraceFilesFnc();
     }
 
+    if ( pParentObjectInfo != NULL)
+    {
+
+        AFSReleaseObjectInfo( &pParentObjectInfo);
+    }
+
     return ntStatus;
 }
index 028d8e9..f8a133a 100644 (file)
@@ -1994,11 +1994,18 @@ AFSNotifyDelete( IN AFSDirectoryCB *DirectoryCB,
     AFSFileDeleteCB stDelete;
     AFSFileDeleteResultCB stDeleteResult;
     ULONG ulRequestFlags = AFS_REQUEST_FLAG_SYNCHRONOUS;
+    AFSObjectInfoCB *pObjectInfo = NULL;
+    AFSObjectInfoCB *pParentObjectInfo = NULL;
 
     __Enter
     {
 
-        stDelete.ParentId = DirectoryCB->ObjectInformation->ParentObjectInformation->FileId;
+        pObjectInfo = DirectoryCB->ObjectInformation;
+
+        pParentObjectInfo = AFSFindObjectInfo( pObjectInfo->VolumeCB,
+                                               &pObjectInfo->ParentFileId);
+
+        stDelete.ParentId = pObjectInfo->ParentFileId;
 
         stDelete.ProcessId = (ULONGLONG)PsGetCurrentProcessId();
 
@@ -2013,7 +2020,7 @@ AFSNotifyDelete( IN AFSDirectoryCB *DirectoryCB,
                                       ulRequestFlags,
                                       AuthGroup,
                                       &DirectoryCB->NameInformation.FileName,
-                                      &DirectoryCB->ObjectInformation->FileId,
+                                      &pObjectInfo->FileId,
                                       &stDelete,
                                       sizeof( AFSFileDeleteCB),
                                       &stDeleteResult,
@@ -2030,16 +2037,16 @@ AFSNotifyDelete( IN AFSDirectoryCB *DirectoryCB,
                           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,
+                          pObjectInfo->FileId.Cell,
+                          pObjectInfo->FileId.Volume,
+                          pObjectInfo->FileId.Vnode,
+                          pObjectInfo->FileId.Unique,
                           ntStatus);
 
             try_return( ntStatus);
         }
 
-        AFSAcquireExcl( DirectoryCB->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
+        AFSAcquireExcl( pObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
                         TRUE);
 
         if( CheckOnly)
@@ -2049,12 +2056,12 @@ AFSNotifyDelete( IN AFSDirectoryCB *DirectoryCB,
             // Validate the parent data version
             //
 
-            if( DirectoryCB->ObjectInformation->ParentObjectInformation->DataVersion.QuadPart != stDeleteResult.ParentDataVersion.QuadPart)
+            if( pParentObjectInfo->DataVersion.QuadPart != stDeleteResult.ParentDataVersion.QuadPart)
             {
 
-                SetFlag( DirectoryCB->ObjectInformation->ParentObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
+                SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
 
-                DirectoryCB->ObjectInformation->ParentObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+                pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
             }
         }
         else
@@ -2064,12 +2071,12 @@ AFSNotifyDelete( IN AFSDirectoryCB *DirectoryCB,
             // Update the parent data version
             //
 
-            if( DirectoryCB->ObjectInformation->ParentObjectInformation->DataVersion.QuadPart != stDeleteResult.ParentDataVersion.QuadPart - 1)
+            if( pParentObjectInfo->DataVersion.QuadPart != stDeleteResult.ParentDataVersion.QuadPart - 1)
             {
 
-                SetFlag( DirectoryCB->ObjectInformation->ParentObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
+                SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
 
-                DirectoryCB->ObjectInformation->ParentObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+                pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
             }
             else
             {
@@ -2079,20 +2086,24 @@ AFSNotifyDelete( IN AFSDirectoryCB *DirectoryCB,
                 // Directory data version number can be updated.  Until then we must force
                 // a verification.
                 //
-                // DirectoryCB->ObjectInformation->ParentObjectInformation->DataVersion.QuadPart = stDeleteResult.ParentDataVersion.QuadPart;
+                // pParentObjectInfor->DataVersion.QuadPart = stDeleteResult.ParentDataVersion.QuadPart;
                 //
 
-                SetFlag( DirectoryCB->ObjectInformation->ParentObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
+                SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
 
-                DirectoryCB->ObjectInformation->ParentObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+                pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
             }
         }
 
-        AFSReleaseResource( DirectoryCB->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
+        AFSReleaseResource( pObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
 
 try_exit:
 
-        NOTHING;
+        if ( pParentObjectInfo)
+        {
+
+            AFSReleaseObjectInfo( &pParentObjectInfo);
+        }
     }
 
     return ntStatus;
@@ -2694,7 +2705,7 @@ AFSEvaluateTargetByID( IN AFSObjectInfoCB *ObjectInfo,
     AFSFileEvalResultCB *pEvalResultCB = NULL;
     AFSDirEnumEntry *pDirEnumCB = NULL;
     ULONG ulRequestFlags = AFS_REQUEST_FLAG_SYNCHRONOUS;
-    AFSObjectInfoCB *pParentInfo = NULL;
+    AFSObjectInfoCB *pParentObjectInfo = NULL;
 
     __Enter
     {
@@ -2702,12 +2713,13 @@ AFSEvaluateTargetByID( IN AFSObjectInfoCB *ObjectInfo,
         RtlZeroMemory( &stTargetID,
                        sizeof( AFSEvalTargetCB));
 
-        pParentInfo = ObjectInfo->ParentObjectInformation;
-
-        if( pParentInfo != NULL)
+        if ( BooleanFlagOn( ObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
         {
 
-            stTargetID.ParentId = pParentInfo->FileId;
+            pParentObjectInfo = AFSFindObjectInfo( ObjectInfo->VolumeCB,
+                                                   &ObjectInfo->ParentFileId);
+
+            stTargetID.ParentId = ObjectInfo->ParentFileId;
         }
 
         //
@@ -2757,17 +2769,17 @@ AFSEvaluateTargetByID( IN AFSObjectInfoCB *ObjectInfo,
             if( ntStatus == STATUS_OBJECT_PATH_INVALID)
             {
 
-                if( pParentInfo != NULL)
+                if( pParentObjectInfo != NULL)
                 {
 
-                    AFSAcquireExcl( pParentInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+                    AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
                                     TRUE);
 
-                    SetFlag( pParentInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+                    SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
 
-                    pParentInfo->DataVersion.QuadPart = (ULONGLONG)-1;
+                    pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
 
-                    AFSReleaseResource( pParentInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+                    AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
                 }
             }
 
@@ -2778,21 +2790,21 @@ AFSEvaluateTargetByID( IN AFSObjectInfoCB *ObjectInfo,
         // Validate the parent data version
         //
 
-        if ( pParentInfo != NULL)
+        if ( pParentObjectInfo != NULL)
         {
 
-            AFSAcquireExcl( pParentInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+            AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
                             TRUE);
 
-            if ( pParentInfo->DataVersion.QuadPart != pEvalResultCB->ParentDataVersion.QuadPart)
+            if ( pParentObjectInfo->DataVersion.QuadPart != pEvalResultCB->ParentDataVersion.QuadPart)
             {
 
-                SetFlag( pParentInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+                SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
 
-                pParentInfo->DataVersion.QuadPart = (ULONGLONG)-1;
+                pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
             }
 
-            AFSReleaseResource( pParentInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+            AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
         }
 
         //
@@ -2820,6 +2832,12 @@ AFSEvaluateTargetByID( IN AFSObjectInfoCB *ObjectInfo,
 
 try_exit:
 
+        if ( pParentObjectInfo != NULL)
+        {
+
+            AFSReleaseObjectInfo( &pParentObjectInfo);
+        }
+
         if( pEvalResultCB != NULL)
         {
 
index 1ec51b7..5eece7b 100644 (file)
@@ -1741,12 +1741,12 @@ AFSProcessCreate( IN PIRP               Irp,
                 if ( ntStatus == STATUS_NOT_A_DIRECTORY)
                 {
 
-                    if ( pParentObjectInfo == pObjectInfo->ParentObjectInformation)
+                    if ( !BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
                     {
 
                         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_ERROR,
-                                      "AFSProcessCreate (%p) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                                      "AFSProcessCreate (%p) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX != NULL Status %08lX\n",
                                       Irp,
                                       &pDirEntry->NameInformation.FileName,
                                       pObjectInfo->FileId.Cell,
@@ -1759,12 +1759,12 @@ AFSProcessCreate( IN PIRP               Irp,
                                       pParentObjectInfo->FileId.Unique,
                                       ntStatus);
                     }
-                    else if ( pObjectInfo->ParentObjectInformation == NULL)
+                    else if ( AFSIsEqualFID( &pParentObjectInfo->FileId, &pObjectInfo->ParentFileId))
                     {
 
                         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_ERROR,
-                                      "AFSProcessCreate (%p) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX != NULL Status %08lX\n",
+                                      "AFSProcessCreate (%p) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX Status %08lX\n",
                                       Irp,
                                       &pDirEntry->NameInformation.FileName,
                                       pObjectInfo->FileId.Cell,
@@ -1793,10 +1793,10 @@ AFSProcessCreate( IN PIRP               Irp,
                                       pParentObjectInfo->FileId.Volume,
                                       pParentObjectInfo->FileId.Vnode,
                                       pParentObjectInfo->FileId.Unique,
-                                      pObjectInfo->ParentObjectInformation->FileId.Cell,
-                                      pObjectInfo->ParentObjectInformation->FileId.Volume,
-                                      pObjectInfo->ParentObjectInformation->FileId.Vnode,
-                                      pObjectInfo->ParentObjectInformation->FileId.Unique,
+                                      pObjectInfo->ParentFileId.Cell,
+                                      pObjectInfo->ParentFileId.Volume,
+                                      pObjectInfo->ParentFileId.Vnode,
+                                      pObjectInfo->ParentFileId.Unique,
                                       ntStatus);
                     }
                 }
@@ -1821,6 +1821,9 @@ AFSProcessCreate( IN PIRP               Irp,
             ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_NOT_EVALUATED);
         }
 
+        ASSERT( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID) &&
+                AFSIsEqualFID( &pParentObjectInfo->FileId, &pObjectInfo->ParentFileId));
+
         //
         // We may have raced and the Fcb is already created
         //
@@ -1979,20 +1982,20 @@ AFSProcessCreate( IN PIRP               Irp,
         // Increment the open reference and handle on the parent node
         //
 
-        lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
+        lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSProcessCreate Increment child open handle count on Parent object %p Cnt %d\n",
-                      pObjectInfo->ParentObjectInformation,
+                      pParentObjectInfo,
                       lCount);
 
-        lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+        lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSProcessCreate Increment child open ref count on Parent object %p Cnt %d\n",
-                      pObjectInfo->ParentObjectInformation,
+                      pParentObjectInfo,
                       lCount);
 
         if( ulOptions & FILE_DELETE_ON_CLOSE)
@@ -2154,6 +2157,7 @@ AFSOpenTargetDirectory( IN PIRP Irp,
     BOOLEAN bAllocatedCcb = FALSE;
     BOOLEAN bReleaseFcb = FALSE;
     AFSObjectInfoCB *pParentObject = NULL;
+    AFSObjectInfoCB *pGrandParentObject = NULL;
     UNICODE_STRING uniTargetName;
     LONG lCount;
 
@@ -2334,24 +2338,33 @@ AFSOpenTargetDirectory( IN PIRP Irp,
         // Increment the open reference and handle on the parent node
         //
 
-        if( pParentObject->ParentObjectInformation != NULL)
+        if( BooleanFlagOn( pParentObject->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
         {
 
-            lCount = InterlockedIncrement( &pParentObject->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
+            pGrandParentObject = AFSFindObjectInfo( pParentObject->VolumeCB,
+                                                    &pParentObject->ParentFileId);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSOpenTargetDirectory Increment child open handle count on Parent object %p Cnt %d\n",
-                          pParentObject->ParentObjectInformation,
-                          lCount);
+            if ( pGrandParentObject)
+            {
 
-            lCount = InterlockedIncrement( &pParentObject->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+                lCount = InterlockedIncrement( &pGrandParentObject->Specific.Directory.ChildOpenHandleCount);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSOpenTargetDirectory Increment child open ref count on Parent object %p Cnt %d\n",
-                          pParentObject->ParentObjectInformation,
-                          lCount);
+                AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSOpenTargetDirectory Increment child open handle count on Parent object %p Cnt %d\n",
+                              pGrandParentObject,
+                              lCount);
+
+                lCount = InterlockedIncrement( &pGrandParentObject->Specific.Directory.ChildOpenReferenceCount);
+
+                AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSOpenTargetDirectory Increment child open ref count on Parent object %p Cnt %d\n",
+                              pGrandParentObject,
+                              lCount);
+
+                AFSReleaseObjectInfo( &pGrandParentObject);
+            }
         }
 
 try_exit:
@@ -2438,6 +2451,9 @@ AFSProcessOpen( IN PIRP Irp,
 
         pObjectInfo = DirectoryCB->ObjectInformation;
 
+        ASSERT( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID) &&
+                AFSIsEqualFID( &pParentObjectInfo->FileId, &pObjectInfo->ParentFileId));
+
         //
         // Check if the entry is pending a deletion
         //
@@ -2810,20 +2826,20 @@ AFSProcessOpen( IN PIRP Irp,
         // Increment the open reference and handle on the parent node
         //
 
-        lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
+        lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSProcessOpen Increment child open handle count on Parent object %p Cnt %d\n",
-                      pObjectInfo->ParentObjectInformation,
+                      pParentObjectInfo,
                       lCount);
 
-        lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+        lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSProcessOpen Increment child open ref count on Parent object %p Cnt %d\n",
-                      pObjectInfo->ParentObjectInformation,
+                      pParentObjectInfo,
                       lCount);
 
         if( BooleanFlagOn( ulOptions, FILE_DELETE_ON_CLOSE))
@@ -2981,6 +2997,9 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
 
         pObjectInfo = DirectoryCB->ObjectInformation;
 
+        ASSERT( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID) &&
+                AFSIsEqualFID( &pParentObjectInfo->FileId, &pObjectInfo->ParentFileId));
+
         //
         // Check if we should go and retrieve updated information for the node
         //
@@ -3263,20 +3282,20 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
         // Increment the open reference and handle on the parent node
         //
 
-        lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
+        lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSProcessOverwriteSupersede Increment child open handle count on Parent object %p Cnt %d\n",
-                      pObjectInfo->ParentObjectInformation,
+                      pParentObjectInfo,
                       lCount);
 
-        lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+        lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSProcessOverwriteSupersede Increment child open ref count on Parent object %p Cnt %d\n",
-                      pObjectInfo->ParentObjectInformation,
+                      pParentObjectInfo,
                       lCount);
 
         AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
@@ -3633,6 +3652,7 @@ AFSOpenSpecialShareFcb( IN PIRP Irp,
     PFILE_OBJECT pFileObject = NULL;
     PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
     BOOLEAN bReleaseFcb = FALSE, bAllocatedCcb = FALSE, bAllocateFcb = FALSE;
+    AFSObjectInfoCB *pObjectInfo = NULL;
     AFSObjectInfoCB *pParentObjectInfo = NULL;
     AFSPipeOpenCloseRequestCB stPipeOpen;
     LONG lCount;
@@ -3648,7 +3668,14 @@ AFSOpenSpecialShareFcb( IN PIRP Irp,
                       Irp,
                       &DirectoryCB->NameInformation.FileName);
 
-        pParentObjectInfo = DirectoryCB->ObjectInformation->ParentObjectInformation;
+        pObjectInfo = DirectoryCB->ObjectInformation;
+
+        if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+        {
+
+            pParentObjectInfo = AFSFindObjectInfo( pObjectInfo->VolumeCB,
+                                                   &pObjectInfo->ParentFileId);
+        }
 
         if( DirectoryCB->ObjectInformation->Fcb == NULL)
         {
@@ -3659,7 +3686,7 @@ AFSOpenSpecialShareFcb( IN PIRP Irp,
 
             ntStatus = AFSInitFcb( DirectoryCB);
 
-            *Fcb = DirectoryCB->ObjectInformation->Fcb;
+            *Fcb = pObjectInfo->Fcb;
 
             if( !NT_SUCCESS( ntStatus))
             {
@@ -3684,7 +3711,7 @@ AFSOpenSpecialShareFcb( IN PIRP Irp,
         else
         {
 
-            *Fcb = DirectoryCB->ObjectInformation->Fcb;
+            *Fcb = pObjectInfo->Fcb;
 
             AFSAcquireExcl( &(*Fcb)->NPFcb->Resource,
                             TRUE);
index f0a14b5..5630ba5 100644 (file)
@@ -58,7 +58,7 @@ AFSInitFcb( IN AFSDirectoryCB  *DirEntry)
     AFSFcb *pFcb = NULL;
     AFSNonPagedFcb *pNPFcb = NULL;
     USHORT  usFcbLength = 0;
-    AFSObjectInfoCB *pObjectInfo = NULL, *pParentObjectInfo = NULL;
+    AFSObjectInfoCB *pObjectInfo = NULL;
     AFSVolumeCB *pVolumeCB = NULL;
 
     __Enter
@@ -66,10 +66,6 @@ AFSInitFcb( IN AFSDirectoryCB  *DirEntry)
 
         pObjectInfo = DirEntry->ObjectInformation;
 
-        pParentObjectInfo = pObjectInfo->ParentObjectInformation;
-
-        pVolumeCB = pObjectInfo->VolumeCB;
-
         if ( pObjectInfo->Fcb != NULL)
         {
 
@@ -79,6 +75,8 @@ AFSInitFcb( IN AFSDirectoryCB  *DirEntry)
             try_return( ntStatus = STATUS_SUCCESS);
         }
 
+        pVolumeCB = pObjectInfo->VolumeCB;
+
         //
         // Allocate the Fcb and the nonpaged portion of the Fcb.
         //
index 26107b4..0deb376 100644 (file)
@@ -621,9 +621,10 @@ AFSSetFileInfo( IN PDEVICE_OBJECT LibDeviceObject,
         RtlZeroMemory( &stParentFileId,
                        sizeof( AFSFileID));
 
-        if( pFcb->ObjectInformation->ParentObjectInformation != NULL)
+        if( BooleanFlagOn( pFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
         {
-            stParentFileId = pFcb->ObjectInformation->ParentObjectInformation->FileId;
+
+            stParentFileId = pFcb->ObjectInformation->ParentFileId;
         }
 
         //
@@ -1980,13 +1981,21 @@ AFSSetBasicInfo( IN PIRP Irp,
         if( ulNotifyFilter > 0)
         {
 
-            if( DirectoryCB->ObjectInformation->ParentObjectInformation != NULL)
+            if( BooleanFlagOn( DirectoryCB->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
             {
 
-                AFSFsRtlNotifyFullReportChange( DirectoryCB->ObjectInformation->ParentObjectInformation,
-                                                pCcb,
-                                                (ULONG)ulNotifyFilter,
-                                                (ULONG)FILE_ACTION_MODIFIED);
+                AFSObjectInfoCB * pParentObjectInfo = AFSFindObjectInfo( DirectoryCB->ObjectInformation->VolumeCB,
+                                                                         &DirectoryCB->ObjectInformation->ParentFileId);
+
+                if ( pParentObjectInfo != NULL)
+                {
+                    AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
+                                                    pCcb,
+                                                    (ULONG)ulNotifyFilter,
+                                                    (ULONG)FILE_ACTION_MODIFIED);
+
+                    AFSReleaseObjectInfo( &pParentObjectInfo);
+                }
             }
         }
 
@@ -2243,7 +2252,13 @@ AFSSetFileLinkInfo( IN PIRP Irp)
         pSrcCcb = (AFSCcb *)pSrcFileObj->FsContext2;
 
         pSrcObject = pSrcFcb->ObjectInformation;
-        pSrcParentObject = pSrcFcb->ObjectInformation->ParentObjectInformation;
+
+        if ( BooleanFlagOn( pSrcFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+        {
+
+            pSrcParentObject = AFSFindObjectInfo( pSrcFcb->ObjectInformation->VolumeCB,
+                                                  &pSrcFcb->ObjectInformation->ParentFileId);
+        }
 
         pFileLinkInfo = (PFILE_LINK_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
 
@@ -2434,7 +2449,8 @@ AFSSetFileLinkInfo( IN PIRP Irp)
         if( pTargetDirEntry != NULL)
         {
 
-            ASSERT( pTargetParentObject == pTargetDirEntry->ObjectInformation->ParentObjectInformation);
+            ASSERT( BooleanFlagOn( pTargetDirEntry->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID) &&
+                    AFSIsEqualFID( &pTargetParentObject->FileId, &pTargetDirEntry->ObjectInformation->ParentFileId));
 
             lCount = InterlockedIncrement( &pTargetDirEntry->DirOpenReferenceCount);
 
@@ -2491,7 +2507,7 @@ AFSSetFileLinkInfo( IN PIRP Irp)
 
         ntStatus = AFSNotifyHardLink( pSrcFcb->ObjectInformation,
                                       &pSrcCcb->AuthGroup,
-                                      pSrcFcb->ObjectInformation->ParentObjectInformation,
+                                      pSrcParentObject,
                                       pTargetDcb->ObjectInformation,
                                       pSrcCcb->DirectoryCB,
                                       &uniTargetName,
@@ -2535,7 +2551,7 @@ AFSSetFileLinkInfo( IN PIRP Irp)
             ulNotificationAction = FILE_ACTION_ADDED;
         }
 
-        AFSFsRtlNotifyFullReportChange( pTargetParentObject->ParentObjectInformation,
+        AFSFsRtlNotifyFullReportChange( pTargetParentObject,
                                         pSrcCcb,
                                         (ULONG)ulNotifyFilter,
                                         (ULONG)ulNotificationAction);
@@ -2548,7 +2564,7 @@ AFSSetFileLinkInfo( IN PIRP Irp)
             if( bTargetEntryExists)
             {
 
-                AFSInsertDirectoryNode( pTargetDirEntry->ObjectInformation->ParentObjectInformation,
+                AFSInsertDirectoryNode( pTargetParentObject,
                                         pTargetDirEntry,
                                         FALSE);
             }
@@ -2599,6 +2615,19 @@ AFSSetFileLinkInfo( IN PIRP Irp)
 
             AFSReleaseResource( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.TreeLock);
         }
+
+        if ( pSrcParentObject != NULL)
+        {
+
+            AFSReleaseObjectInfo( &pSrcParentObject);
+        }
+
+        //
+        // No need to release pTargetParentObject as it is either a copy of pSrcParentObject
+        // or (AFSFcb *)pTargetFileObj->FsContext->ObjectInformation
+        //
+
+        pTargetParentObject = NULL;
     }
 
     return ntStatus;
@@ -2646,7 +2675,13 @@ AFSSetRenameInfo( IN PIRP Irp)
         pSrcCcb = (AFSCcb *)pSrcFileObj->FsContext2;
 
         pSrcObject = pSrcFcb->ObjectInformation;
-        pSrcParentObject = pSrcFcb->ObjectInformation->ParentObjectInformation;
+
+        if ( BooleanFlagOn( pSrcFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+        {
+
+            pSrcParentObject = AFSFindObjectInfo( pSrcFcb->ObjectInformation->VolumeCB,
+                                                  &pSrcFcb->ObjectInformation->ParentFileId);
+        }
 
         //
         // Perform some basic checks to ensure FS integrity
@@ -2871,7 +2906,8 @@ AFSSetRenameInfo( IN PIRP Irp)
         if( pTargetDirEntry != NULL)
         {
 
-            ASSERT( pTargetParentObject == pTargetDirEntry->ObjectInformation->ParentObjectInformation);
+            ASSERT( BooleanFlagOn( pTargetDirEntry->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID) &&
+                    AFSIsEqualFID( &pTargetParentObject->FileId, &pTargetDirEntry->ObjectInformation->ParentFileId));
 
             lCount = InterlockedIncrement( &pTargetDirEntry->DirOpenReferenceCount);
 
@@ -2927,7 +2963,7 @@ AFSSetRenameInfo( IN PIRP Irp)
         // same parent we do not pull the node from the enumeration list
         //
 
-        AFSRemoveDirNodeFromParent( pSrcFcb->ObjectInformation->ParentObjectInformation,
+        AFSRemoveDirNodeFromParent( pSrcParentObject,
                                     pSrcCcb->DirectoryCB,
                                     !bCommonParent);
 
@@ -2938,7 +2974,7 @@ AFSSetRenameInfo( IN PIRP Irp)
 
         ntStatus = AFSNotifyRename( pSrcFcb->ObjectInformation,
                                     &pSrcCcb->AuthGroup,
-                                    pSrcFcb->ObjectInformation->ParentObjectInformation,
+                                    pSrcParentObject,
                                     pTargetDcb->ObjectInformation,
                                     pSrcCcb->DirectoryCB,
                                     &uniTargetName,
@@ -2951,7 +2987,7 @@ AFSSetRenameInfo( IN PIRP Irp)
             // Attempt to re-insert the directory entry
             //
 
-            AFSInsertDirectoryNode( pSrcFcb->ObjectInformation->ParentObjectInformation,
+            AFSInsertDirectoryNode( pSrcParentObject,
                                     pSrcCcb->DirectoryCB,
                                     !bCommonParent);
 
@@ -2969,7 +3005,7 @@ AFSSetRenameInfo( IN PIRP Irp)
         // Set the notification up for the source file
         //
 
-        if( pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation == pTargetParentObject &&
+        if( pSrcParentObject == pTargetParentObject &&
             !bTargetEntryExists)
         {
 
@@ -2992,7 +3028,7 @@ AFSSetRenameInfo( IN PIRP Irp)
             ulNotifyFilter = FILE_NOTIFY_CHANGE_FILE_NAME;
         }
 
-        AFSFsRtlNotifyFullReportChange( pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation,
+        AFSFsRtlNotifyFullReportChange( pSrcParentObject,
                                         pSrcCcb,
                                         (ULONG)ulNotifyFilter,
                                         (ULONG)ulNotificationAction);
@@ -3011,7 +3047,7 @@ AFSSetRenameInfo( IN PIRP Irp)
             // Attempt to re-insert the directory entry
             //
 
-            AFSInsertDirectoryNode( pSrcFcb->ObjectInformation->ParentObjectInformation,
+            AFSInsertDirectoryNode( pSrcParentObject,
                                     pSrcCcb->DirectoryCB,
                                     !bCommonParent);
 
@@ -3135,12 +3171,12 @@ AFSSetRenameInfo( IN PIRP Irp)
         // Update the parent pointer in the source object if they are different
         //
 
-        if( pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation != pTargetParentObject)
+        if( pSrcParentObject != pTargetParentObject)
         {
 
-            lCount = InterlockedDecrement( &pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
+            lCount = InterlockedDecrement( &pSrcParentObject->Specific.Directory.ChildOpenHandleCount);
 
-            lCount = InterlockedDecrement( &pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+            lCount = InterlockedDecrement( &pSrcParentObject->Specific.Directory.ChildOpenReferenceCount);
 
             lCount = InterlockedIncrement( &pTargetParentObject->Specific.Directory.ChildOpenHandleCount);
 
@@ -3155,16 +3191,20 @@ AFSSetRenameInfo( IN PIRP Irp)
                           pTargetParentObject,
                           lCount);
 
-            lCount = AFSObjectInfoDecrement( pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation,
+            lCount = AFSObjectInfoDecrement( pSrcParentObject,
                                              AFS_OBJECT_REFERENCE_CHILD);
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSSetRenameInfo Decrement count on parent object %p Cnt %d\n",
-                          pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation,
+                          pSrcParentObject,
                           lCount);
 
-            pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation = pTargetParentObject;
+            pSrcCcb->DirectoryCB->ObjectInformation->ParentFileId = pTargetParentObject->FileId;
+
+            SetFlag( pSrcCcb->DirectoryCB->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID);
+
+            pSrcParentObject = pTargetParentObject;
 
             ulNotificationAction = FILE_ACTION_ADDED;
         }
@@ -3327,7 +3367,10 @@ try_exit:
 
             if( bTargetEntryExists)
             {
-                AFSInsertDirectoryNode( pTargetDirEntry->ObjectInformation->ParentObjectInformation,
+
+                ASSERT( pTargetParentObject != NULL);
+
+                AFSInsertDirectoryNode( pTargetParentObject,
                                         pTargetDirEntry,
                                         FALSE);
             }
@@ -3360,12 +3403,25 @@ try_exit:
 
             AFSReleaseResource( pSourceDirLock);
         }
-    }
 
-    if ( bDereferenceTargetParentObject)
-    {
+        if ( bDereferenceTargetParentObject)
+        {
+
+            ObDereferenceObject( pTargetParentFileObj);
+        }
 
-        ObDereferenceObject( pTargetParentFileObj);
+        if ( pSrcParentObject != NULL)
+        {
+
+            AFSReleaseObjectInfo( &pSrcParentObject);
+        }
+
+        //
+        // No need to release pTargetParentObject as it is either a copy of pSrcParentObject
+        // or (AFSFcb *)pTargetFileObj->FsContext->ObjectInformation
+        //
+
+        pTargetParentObject = NULL;
     }
 
     return ntStatus;
@@ -3543,7 +3599,10 @@ AFSSetAllocationInfo( IN PIRP Irp,
     //
     if (bTellService)
     {
-        ntStatus = AFSUpdateFileInformation( &pFcb->ObjectInformation->ParentObjectInformation->FileId,
+
+        ASSERT( BooleanFlagOn( pFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID));
+
+        ntStatus = AFSUpdateFileInformation( &pFcb->ObjectInformation->ParentFileId,
                                              pFcb->ObjectInformation,
                                              &pCcb->AuthGroup);
     }
@@ -3761,7 +3820,9 @@ AFSSetEndOfFileInfo( IN PIRP Irp,
         // Tell the server
         //
 
-        ntStatus = AFSUpdateFileInformation( &pFcb->ObjectInformation->ParentObjectInformation->FileId,
+        ASSERT( BooleanFlagOn( pFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID));
+
+        ntStatus = AFSUpdateFileInformation( &pFcb->ObjectInformation->ParentFileId,
                                              pFcb->ObjectInformation,
                                              &pCcb->AuthGroup);
 
index 2f5e42a..89ad4f2 100644 (file)
@@ -1591,6 +1591,7 @@ AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo,
     NTSTATUS ntStatus = STATUS_SUCCESS;
     IO_STATUS_BLOCK stIoStatus;
     ULONG ulFilter = 0;
+    AFSObjectInfoCB * pParentObjectInfo = NULL;
 
     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                   AFS_TRACE_LEVEL_VERBOSE,
@@ -1602,6 +1603,13 @@ AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo,
                   (*ppObjectInfo)->FileId.Unique,
                   Reason);
 
+    if ( BooleanFlagOn( (*ppObjectInfo)->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+    {
+
+        pParentObjectInfo = AFSFindObjectInfo( (*ppObjectInfo)->VolumeCB,
+                                               &(*ppObjectInfo)->ParentFileId);
+    }
+
     if( (*ppObjectInfo)->FileType == AFS_FILE_TYPE_SYMLINK ||
         (*ppObjectInfo)->FileType == AFS_FILE_TYPE_DFSLINK ||
         (*ppObjectInfo)->FileType == AFS_FILE_TYPE_MOUNTPOINT)
@@ -1644,27 +1652,31 @@ AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo,
             SetFlag( (*ppObjectInfo)->Flags, AFS_OBJECT_FLAGS_VERIFY);
         }
 
-        ulFilter = FILE_NOTIFY_CHANGE_FILE_NAME;
-
-        if( Reason == AFS_INVALIDATE_CREDS)
+        if ( pParentObjectInfo != NULL)
         {
-            ulFilter |= FILE_NOTIFY_CHANGE_SECURITY;
-        }
 
-        if( Reason == AFS_INVALIDATE_DATA_VERSION ||
-            Reason == AFS_INVALIDATE_FLUSHED)
-        {
-            ulFilter |= FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE;
-        }
-        else
-        {
-            ulFilter |= FILE_NOTIFY_CHANGE_ATTRIBUTES;
-        }
+            ulFilter = FILE_NOTIFY_CHANGE_FILE_NAME;
+
+            if( Reason == AFS_INVALIDATE_CREDS)
+            {
+                ulFilter |= FILE_NOTIFY_CHANGE_SECURITY;
+            }
+
+            if( Reason == AFS_INVALIDATE_DATA_VERSION ||
+                Reason == AFS_INVALIDATE_FLUSHED)
+            {
+                ulFilter |= FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE;
+            }
+            else
+            {
+                ulFilter |= FILE_NOTIFY_CHANGE_ATTRIBUTES;
+            }
 
-        AFSFsRtlNotifyFullReportChange( (*ppObjectInfo)->ParentObjectInformation,
-                                        NULL,
-                                        ulFilter,
-                                        FILE_ACTION_MODIFIED);
+            AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
+                                            NULL,
+                                            ulFilter,
+                                            FILE_ACTION_MODIFIED);
+        }
 
         try_return( ntStatus);
     }
@@ -1695,37 +1707,37 @@ AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo,
                           (*ppObjectInfo)->FileId.Vnode,
                           (*ppObjectInfo)->FileId.Unique);
 
-            if( (*ppObjectInfo)->ParentObjectInformation != NULL)
+            if( pParentObjectInfo != NULL)
             {
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSInvalidateObject Set VERIFY flag on parent fid %08lX-%08lX-%08lX-%08lX\n",
-                              (*ppObjectInfo)->ParentObjectInformation->FileId.Cell,
-                              (*ppObjectInfo)->ParentObjectInformation->FileId.Volume,
-                              (*ppObjectInfo)->ParentObjectInformation->FileId.Vnode,
-                              (*ppObjectInfo)->ParentObjectInformation->FileId.Unique);
+                              pParentObjectInfo->FileId.Cell,
+                              pParentObjectInfo->FileId.Volume,
+                              pParentObjectInfo->FileId.Vnode,
+                              pParentObjectInfo->FileId.Unique);
 
-                SetFlag( (*ppObjectInfo)->ParentObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
+                SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
 
-                (*ppObjectInfo)->ParentObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+                pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
 
-                (*ppObjectInfo)->ParentObjectInformation->Expiration.QuadPart = 0;
-            }
+                pParentObjectInfo->Expiration.QuadPart = 0;
 
-            if( (*ppObjectInfo)->FileType == AFS_FILE_TYPE_DIRECTORY)
-            {
-                ulFilter = FILE_NOTIFY_CHANGE_DIR_NAME;
-            }
-            else
-            {
-                ulFilter = FILE_NOTIFY_CHANGE_FILE_NAME;
-            }
+                if( (*ppObjectInfo)->FileType == AFS_FILE_TYPE_DIRECTORY)
+                {
+                    ulFilter = FILE_NOTIFY_CHANGE_DIR_NAME;
+                }
+                else
+                {
+                    ulFilter = FILE_NOTIFY_CHANGE_FILE_NAME;
+                }
 
-            AFSFsRtlNotifyFullReportChange( (*ppObjectInfo)->ParentObjectInformation,
-                                            NULL,
-                                            ulFilter,
-                                            FILE_ACTION_REMOVED);
+                AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
+                                                NULL,
+                                                ulFilter,
+                                                FILE_ACTION_REMOVED);
+            }
 
             if( NT_SUCCESS( AFSQueueInvalidateObject( (*ppObjectInfo),
                                                       Reason)))
@@ -1883,10 +1895,10 @@ AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo,
                                                 ulFilter,
                                                 FILE_ACTION_MODIFIED);
             }
-            else
+            else if ( pParentObjectInfo != NULL)
             {
 
-                AFSFsRtlNotifyFullReportChange( (*ppObjectInfo)->ParentObjectInformation,
+                AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
                                                 NULL,
                                                 ulFilter,
                                                 FILE_ACTION_MODIFIED);
@@ -1927,6 +1939,12 @@ AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo,
 
   try_exit:
 
+    if ( pParentObjectInfo != NULL)
+    {
+
+        AFSReleaseObjectInfo( &pParentObjectInfo);
+    }
+
     return ntStatus;
 }
 
@@ -2118,11 +2136,13 @@ AFSIsChildOfParent( IN AFSFcb *Dcb,
 
     BOOLEAN bIsChild = FALSE;
     AFSFcb *pCurrentFcb = Fcb;
+    AFSObjectInfoCB * pParentObjectInfo = NULL;
 
     while( pCurrentFcb != NULL)
     {
 
-        if( pCurrentFcb->ObjectInformation->ParentObjectInformation == Dcb->ObjectInformation)
+        if( BooleanFlagOn( pCurrentFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID) &&
+            AFSIsEqualFID( &pCurrentFcb->ObjectInformation->ParentFileId, &Dcb->ObjectInformation->FileId))
         {
 
             bIsChild = TRUE;
@@ -2130,7 +2150,21 @@ AFSIsChildOfParent( IN AFSFcb *Dcb,
             break;
         }
 
-        pCurrentFcb = pCurrentFcb->ObjectInformation->ParentObjectInformation->Fcb;
+        pParentObjectInfo = AFSFindObjectInfo( pCurrentFcb->ObjectInformation->VolumeCB,
+                                               &pCurrentFcb->ObjectInformation->ParentFileId);
+
+        if ( pParentObjectInfo != NULL)
+        {
+
+            pCurrentFcb = pParentObjectInfo->Fcb;
+
+            AFSReleaseObjectInfo( &pParentObjectInfo);
+        }
+        else
+        {
+
+            pCurrentFcb = NULL;
+        }
     }
 
     return bIsChild;
@@ -6504,13 +6538,15 @@ AFSAllocateObjectInfo( IN AFSObjectInfoCB *ParentObjectInfo,
 
         pObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock = &pObjectInfo->NonPagedInfo->DirectoryNodeHdrLock;
 
-        pObjectInfo->VolumeCB = ParentObjectInfo->VolumeCB;
-
-        pObjectInfo->ParentObjectInformation = ParentObjectInfo;
-
         if( ParentObjectInfo != NULL)
         {
 
+            pObjectInfo->VolumeCB = ParentObjectInfo->VolumeCB;
+
+            pObjectInfo->ParentFileId = ParentObjectInfo->FileId;
+
+            SetFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID);
+
             lCount = AFSObjectInfoIncrement( ParentObjectInfo,
                                              AFS_OBJECT_REFERENCE_CHILD);
 
@@ -6530,6 +6566,8 @@ AFSAllocateObjectInfo( IN AFSObjectInfoCB *ParentObjectInfo,
         if( HashIndex != 0)
         {
 
+            ASSERT( ParentObjectInfo);
+
             //
             // Insert the entry into the object tree and list
             //
@@ -6658,13 +6696,59 @@ AFSObjectInfoDecrement( IN AFSObjectInfoCB *ObjectInfo,
     return lCount;
 }
 
+AFSObjectInfoCB *
+AFSFindObjectInfo( IN AFSVolumeCB *VolumeCB,
+                   IN AFSFileID   *FileId)
+{
+    DWORD            ntStatus = STATUS_SUCCESS;
+    ULONGLONG        ullIndex;
+    AFSObjectInfoCB *pObjectInfo = NULL;
+
+    if ( AFSIsEqualFID( &VolumeCB->ObjectInformation.FileId, FileId))
+    {
 
+        pObjectInfo = &VolumeCB->ObjectInformation;
+    }
+    else
+    {
+
+        AFSAcquireExcl( VolumeCB->ObjectInfoTree.TreeLock,
+                        TRUE);
+
+        ullIndex = AFSCreateLowIndex( FileId);
+
+        ntStatus = AFSLocateHashEntry( VolumeCB->ObjectInfoTree.TreeHead,
+                                       ullIndex,
+                                       (AFSBTreeEntry **)&pObjectInfo);
+
+        AFSReleaseResource( VolumeCB->ObjectInfoTree.TreeLock);
+    }
+
+    if ( NT_SUCCESS( ntStatus)) {
+
+        AFSObjectInfoIncrement( pObjectInfo,
+                                AFS_OBJECT_REFERENCE_FIND);
+    }
+
+    return pObjectInfo;
+}
+
+void
+AFSReleaseObjectInfo( IN AFSObjectInfoCB **ppObjectInfo)
+{
+
+    AFSObjectInfoDecrement( *ppObjectInfo,
+                            AFS_OBJECT_REFERENCE_FIND);
+
+    *ppObjectInfo = NULL;
+}
 
 void
 AFSDeleteObjectInfo( IN AFSObjectInfoCB *ObjectInfo)
 {
 
     BOOLEAN bAcquiredTreeLock = FALSE;
+    AFSObjectInfoCB * pParentObjectInfo = NULL;
     LONG lCount;
 
     if ( BooleanFlagOn( ObjectInfo->Flags, AFS_OBJECT_ROOT_VOLUME))
@@ -6693,6 +6777,13 @@ AFSDeleteObjectInfo( IN AFSObjectInfoCB *ObjectInfo)
         bAcquiredTreeLock = TRUE;
     }
 
+    if ( BooleanFlagOn( ObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+    {
+
+        pParentObjectInfo = AFSFindObjectInfo( ObjectInfo->VolumeCB,
+                                               &ObjectInfo->ParentFileId);
+    }
+
     //
     // Remove it from the tree and list if it was inserted
     //
@@ -6742,16 +6833,16 @@ AFSDeleteObjectInfo( IN AFSObjectInfoCB *ObjectInfo)
         }
     }
 
-    if( ObjectInfo->ParentObjectInformation != NULL)
+    if( pParentObjectInfo != NULL)
     {
 
-        lCount = AFSObjectInfoDecrement( ObjectInfo->ParentObjectInformation,
+        lCount = AFSObjectInfoDecrement( pParentObjectInfo,
                                          AFS_OBJECT_REFERENCE_CHILD);
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSDeleteObjectInfo Decrement count on parent object %p Cnt %d\n",
-                      ObjectInfo->ParentObjectInformation,
+                      pParentObjectInfo,
                       lCount);
     }
 
index 874634a..19a0301 100644 (file)
@@ -267,7 +267,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                     if ( ntStatus == STATUS_NOT_A_DIRECTORY)
                     {
 
-                        if ( pCurrentObject->ParentObjectInformation == NULL)
+                        if ( !BooleanFlagOn( pCurrentObject->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
                         {
 
                             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
@@ -293,10 +293,10 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                                           pCurrentObject->FileId.Volume,
                                           pCurrentObject->FileId.Vnode,
                                           pCurrentObject->FileId.Unique,
-                                          pCurrentObject->ParentObjectInformation->FileId.Cell,
-                                          pCurrentObject->ParentObjectInformation->FileId.Volume,
-                                          pCurrentObject->ParentObjectInformation->FileId.Vnode,
-                                          pCurrentObject->ParentObjectInformation->FileId.Unique,
+                                          pCurrentObject->ParentFileId.Cell,
+                                          pCurrentObject->ParentFileId.Volume,
+                                          pCurrentObject->ParentFileId.Vnode,
+                                          pCurrentObject->ParentFileId.Unique,
                                           ntStatus);
                         }
                     }
@@ -1700,7 +1700,12 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
                 // on the entry
                 //
 
-                pParentObjectInfo = pCurrentObject->ParentObjectInformation;
+                if( BooleanFlagOn( pCurrentObject->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+                {
+
+                    pParentObjectInfo = AFSFindObjectInfo( pCurrentObject->VolumeCB,
+                                                           &pCurrentObject->ParentFileId);
+                }
 
                 ASSERT( pParentObjectInfo != NULL);
 
@@ -1781,6 +1786,8 @@ AFSLocateNameEntry( IN GUID *AuthGroup,
 
                 AFSReleaseResource( pCurrentObject->VolumeCB->ObjectInfoTree.TreeLock);
 
+                AFSReleaseObjectInfo( &pParentObjectInfo);
+
                 //
                 // We deleted the dir entry so check if there is any remaining portion
                 // of the name to process.
index b3565d2..7d2e5b4 100644 (file)
@@ -1373,16 +1373,14 @@ AFSIOCtlRead( IN PDEVICE_OBJECT DeviceObject,
         RtlZeroMemory( &stParentFID,
                        sizeof( AFSFileID));
 
-        if( pFcb->ObjectInformation->ParentObjectInformation != NULL)
+        if( BooleanFlagOn( pFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
         {
 
             //
             // The parent directory FID of the node
             //
 
-            ASSERT( pFcb->ObjectInformation->ParentObjectInformation->FileType == AFS_FILE_TYPE_DIRECTORY);
-
-            stParentFID = pFcb->ObjectInformation->ParentObjectInformation->FileId;
+            stParentFID = pFcb->ObjectInformation->ParentFileId;
         }
 
         //
index b6acf1c..d73a06f 100644 (file)
@@ -773,14 +773,14 @@ AFSIOCtlWrite( IN PDEVICE_OBJECT DeviceObject,
         RtlZeroMemory( &stParentFID,
                        sizeof( AFSFileID));
 
-        if( pFcb->ObjectInformation->ParentObjectInformation != NULL)
+        if( BooleanFlagOn( pFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
         {
 
             //
             // The parent directory FID of the node
             //
 
-            stParentFID = pFcb->ObjectInformation->ParentObjectInformation->FileId;
+            stParentFID = pFcb->ObjectInformation->ParentFileId;
         }
 
         //
@@ -1754,7 +1754,7 @@ AFSExtendingWrite( IN AFSFcb *Fcb,
     // Tell the server
     //
 
-    ntStatus = AFSUpdateFileInformation( &Fcb->ObjectInformation->ParentObjectInformation->FileId,
+    ntStatus = AFSUpdateFileInformation( &Fcb->ObjectInformation->ParentFileId,
                                          Fcb->ObjectInformation,
                                          &pCcb->AuthGroup);
 
index 37f552a..030b1bd 100644 (file)
@@ -1333,6 +1333,13 @@ AFSObjectInfoDecrement( IN AFSObjectInfoCB *ObjectInfo,
 void
 AFSDeleteObjectInfo( IN AFSObjectInfoCB *ObjectInfo);
 
+AFSObjectInfoCB *
+AFSFindObjectInfo( IN AFSVolumeCB * VolumeCB,
+                   IN AFSFileID   * FileID);
+
+void
+AFSReleaseObjectInfo( IN OUT AFSObjectInfoCB **ppObjectInfo);
+
 NTSTATUS
 AFSEvaluateRootEntry( IN AFSDirectoryCB *DirectoryCB,
                       OUT AFSDirectoryCB **TargetDirEntry);
index 794a378..e957c25 100644 (file)
@@ -152,6 +152,7 @@ NTSTATUS
 #define AFS_OBJECT_HELD_IN_SERVICE                      0x00000080
 #define AFS_OBJECT_ROOT_VOLUME                          0x00000100
 #define AFS_OBJECT_FLAGS_VERIFY_DATA                    0x00000200
+#define AFS_OBJECT_FLAGS_PARENT_FID                     0x00000400
 
 //
 // Object information reference count reasons
@@ -164,7 +165,7 @@ NTSTATUS
 #define AFS_OBJECT_REFERENCE_EXTENTS                    4
 #define AFS_OBJECT_REFERENCE_WORKER                     5
 #define AFS_OBJECT_REFERENCE_STATUS                     6
-// unused                                               7
+#define AFS_OBJECT_REFERENCE_FIND                       7
 #define AFS_OBJECT_REFERENCE_MAX                        8
 
 //
index 9977f05..44c133a 100644 (file)
@@ -207,7 +207,7 @@ typedef struct _AFS_OBJECT_INFORMATION_CB
     // Parent object information
     //
 
-    struct _AFS_OBJECT_INFORMATION_CB   *ParentObjectInformation;
+    AFSFileID              ParentFileId;
 
     //
     // Pointer to the current Fcb, if available