From: Jeffrey Altman Date: Fri, 1 Feb 2013 18:40:22 +0000 (-0500) Subject: Windows: Replace ParentObjectInformation pointer X-Git-Tag: upstream/1.8.0_pre1^2~1584 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=5649d84f1a96e3b2cc1dc42d67d3facb4e4b5d07;p=packages%2Fo%2Fopenafs.git Windows: Replace ParentObjectInformation pointer 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 Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman --- diff --git a/src/WINNT/afsrdr/kernel/lib/AFSBTreeSupport.cpp b/src/WINNT/afsrdr/kernel/lib/AFSBTreeSupport.cpp index d81803826..45afde09d 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSBTreeSupport.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSBTreeSupport.cpp @@ -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; } } diff --git a/src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp b/src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp index a6c1ec50a..ff2e2280d 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp @@ -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) { diff --git a/src/WINNT/afsrdr/kernel/lib/AFSClose.cpp b/src/WINNT/afsrdr/kernel/lib/AFSClose.cpp index 23e42423f..7d9022562 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSClose.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSClose.cpp @@ -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; } diff --git a/src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp b/src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp index 028d8e9dc..f8a133ab4 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp @@ -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) { diff --git a/src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp b/src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp index 1ec51b73d..5eece7bed 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp @@ -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); diff --git a/src/WINNT/afsrdr/kernel/lib/AFSFcbSupport.cpp b/src/WINNT/afsrdr/kernel/lib/AFSFcbSupport.cpp index f0a14b525..5630ba5b8 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSFcbSupport.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSFcbSupport.cpp @@ -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. // diff --git a/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp b/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp index 26107b4d3..0deb3765a 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp @@ -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); diff --git a/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp b/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp index 2f5e42a12..89ad4f2f7 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp @@ -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); } diff --git a/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp b/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp index 874634ad2..19a030144 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp @@ -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. diff --git a/src/WINNT/afsrdr/kernel/lib/AFSRead.cpp b/src/WINNT/afsrdr/kernel/lib/AFSRead.cpp index b3565d2c9..7d2e5b499 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSRead.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSRead.cpp @@ -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; } // diff --git a/src/WINNT/afsrdr/kernel/lib/AFSWrite.cpp b/src/WINNT/afsrdr/kernel/lib/AFSWrite.cpp index b6acf1c4d..d73a06f41 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSWrite.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSWrite.cpp @@ -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); diff --git a/src/WINNT/afsrdr/kernel/lib/Include/AFSCommon.h b/src/WINNT/afsrdr/kernel/lib/Include/AFSCommon.h index 37f552a83..030b1bd8e 100644 --- a/src/WINNT/afsrdr/kernel/lib/Include/AFSCommon.h +++ b/src/WINNT/afsrdr/kernel/lib/Include/AFSCommon.h @@ -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); diff --git a/src/WINNT/afsrdr/kernel/lib/Include/AFSDefines.h b/src/WINNT/afsrdr/kernel/lib/Include/AFSDefines.h index 794a3780b..e957c25f6 100644 --- a/src/WINNT/afsrdr/kernel/lib/Include/AFSDefines.h +++ b/src/WINNT/afsrdr/kernel/lib/Include/AFSDefines.h @@ -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 // diff --git a/src/WINNT/afsrdr/kernel/lib/Include/AFSStructs.h b/src/WINNT/afsrdr/kernel/lib/Include/AFSStructs.h index 9977f0546..44c133adb 100644 --- a/src/WINNT/afsrdr/kernel/lib/Include/AFSStructs.h +++ b/src/WINNT/afsrdr/kernel/lib/Include/AFSStructs.h @@ -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