// Perform a new snapshot of the directory
//
+ AFSAcquireExcl( &pCcb->NPCcb->CcbLock,
+ TRUE);
+
ntStatus = AFSSnapshotDirectory( pFcb,
pCcb,
FALSE);
+ AFSReleaseResource( &pCcb->NPCcb->CcbLock);
+
if( !NT_SUCCESS( ntStatus))
{
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
+ AFSAcquireExcl( &pCcb->NPCcb->CcbLock,
+ TRUE);
+
// Check if initial on this map
if( bInitialQuery)
{
if( !NT_SUCCESS( ntStatus))
{
+ AFSReleaseResource( &pCcb->NPCcb->CcbLock);
+
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSQueryDirectory Snapshot directory failure for parent %wZ Mask %wZ Status %08lX\n",
if( pFcb->ObjectInformation->Specific.Directory.PIOCtlDirectoryCB == NULL)
{
+ AFSReleaseResource( &pCcb->NPCcb->CcbLock);
+
AFSReleaseResource( pFcb->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
bReleaseMain = FALSE;
bReleaseMain = TRUE;
AFSReleaseResource( &pFcb->NPFcb->Resource);
+
+ AFSAcquireExcl( &pCcb->NPCcb->CcbLock,
+ TRUE);
}
}
}
}
+ AFSReleaseResource( &pCcb->NPCcb->CcbLock);
+
+ AFSReleaseResource( pFcb->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
+
+ bReleaseMain = FALSE;
+
switch( FileInformationClass)
{
try_return( ntStatus = STATUS_INVALID_INFO_CLASS);
}
- AFSReleaseResource( pFcb->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
-
- bReleaseMain = FALSE;
-
while( TRUE)
{
__Enter
{
+ AFSAcquireShared( ObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ TRUE);
+
+ AFSAcquireExcl( &Ccb->NPCcb->CcbLock,
+ TRUE);
+
//
// Is this a PIOCtl query
//
// Get to a valid entry
//
- AFSAcquireShared( ObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
- TRUE);
-
while( ulCount < pSnapshotHdr->EntryCount)
{
Ccb->CurrentDirIndex++;
}
-
- AFSReleaseResource( ObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
}
try_exit:
- NOTHING;
+ AFSReleaseResource( &Ccb->NPCcb->CcbLock);
+
+ AFSReleaseResource( ObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
}
return pDirEntry;
__Enter
{
+ AFSAcquireExcl( &Ccb->NPCcb->CcbLock,
+ TRUE);
+
Ccb->CurrentDirIndex = DirIndex;
if( DirIndex == (ULONG)AFS_DIR_ENTRY_DOT_INDEX)
try_exit:
- NOTHING;
+ AFSReleaseResource( &Ccb->NPCcb->CcbLock);
}
return pDirEntry;
__Enter
{
+ AFSAcquireExcl( &Ccb->NPCcb->CcbLock,
+ TRUE);
+
//
// Build a dir name based on the FID of the file
//
Ccb->NotifyMask.Buffer = NULL;
}
}
+
+ AFSReleaseResource( &Ccb->NPCcb->CcbLock);
}
return ntStatus;
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;