From: Jeffrey Altman Date: Tue, 2 Apr 2013 04:40:54 +0000 (-0400) Subject: Windows: FindObjectInfo refcnt under lock X-Git-Tag: upstream/1.8.0_pre1^2~1243 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=9285cc3d5270306377ef3d6f90468129a8cfd376;p=packages%2Fo%2Fopenafs.git Windows: FindObjectInfo refcnt under lock AFSFindObjectInfo performed the search of Volume object tree protected by the TreeLock but dropped the lock before incrementing the reference count. This behavior contributed to a race with the AFSPrimaryVolumeWorkerThread which has to drop the VolumeCB TreeLock periodically in order to safely cleanup FCBs. Change-Id: I0cba4a118e4835edee7702db97846567618e0adf Reviewed-on: http://gerrit.openafs.org/9719 Reviewed-by: Peter Scott Tested-by: BuildBot Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman --- diff --git a/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp b/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp index 3e85ec239..060b3bbf6 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp @@ -6179,6 +6179,11 @@ AFSFindObjectInfo( IN AFSVolumeCB *VolumeCB, AFSObjectInfoCB *pObjectInfo = NULL; LONG lCount; + ullIndex = AFSCreateLowIndex( FileId); + + AFSAcquireShared( VolumeCB->ObjectInfoTree.TreeLock, + TRUE); + if ( AFSIsEqualFID( &VolumeCB->ObjectInformation.FileId, FileId)) { @@ -6187,16 +6192,9 @@ AFSFindObjectInfo( IN AFSVolumeCB *VolumeCB, 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)) { @@ -6211,6 +6209,8 @@ AFSFindObjectInfo( IN AFSVolumeCB *VolumeCB, lCount)); } + AFSReleaseResource( VolumeCB->ObjectInfoTree.TreeLock); + return pObjectInfo; }