ASSERT( ExIsResourceAcquiredExclusiveLite( ObjectInfoCB->Specific.Directory.DirectoryNodeHdr.TreeLock));
+ if( BooleanFlagOn( ObjectInfoCB->Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
+ {
+
+ try_return( ntStatus = STATUS_SUCCESS);
+ }
+
uniGUID.Length = 0;
uniGUID.MaximumLength = 0;
uniGUID.Buffer = NULL;
// Need to tear down this entry and rebuild it below
//
- if( pDirNode->DirOpenReferenceCount <= 0)
+ if( pDirNode->DirOpenReferenceCount <= 0 &&
+ pDirNode->NameArrayReferenceCount <= 0)
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFSExFreePoolWithTag( pBuffer, AFS_DIR_BUFFER_TAG);
}
- //
- // If the processing failed then we should reset the directory content in the event
- // it is re-enumerated
- //
+ if ( NT_SUCCESS( ntStatus))
+ {
- if( !NT_SUCCESS( ntStatus))
+ SetFlag( ObjectInfoCB->Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED);
+ }
+ else
{
+ //
+ // If the processing failed then we should reset the directory
+ // content in the event it is re-enumerated
+ //
+
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSEnumerateDirectory Resetting content for FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
// Need to tear down this entry and rebuild it below
//
- if( pDirNode->DirOpenReferenceCount <= 0)
+ if( pDirNode->DirOpenReferenceCount <= 0 &&
+ pDirNode->NameArrayReferenceCount <= 0)
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
pResultCB->DirEnum.FileId.Vnode,
pResultCB->DirEnum.FileId.Unique);
- if( pDirNode->DirOpenReferenceCount <= 0)
+ if( pDirNode->DirOpenReferenceCount <= 0 &&
+ pDirNode->NameArrayReferenceCount <= 0)
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
pResultCB->DirEnum.FileId.Vnode,
pResultCB->DirEnum.FileId.Unique);
- if( pDirNode->DirOpenReferenceCount <= 0)
+ if( pDirNode->DirOpenReferenceCount <= 0 &&
+ pDirNode->NameArrayReferenceCount <= 0)
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFSEvaluateTargetByName( IN GUID *AuthGroup,
IN AFSObjectInfoCB *ParentObjectInfo,
IN PUNICODE_STRING SourceName,
+ IN ULONG Flags,
OUT AFSDirEnumEntry **DirEnumEntry)
{
ulResultBufferLength = PAGE_SIZE;
ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_EVAL_TARGET_BY_NAME,
- AFS_REQUEST_FLAG_SYNCHRONOUS,
+ AFS_REQUEST_FLAG_SYNCHRONOUS | Flags,
AuthGroup,
SourceName,
NULL,