From a10e96b3aa631a0488532f88d3959fdf22265d35 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Mon, 25 Feb 2013 00:17:46 -0500 Subject: [PATCH] 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 --- src/WINNT/afsrdr/kernel/lib/AFSClose.cpp | 3 ++- src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp | 12 ++++++++---- src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp | 3 ++- src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp | 9 ++++++--- src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp | 6 ++++-- 5 files changed, 22 insertions(+), 11 deletions(-) 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, -- 2.39.5