AFSFcb *pFcb = NULL;
AFSNonPagedFcb *pNPFcb = NULL;
IO_STATUS_BLOCK stIoSb = {0,0};
- BOOLEAN bUninitFileLock = FALSE;
USHORT usFcbLength = 0;
ULONGLONG ullIndex = 0;
AFSDirEnumEntry *pDirEnumCB = NULL;
//
pFcb->Header.NodeTypeCode = AFS_DIRECTORY_FCB;
-
- //
- // Initialize enumeration information
- //
-
- KeInitializeEvent( &pFcb->NPFcb->Specific.Directory.DirectoryEnumEvent,
- NotificationEvent,
- FALSE);
}
else if( pObjectInfo->FileType == AFS_FILE_TYPE_FILE)
{
NULL,
NULL);
- bUninitFileLock = TRUE;
-
//
// Initialize the header file sizes to our dir entry information
//
if( pFcb != NULL)
{
- if( bUninitFileLock)
- {
-
- FsRtlUninitializeFileLock( &pFcb->Specific.File.FileLock);
- }
-
if( pNPFcb != NULL)
{
AFSReleaseResource( &pNPFcb->Resource);
+ FsRtlTeardownPerStreamContexts( &pFcb->Header);
+
+ if ( pObjectInfo->FileType == AFS_FILE_TYPE_FILE)
+ {
+
+ FsRtlUninitializeFileLock( &pFcb->Specific.File.FileLock);
+
+ ExDeleteResourceLite( &pNPFcb->Specific.File.ExtentsResource);
+
+ ExDeleteResourceLite( &pNPFcb->Specific.File.DirtyExtentsListLock);
+ }
+
ExDeleteResourceLite( &pNPFcb->PagingResource);
ExDeleteResourceLite( &pNPFcb->CcbListLock);
ExDeleteResourceLite( &pNPFcb->Resource);
+
+ AFSExFreePool( pNPFcb);
}
AFSExFreePool( pFcb);
}
-
- if( pNPFcb != NULL)
- {
-
- AFSExFreePool( pNPFcb);
- }
}
}
AFSAcquireExcl( pVolumeCB->VolumeLock,
TRUE);
- lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
-
*VolumeCB = pVolumeCB;
try_return( ntStatus);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInitVolume Initializing count (1) on volume %08lX\n",
+ "AFSInitVolume Initializing count (2) on volume %08lX\n",
pVolumeCB);
- pVolumeCB->VolumeReferenceCount = 1;
+ pVolumeCB->VolumeReferenceCount = 2;
AFSAcquireExcl( pVolumeCB->VolumeLock,
TRUE);
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);
pFcb->NPFcb = pNPFcb;
//
- // Initialize enumeration information
- //
-
- KeInitializeEvent( &pFcb->NPFcb->Specific.Directory.DirectoryEnumEvent,
- NotificationEvent,
- FALSE);
-
- //
// Save the root Fcb in the VolumeCB
//
//
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;
}
sizeof( AFSCcb));
pCcb->Size = sizeof( AFSCcb);
+
pCcb->Type = AFS_CCB;
+ pCcb->NPCcb = (AFSNonPagedCcb *)AFSExAllocatePoolWithTag( NonPagedPool,
+ sizeof( AFSNonPagedCcb),
+ AFS_CCB_NP_ALLOCATION_TAG);
+
+ if( pCcb->NPCcb == NULL)
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSInitCcb Failed to allocate NPCcb\n");
+
+ try_return( Status = STATUS_INSUFFICIENT_RESOURCES);
+ }
+
+ ExInitializeResourceLite( &pCcb->NPCcb->CcbLock);
+
//
// Return the Ccb
//
if( pCcb != NULL)
{
+ if ( pCcb->NPCcb != NULL)
+ {
+
+ AFSExFreePool( pCcb->NPCcb);
+ }
+
AFSExFreePool( pCcb);
}
NTSTATUS ntStatus = STATUS_SUCCESS;
+ AFSAcquireExcl( &Ccb->NPCcb->CcbLock,
+ TRUE);
+
if( Fcb != NULL &&
BooleanFlagOn( Ccb->Flags, CCB_FLAG_INSERTED_CCB_LIST))
{
AFSExFreePool( Ccb->NotifyMask.Buffer);
}
+ AFSReleaseResource( &Ccb->NPCcb->CcbLock);
+
//
// Free up the Ccb
//
+ ExDeleteResourceLite( &Ccb->NPCcb->CcbLock);
+
+ AFSExFreePool( Ccb->NPCcb);
+
AFSExFreePool( Ccb);
return ntStatus;
AFSAcquireExcl( &Fcb->NPFcb->CcbListLock,
TRUE);
+ AFSAcquireExcl( &Ccb->NPCcb->CcbLock,
+ TRUE);
+
if( Fcb->CcbListHead == NULL)
{
Fcb->CcbListHead = Ccb;
SetFlag( Ccb->Flags, CCB_FLAG_INSERTED_CCB_LIST);
+ AFSReleaseResource( &Ccb->NPCcb->CcbLock);
+
AFSReleaseResource( &Fcb->NPFcb->CcbListLock);
return ntStatus;