From 8827be708460eb1cbd58001d3247ed7bb160ebc8 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Tue, 2 Oct 2012 21:07:21 -0400 Subject: [PATCH] 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 --- src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp | 46 ++++++++++------------- src/WINNT/afsrdr/kernel/lib/AFSWorker.cpp | 30 +++------------ 2 files changed, 25 insertions(+), 51 deletions(-) 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); } -- 2.39.5