From 4f4b805ae9107482aa39f2c3c0c4327e8466e2ac Mon Sep 17 00:00:00 2001 From: Peter Scott Date: Tue, 1 Nov 2011 08:55:37 -0600 Subject: [PATCH] Windows: DE Reference count added during create A reference count is added under lock to a newly created DE to ensure it is not removed through deletion while in flight. Change-Id: If0955c4a6c4cf197a4e071f9c6022875aabb70bb Reviewed-on: http://gerrit.openafs.org/5775 Tested-by: BuildBot Tested-by: Jeffrey Altman Reviewed-by: Jeffrey Altman --- .../afsrdr/kernel/lib/AFSCommSupport.cpp | 15 ++++++++-- src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp | 30 ++++++++----------- .../afsrdr/kernel/lib/AFSNameSupport.cpp | 18 +++++++++++ 3 files changed, 44 insertions(+), 19 deletions(-) diff --git a/src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp b/src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp index df5ce4bf4..51311ab61 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp @@ -1325,8 +1325,6 @@ AFSNotifyFileCreate( IN GUID *AuthGroup, ulCRC, &pDirNode); - AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock); - if( pDirNode != NULL) { @@ -1335,11 +1333,24 @@ AFSNotifyFileCreate( IN GUID *AuthGroup, "AFSNotifyFileCreate Located dir entry for file %wZ\n", FileName); + InterlockedIncrement( &pDirNode->OpenReferenceCount); + + AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING, + AFS_TRACE_LEVEL_VERBOSE, + "AFSNotifyFileCreate Increment count on %wZ DE %p Cnt %d\n", + &pDirNode->NameInformation.FileName, + pDirNode, + pDirNode->OpenReferenceCount); + *DirNode = pDirNode; + AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock); + try_return( ntStatus = STATUS_REPARSE); } + AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock); + // // We are unsure of our current data so set the verify flag. It may already be set // but no big deal to reset it diff --git a/src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp b/src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp index 0143aed31..bc1358f7e 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp @@ -739,23 +739,6 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject, &pParentDirectoryCB->NameInformation.FileName, ntStatus); } - else - { - - // - // Reference the new dir entry - // - - InterlockedIncrement( &pCcb->DirectoryCB->OpenReferenceCount); - - AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING, - AFS_TRACE_LEVEL_VERBOSE, - "AFSCreate Increment (Create) count on %wZ DE %p Ccb %p Cnt %d\n", - &pCcb->DirectoryCB->NameInformation.FileName, - pCcb->DirectoryCB, - pCcb, - pCcb->DirectoryCB->OpenReferenceCount); - } // // Dereference the parent entry @@ -2069,6 +2052,19 @@ try_exit: SetFlag( pDirEntry->Flags, AFS_DIR_ENTRY_DELETED); + // + // Decrement the reference added during initialization of the DE + // + + InterlockedDecrement( &pDirEntry->OpenReferenceCount); + + AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING, + AFS_TRACE_LEVEL_VERBOSE, + "AFSProcessCreate Decrement count on %wZ DE %p Cnt %d\n", + &pDirEntry->NameInformation.FileName, + pDirEntry, + pDirEntry->OpenReferenceCount); + // // Pull the directory entry from the parent // diff --git a/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp b/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp index 26b6e517d..7e1689008 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp @@ -2060,6 +2060,15 @@ AFSCreateDirEntry( IN GUID *AuthGroup, AFSDeleteDirEntry( ParentObjectInfo, pDirNode); + InterlockedIncrement( &pExistingDirNode->OpenReferenceCount); + + AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING, + AFS_TRACE_LEVEL_VERBOSE, + "AFSCreateDirEntry Increment count on %wZ DE %p Cnt %d\n", + &pExistingDirNode->NameInformation.FileName, + pExistingDirNode, + pExistingDirNode->OpenReferenceCount); + *DirEntry = pExistingDirNode; AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock); @@ -2085,6 +2094,15 @@ AFSCreateDirEntry( IN GUID *AuthGroup, pDirNode, TRUE); + InterlockedIncrement( &pDirNode->OpenReferenceCount); + + AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING, + AFS_TRACE_LEVEL_VERBOSE, + "AFSCreateDirEntry Increment2 count on %wZ DE %p Cnt %d\n", + &pDirNode->NameInformation.FileName, + pDirNode, + pDirNode->OpenReferenceCount); + // // Pass back the dir entry // -- 2.39.5