if( bAllocatedFcb)
{
- AFSRemoveFcb( pObjectInfo->Fcb);
-
- pObjectInfo->Fcb = NULL;
+ AFSRemoveFcb( &pObjectInfo->Fcb);
}
*Fcb = NULL;
if( bAllocatedFcb)
{
- AFSRemoveFcb( pParentObject->Fcb);
-
- pParentObject->Fcb = NULL;
+ AFSRemoveFcb( &pParentObject->Fcb);
}
*Fcb = NULL;
if( bAllocatedFcb)
{
- AFSRemoveFcb( pObjectInfo->Fcb);
-
- pObjectInfo->Fcb = NULL;
+ AFSRemoveFcb( &pObjectInfo->Fcb);
}
*Fcb = NULL;
if( bAllocatedFcb)
{
- AFSRemoveFcb( pObjectInfo->Fcb);
-
- pObjectInfo->Fcb = NULL;
+ AFSRemoveFcb( &pObjectInfo->Fcb);
}
*Fcb = NULL;
AFSRemoveCcb( NULL,
*Ccb);
-
- *Ccb = NULL;
}
+ *Ccb = NULL;
+
if( bAllocatedFcb)
{
// Need to tear down this Fcb since it is not in the tree for the worker thread
//
- AFSRemoveFcb( *Fcb);
-
- pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb = NULL;
+ AFSRemoveFcb( &pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb);
}
*Fcb = NULL;
-
- *Ccb = NULL;
}
}
AFSRemoveCcb( NULL,
*Ccb);
-
- *Ccb = NULL;
}
+ *Ccb = NULL;
+
if( bAllocateFcb)
{
// Need to tear down this Fcb since it is not in the tree for the worker thread
//
- AFSRemoveFcb( *Fcb);
-
- DirectoryCB->ObjectInformation->Fcb = NULL;
+ AFSRemoveFcb( &DirectoryCB->ObjectInformation->Fcb);
}
*Fcb = NULL;
-
- *Ccb = NULL;
}
}
if( VolumeCB->ObjectInformation.Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb != NULL)
{
- AFSRemoveFcb( VolumeCB->ObjectInformation.Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb);
+ AFSRemoveFcb( &VolumeCB->ObjectInformation.Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb);
}
AFSDeleteObjectInfo( VolumeCB->ObjectInformation.Specific.Directory.PIOCtlDirectoryCB->ObjectInformation);
//
void
-AFSRemoveFcb( IN AFSFcb *Fcb)
+AFSRemoveFcb( IN AFSFcb **ppFcb)
{
+ AFSFcb * pFcb;
+
+ pFcb = (AFSFcb *) InterlockedCompareExchangePointer( (PVOID *)ppFcb, NULL, (PVOID)(*ppFcb));
+
+ if ( pFcb == NULL)
+ {
+
+ return;
+ }
+
//
// Uninitialize the file lock if it is a file
//
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSRemoveFcb Removing Fcb %08lX\n",
- Fcb);
+ pFcb);
- if( Fcb->Header.NodeTypeCode == AFS_FILE_FCB)
+ if( pFcb->Header.NodeTypeCode == AFS_FILE_FCB)
{
- FsRtlUninitializeFileLock( &Fcb->Specific.File.FileLock);
+ FsRtlUninitializeFileLock( &pFcb->Specific.File.FileLock);
//
// The resource we allocated
//
- ExDeleteResourceLite( &Fcb->NPFcb->Specific.File.ExtentsResource );
+ ExDeleteResourceLite( &pFcb->NPFcb->Specific.File.ExtentsResource );
- ExDeleteResourceLite( &Fcb->NPFcb->Specific.File.DirtyExtentsListLock);
+ ExDeleteResourceLite( &pFcb->NPFcb->Specific.File.DirtyExtentsListLock);
}
- else if( Fcb->Header.NodeTypeCode == AFS_DIRECTORY_FCB)
+ else if( pFcb->Header.NodeTypeCode == AFS_DIRECTORY_FCB)
{
// Tear down the FM specific contexts
//
- FsRtlTeardownPerStreamContexts( &Fcb->Header);
+ FsRtlTeardownPerStreamContexts( &pFcb->Header);
//
// Delete the resources
//
- ExDeleteResourceLite( &Fcb->NPFcb->Resource);
+ ExDeleteResourceLite( &pFcb->NPFcb->Resource);
- ExDeleteResourceLite( &Fcb->NPFcb->PagingResource);
+ ExDeleteResourceLite( &pFcb->NPFcb->PagingResource);
- ExDeleteResourceLite( &Fcb->NPFcb->CcbListLock);
+ ExDeleteResourceLite( &pFcb->NPFcb->CcbListLock);
//
// The non paged region
//
- AFSExFreePool( Fcb->NPFcb);
+ AFSExFreePool( pFcb->NPFcb);
//
// And the Fcb itself, which includes the name
//
- AFSExFreePool( Fcb);
+ AFSExFreePool( pFcb);
return;
}
continue;
}
- if( pVolumeCB->ObjectInfoListHead == NULL &&
- pVolumeCB != AFSGlobalRoot)
+ if( pVolumeCB->ObjectInfoListHead == NULL)
{
AFSReleaseResource( pVolumeCB->VolumeLock);
AFSReleaseResource( &pCurrentObject->Fcb->NPFcb->Resource);
- 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);
AFSReleaseResource( &pCurrentChildObject->Fcb->NPFcb->Resource);
- AFSRemoveFcb( pCurrentChildObject->Fcb);
+ AFSRemoveFcb( &pCurrentChildObject->Fcb);
}
if( pCurrentChildObject->FileType == AFS_FILE_TYPE_DIRECTORY &&
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);
AFSReleaseResource( &pCurrentObject->Fcb->NPFcb->Resource);
- AFSRemoveFcb( pCurrentObject->Fcb);
+ AFSRemoveFcb( &pCurrentObject->Fcb);
}
AFSDeleteObjectInfo( pCurrentObject);
AFSInitCcb( IN OUT AFSCcb **Ccb);
void
-AFSRemoveFcb( IN AFSFcb *Fcb);
+AFSRemoveFcb( IN AFSFcb **Fcb);
NTSTATUS
AFSRemoveCcb( IN AFSFcb *Fcb,