From: Jeffrey Altman Date: Sun, 25 Nov 2012 23:06:17 +0000 (-0500) Subject: Windows: AFSInvalidateCache volume refcounts X-Git-Tag: openafs-stable-1_8_0pre1~1772 X-Git-Url: https://git.openafs.org/?p=openafs.git;a=commitdiff_plain;h=5a09e6ab2b1913f438eae113f41a7ef9ea92387d 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 --- diff --git a/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp b/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp index 3a0fde8..94dddb5 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;