From: Jeffrey Altman Date: Sat, 29 Dec 2012 21:12:21 +0000 (-0500) Subject: Windows: AFSOpenRoot obtain VolumeRoot OpenReferenceCount earlier X-Git-Tag: openafs-stable-1_8_0pre1~1627 X-Git-Url: https://git.openafs.org/?p=openafs.git;a=commitdiff_plain;h=af3f627e676c5b849b721c75a84a88fc6e54ec52 Windows: AFSOpenRoot obtain VolumeRoot OpenReferenceCount earlier In AFSOpenRoot obtain the VolumeRoot reference count before performing any operations that require use of the VolumeRoot. If the operations fail, release the reference count. Change-Id: I2e5a6574f87db858aa60d812c68f637266db529e Reviewed-on: http://gerrit.openafs.org/8862 Tested-by: Jeffrey Altman Reviewed-by: Jeffrey Altman --- diff --git a/src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp b/src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp index cf6b6f5..faf4f76 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp @@ -1029,7 +1029,7 @@ try_exit: AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING, AFS_TRACE_LEVEL_VERBOSE_2, - "AFSCommonCreate (%p) FileObject %p FsContext %08lX FsContext2 %08lX\n", + "AFSCommonCreate (%p) FileObject %p FsContext %p FsContext2 %p\n", Irp, pFileObject, pFcb, @@ -1104,7 +1104,7 @@ try_exit: AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING, AFS_TRACE_LEVEL_ERROR, - "AFSCommonCreate (%p) Returning with NULL Fcb FileObject %p FsContext %08lX FsContext2 %08lX\n", + "AFSCommonCreate (%p) Returning with NULL Fcb FileObject %p FsContext %p FsContext2 %p\n", Irp, pFileObject, pFcb, @@ -1119,7 +1119,7 @@ try_exit: AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING, AFS_TRACE_LEVEL_ERROR, - "AFSCommonCreate (%p) STATUS_REPARSE FileObject %p FsContext %08lX FsContext2 %08lX\n", + "AFSCommonCreate (%p) STATUS_REPARSE FileObject %p FsContext %p FsContext2 %p\n", Irp, pFileObject, pFcb, @@ -1468,6 +1468,14 @@ AFSOpenRoot( IN PIRP Irp, TRUE); } + lCount = InterlockedIncrement( &VolumeCB->RootFcb->OpenReferenceCount); + + AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING, + AFS_TRACE_LEVEL_VERBOSE, + "AFSOpenRoot Increment count on Fcb %p Cnt %d\n", + VolumeCB->RootFcb, + lCount); + bReleaseFcb = TRUE; // @@ -1546,14 +1554,6 @@ AFSOpenRoot( IN PIRP Irp, // Increment the open count on this Fcb // - lCount = InterlockedIncrement( &VolumeCB->RootFcb->OpenReferenceCount); - - AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING, - AFS_TRACE_LEVEL_VERBOSE, - "AFSOpenRoot Increment count on Fcb %p Cnt %d\n", - VolumeCB->RootFcb, - lCount); - lCount = InterlockedIncrement( &VolumeCB->RootFcb->OpenHandleCount); AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING, @@ -1580,6 +1580,17 @@ try_exit: if( bReleaseFcb) { + if ( !NT_SUCCESS( ntStatus)) + { + + lCount = InterlockedDecrement( &VolumeCB->RootFcb->OpenReferenceCount); + + AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING, + AFS_TRACE_LEVEL_VERBOSE, + "AFSOpenRoot Decrement count on Fcb %p Cnt %d\n", + VolumeCB->RootFcb, + lCount); + } AFSReleaseResource( VolumeCB->RootFcb->Header.Resource); }