From: Jeffrey Altman Date: Mon, 25 Feb 2013 05:17:46 +0000 (-0500) Subject: Windows: Test NameArrayReferenceCount before deletion X-Git-Tag: upstream/1.8.0_pre1^2~1437 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=a10e96b3aa631a0488532f88d3959fdf22265d35;p=packages%2Fo%2Fopenafs.git Windows: Test NameArrayReferenceCount before deletion In commit c753d398f2005c886932f20b49af15efc489a829 the AFSDirectoryCB.DirOpenReferenceCount was split and the NameArrayReferenceCount field was added. However, it failed to modify all of the DirOpenReferenceCount checks prior to calling AFSDeleteDirEntry() to include a check on the NameArrayReferenceCount. This patchset corrects that oversight. Change-Id: I8db1a68e5240088bcfeb226bd1eafac0c83a0b69 Reviewed-on: http://gerrit.openafs.org/9254 Tested-by: BuildBot Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman --- diff --git a/src/WINNT/afsrdr/kernel/lib/AFSClose.cpp b/src/WINNT/afsrdr/kernel/lib/AFSClose.cpp index 2cad934c4..e18459cef 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSClose.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSClose.cpp @@ -398,7 +398,8 @@ AFSClose( IN PDEVICE_OBJECT LibDeviceObject, ASSERT( lCount >= 0); - if( lCount == 0) + if( lCount == 0 && + pDirCB->NameArrayReferenceCount <= 0) { AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING, diff --git a/src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp b/src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp index 57186c704..b6f729a8a 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp @@ -347,7 +347,8 @@ AFSEnumerateDirectory( IN GUID *AuthGroup, // Need to tear down this entry and rebuild it below // - if( pDirNode->DirOpenReferenceCount <= 0) + if( pDirNode->DirOpenReferenceCount <= 0 && + pDirNode->NameArrayReferenceCount <= 0) { AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING, @@ -1183,7 +1184,8 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB, // Need to tear down this entry and rebuild it below // - if( pDirNode->DirOpenReferenceCount <= 0) + if( pDirNode->DirOpenReferenceCount <= 0 && + pDirNode->NameArrayReferenceCount <= 0) { AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING, @@ -1713,7 +1715,8 @@ AFSNotifyFileCreate( IN GUID *AuthGroup, pResultCB->DirEnum.FileId.Vnode, pResultCB->DirEnum.FileId.Unique); - if( pDirNode->DirOpenReferenceCount <= 0) + if( pDirNode->DirOpenReferenceCount <= 0 && + pDirNode->NameArrayReferenceCount <= 0) { AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING, @@ -2321,7 +2324,8 @@ AFSNotifyHardLink( IN AFSObjectInfoCB *ObjectInfo, pResultCB->DirEnum.FileId.Vnode, pResultCB->DirEnum.FileId.Unique); - if( pDirNode->DirOpenReferenceCount <= 0) + if( pDirNode->DirOpenReferenceCount <= 0 && + pDirNode->NameArrayReferenceCount <= 0) { AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING, diff --git a/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp b/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp index 114037c62..e4782d3aa 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp @@ -3265,7 +3265,8 @@ AFSSetRenameInfo( IN PIRP Irp) ASSERT( lCount >= 0); - if( lCount == 0) + if( lCount == 0 && + pTargetDirEntry->NameArrayReferenceCount <= 0) { AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING, diff --git a/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp b/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp index 2cf364488..7c31ecf63 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp @@ -3465,7 +3465,8 @@ AFSValidateDirectoryCache( IN AFSObjectInfoCB *ObjectInfo, // if( BooleanFlagOn( pCurrentDirEntry->Flags, AFS_DIR_ENTRY_DELETED) && - pCurrentDirEntry->DirOpenReferenceCount <= 0) + pCurrentDirEntry->DirOpenReferenceCount <= 0 && + pCurrentDirEntry->NameArrayReferenceCount <= 0) { AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING, @@ -3594,7 +3595,8 @@ AFSValidateDirectoryCache( IN AFSObjectInfoCB *ObjectInfo, pCurrentDirEntry, pCurrentDirEntry->DirOpenReferenceCount); - if( pCurrentDirEntry->DirOpenReferenceCount <= 0) + if( pCurrentDirEntry->DirOpenReferenceCount <= 0 && + pCurrentDirEntry->NameArrayReferenceCount <= 0) { AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING, @@ -4717,7 +4719,8 @@ AFSResetDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB) pNextDirEntry = (AFSDirectoryCB *)pCurrentDirEntry->ListEntry.fLink; - if( pCurrentDirEntry->DirOpenReferenceCount <= 0) + if( pCurrentDirEntry->DirOpenReferenceCount <= 0 && + pCurrentDirEntry->NameArrayReferenceCount <= 0) { AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING, diff --git a/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp b/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp index 0e077223a..8581153a5 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp @@ -1914,7 +1914,8 @@ AFSLocateNameEntry( IN GUID *AuthGroup, ASSERT( lCount >= 0); - if( lCount == 0) + if( lCount == 0 && + pDirEntry->NameArrayReferenceCount <= 0) { AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING|AFS_SUBSYSTEM_CLEANUP_PROCESSING, @@ -2445,7 +2446,8 @@ AFSCreateDirEntry( IN GUID *AuthGroup, // Need to tear down this entry and rebuild it below // - if( pExistingDirNode->DirOpenReferenceCount <= 0) + if( pExistingDirNode->DirOpenReferenceCount <= 0 && + pExistingDirNode->NameArrayReferenceCount <= 0) { AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,