]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
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 d818038261887af9b0e7149da2c8d1fd5cd518ab..45afde09dfbd103f2b2da53da57430ea37bfc706 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 a6c1ec50ac26549df89d163db143fd04c71f95bf..ff2e2280dc46557367135778f0a454aebdef4621 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 23e42423f7f73121ec2ac9823501f912987dbbe5..7d902256205e84039af225073dfd45b63432949c 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);
@@ -309,6 +317,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 028d8e9dc50aa239ecdf3a8131acf2102fa32c3d..f8a133ab46cedefdf49b1b5449dae66e11e58ea0 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 1ec51b73d309029a29fdbd5d2de25bfb6022aa5d..5eece7bed9feec6d2e59a3f2ce87fd2d9da60eb0 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 f0a14b525fe16fc7834033cb78e15cc7fc7834b3..5630ba5b88a19cb4340704ba1b7fb7b588648102 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 26107b4d3a84af6ab8160c90a8401ff58569d763..0deb3765a269a6709a0f19139b2d8cc16bb0dfc6 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 2f5e42a12c4e3e2ec426a5091dd1f8f99a56e82e..89ad4f2f73169245741e253b3393b5349f2df45e 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 874634ad247686878375384b062b55df42efd3fa..19a0301446e61125536596db3ec496a25a769394 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 b3565d2c926c3d16137458ea267f9b3b6a88bd28..7d2e5b499476fa040743993834739c1ce495cff5 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 b6acf1c4da55b1f0b8eba63c1c9b32649c1fb509..d73a06f41dd25a3d4f4a9848eee11cb3176d5415 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 37f552a83e925313fa8a1112f58ac0e0413eab61..030b1bd8e8a36b51da6ceed847d8236acf4c9a59 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 794a3780bbb1890d1b653231fbb0fccef0f55c44..e957c25f64f04125562460c603191e7b25168234 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 9977f05469d2be855190acf3f65b6a7d7c6b6063..44c133adbcd23145b9351a10eda57a7ded8d8ca4 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