From: Jeffrey Altman Date: Wed, 3 Oct 2012 01:07:21 +0000 (-0400) Subject: Windows: Always AFSInitFcb and AFSRemoveFcb X-Git-Tag: upstream/1.8.0_pre1^2~1902 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=8827be708460eb1cbd58001d3247ed7bb160ebc8;p=packages%2Fo%2Fopenafs.git Windows: Always AFSInitFcb and AFSRemoveFcb Instead of comparing ObjectInfo->Fcb to NULL and conditionally calling AFSInitFcb() or AFSRemoveFcb(), always call them and use InterlockedExchangePointer() as the test. Change-Id: I81915dfdfdf180c04ad2b4ff7506784a83ee8c2a Reviewed-on: http://gerrit.openafs.org/8221 Tested-by: BuildBot Reviewed-by: Rod Widdowson Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman --- diff --git a/src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp b/src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp index 8f8d9949b..b860829fc 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp @@ -2642,38 +2642,34 @@ AFSProcessOpen( IN PIRP Irp, // Be sure we have an Fcb for the current object // - if( pObjectInfo->Fcb == NULL) - { + ntStatus = AFSInitFcb( DirectoryCB); - ntStatus = AFSInitFcb( DirectoryCB); + if( !NT_SUCCESS( ntStatus)) + { - if( !NT_SUCCESS( ntStatus)) - { + AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING, + AFS_TRACE_LEVEL_ERROR, + "AFSProcessOpen (%08lX) Failed to init fcb on %wZ Status %08lX\n", + Irp, + &DirectoryCB->NameInformation.FileName, + ntStatus); - AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING, - AFS_TRACE_LEVEL_ERROR, - "AFSProcessOpen (%08lX) Failed to init fcb on %wZ Status %08lX\n", - Irp, - &DirectoryCB->NameInformation.FileName, - ntStatus); + try_return( ntStatus); + } - try_return( ntStatus); - } + if ( ntStatus != STATUS_REPARSE) + { - if ( ntStatus != STATUS_REPARSE) - { + bAllocatedFcb = TRUE; + } - bAllocatedFcb = TRUE; - } + ntStatus = STATUS_SUCCESS; - ntStatus = STATUS_SUCCESS; - } - else - { + // + // AFSInitFcb returns the Fcb resource held + // - AFSAcquireExcl( pObjectInfo->Fcb->Header.Resource, - TRUE); - } + bReleaseFcb = TRUE; // // Increment the open count on this Fcb @@ -2687,8 +2683,6 @@ AFSProcessOpen( IN PIRP Irp, pObjectInfo->Fcb, lCount); - bReleaseFcb = TRUE; - // // Check access on the entry // diff --git a/src/WINNT/afsrdr/kernel/lib/AFSWorker.cpp b/src/WINNT/afsrdr/kernel/lib/AFSWorker.cpp index 5e07af50f..bb075acd7 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSWorker.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSWorker.cpp @@ -1174,20 +1174,12 @@ AFSPrimaryVolumeWorkerThread( IN PVOID Context) if ( pCurrentObject->ObjectReferenceCount <= 0) { - if( pCurrentObject->Fcb != NULL) - { - - AFSRemoveFcb( &pCurrentObject->Fcb); - } + AFSRemoveFcb( &pCurrentObject->Fcb); if( pCurrentObject->Specific.Directory.PIOCtlDirectoryCB != NULL) { - if( pCurrentObject->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb != NULL) - { - - AFSRemoveFcb( &pCurrentObject->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb); - } + AFSRemoveFcb( &pCurrentObject->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb); AFSDeleteObjectInfo( pCurrentObject->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation); @@ -1396,21 +1388,13 @@ AFSPrimaryVolumeWorkerThread( IN PVOID Context) pCurrentChildObject->Fcb->Specific.File.ExtentCount == 0)) { - if( pCurrentChildObject->Fcb != NULL) - { - - AFSRemoveFcb( &pCurrentChildObject->Fcb); - } + AFSRemoveFcb( &pCurrentChildObject->Fcb); if( pCurrentChildObject->FileType == AFS_FILE_TYPE_DIRECTORY && pCurrentChildObject->Specific.Directory.PIOCtlDirectoryCB != NULL) { - if( pCurrentChildObject->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb != NULL) - { - - AFSRemoveFcb( &pCurrentChildObject->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb); - } + AFSRemoveFcb( &pCurrentChildObject->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb); AFSDeleteObjectInfo( pCurrentChildObject->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation); @@ -1543,11 +1527,7 @@ AFSPrimaryVolumeWorkerThread( IN PVOID Context) pCurrentObject->Fcb->Specific.File.ExtentCount == 0)) { - if( pCurrentObject->Fcb != NULL) - { - - AFSRemoveFcb( &pCurrentObject->Fcb); - } + AFSRemoveFcb( &pCurrentObject->Fcb); AFSDeleteObjectInfo( pCurrentObject); }