From 5a09e6ab2b1913f438eae113f41a7ef9ea92387d Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Sun, 25 Nov 2012 18:06:17 -0500 Subject: [PATCH] Windows: AFSInvalidateCache volume refcounts AFSInvalidateCache failed to release the volume reference count when FileId is the volume root. In the non-root case it released it too early permitting a race with AFSPrimaryVolumeWorkerThread calling AFSRemoveVolume(). Change-Id: I12b756e5a543a2ef791d716f660df1f4a7ae2327 Reviewed-on: http://gerrit.openafs.org/8516 Tested-by: BuildBot Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman --- src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp b/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp index 3a0fde889..94dddb5cc 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp @@ -2000,8 +2000,6 @@ AFSInvalidateCache( IN AFSInvalidateCacheCB *InvalidateCB) ntStatus = AFSInvalidateVolume( pVolumeCB, InvalidateCB->Reason); - lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount); - try_return( ntStatus); } @@ -2016,14 +2014,6 @@ AFSInvalidateCache( IN AFSInvalidateCacheCB *InvalidateCB) else { - lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount); - - AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING, - AFS_TRACE_LEVEL_VERBOSE, - "AFSInvalidateCache Decrement count on volume %08lX Cnt %d\n", - pVolumeCB, - pVolumeCB->VolumeReferenceCount); - ullIndex = AFSCreateLowIndex( &InvalidateCB->FileID); ntStatus = AFSLocateHashEntry( pVolumeCB->ObjectInfoTree.TreeHead, @@ -2081,6 +2071,18 @@ try_exit: pObjectInfo, lCount); } + + if ( pVolumeCB != NULL) + { + + lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount); + + AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING, + AFS_TRACE_LEVEL_VERBOSE, + "AFSInvalidateCache Decrement count on volume %08lX Cnt %d\n", + pVolumeCB, + lCount); + } } return ntStatus; -- 2.39.5