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);
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;