pDirEntry = AFSBackupEntry( pNameArray);
+ pCurrentObject = pDirEntry->ObjectInformation;
+
//
// Increment our reference on this dir entry
//
pDirEntry = pCurrentVolume->DirectoryCB;
+ pCurrentObject = pDirEntry->ObjectInformation;
+
//
// Reference the new dir entry
//
pDirEntry = pCurrentVolume->DirectoryCB;
+ pCurrentObject = pDirEntry->ObjectInformation;
+
lCount = InterlockedIncrement( &pDirEntry->DirOpenReferenceCount);
AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
try_return(ntStatus = STATUS_OBJECT_PATH_INVALID);
}
+ pCurrentObject = pDirEntry->ObjectInformation;
+
lCount = InterlockedIncrement( &pDirEntry->DirOpenReferenceCount);
AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
pDirEntry = NULL;
+ pCurrentObject = NULL;
+
uniSearchName = uniComponentName;
while( pDirEntry == NULL)
AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSLocateNameEntry (FO: %p) Returning path not found for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+ "AFSLocateNameEntry (FO: %p) Returning path not found for %wZ in Parent FID %08lX-%08lX-%08lX-%08lX\n",
FileObject,
&uniSearchName,
- pCurrentObject->FileId.Cell,
- pCurrentObject->FileId.Volume,
- pCurrentObject->FileId.Vnode,
- pCurrentObject->FileId.Unique));
+ pParentDirEntry->ObjectInformation->FileId.Cell,
+ pParentDirEntry->ObjectInformation->FileId.Volume,
+ pParentDirEntry->ObjectInformation->FileId.Vnode,
+ pParentDirEntry->ObjectInformation->FileId.Unique));
}
else
{
AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSLocateNameEntry (FO: %p) Returning name not found for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+ "AFSLocateNameEntry (FO: %p) Returning name not found for %wZ in Parent FID %08lX-%08lX-%08lX-%08lX\n",
FileObject,
&uniSearchName,
- pCurrentObject->FileId.Cell,
- pCurrentObject->FileId.Volume,
- pCurrentObject->FileId.Vnode,
- pCurrentObject->FileId.Unique));
+ pParentDirEntry->ObjectInformation->FileId.Cell,
+ pParentDirEntry->ObjectInformation->FileId.Volume,
+ pParentDirEntry->ObjectInformation->FileId.Vnode,
+ pParentDirEntry->ObjectInformation->FileId.Unique));
//
// Pass back the directory entries
// Is more than one link entry for this node then fail the lookup request
//
+ pCurrentObject = pDirEntry->ObjectInformation;
+
if( !BooleanFlagOn( pDirEntry->Flags, AFS_DIR_ENTRY_CASE_INSENSTIVE_LIST_HEAD) ||
pDirEntry->CaseInsensitiveList.fLink != NULL)
{
// revalidate the parent and search again.
//
+ pCurrentObject = pDirEntry->ObjectInformation;
+
if( BooleanFlagOn( pDirEntry->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED) &&
BooleanFlagOn( pParentDirEntry->ObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY))
{
pDirEntry = NULL;
+ pCurrentObject = NULL;
+
continue;
}
// If we have a dirEntry for this component, perform some basic validation on it
//
- if( pDirEntry != NULL &&
- BooleanFlagOn( pDirEntry->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED))
+ if( pDirEntry != NULL)
{
pCurrentObject = pDirEntry->ObjectInformation;
- AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSLocateNameEntry (FO: %p) Deleted entry %wZ FID %08lX-%08lX-%08lX-%08lX\n",
- FileObject,
- &pDirEntry->NameInformation.FileName,
- pCurrentObject->FileId.Cell,
- pCurrentObject->FileId.Volume,
- pCurrentObject->FileId.Vnode,
- pCurrentObject->FileId.Unique));
-
- //
- // This entry was deleted through the invalidation call back so perform cleanup
- // on the entry
- //
-
- if( BooleanFlagOn( pCurrentObject->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+ if (BooleanFlagOn( pDirEntry->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED))
{
- pParentObjectInfo = AFSFindObjectInfo( pCurrentObject->VolumeCB,
- &pCurrentObject->ParentFileId,
- FALSE);
- }
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSLocateNameEntry (FO: %p) Deleted entry %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+ FileObject,
+ &pDirEntry->NameInformation.FileName,
+ pCurrentObject->FileId.Cell,
+ pCurrentObject->FileId.Volume,
+ pCurrentObject->FileId.Vnode,
+ pCurrentObject->FileId.Unique));
- ASSERT( pParentObjectInfo != NULL);
+ //
+ // This entry was deleted through the invalidation call back so perform cleanup
+ // on the entry
+ //
- AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
- TRUE);
+ if( BooleanFlagOn( pCurrentObject->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+ {
- AFSAcquireExcl( pCurrentObject->VolumeCB->ObjectInfoTree.TreeLock,
- TRUE);
+ pParentObjectInfo = AFSFindObjectInfo( pCurrentObject->VolumeCB,
+ &pCurrentObject->ParentFileId,
+ FALSE);
+ }
- lCount = InterlockedDecrement( &pDirEntry->DirOpenReferenceCount);
+ ASSERT( pParentObjectInfo != NULL);
- AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSLocateNameEntry Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
- &pDirEntry->NameInformation.FileName,
- pDirEntry,
- NULL,
- lCount));
+ AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ TRUE);
- ASSERT( lCount >= 0);
+ AFSAcquireExcl( pCurrentObject->VolumeCB->ObjectInfoTree.TreeLock,
+ TRUE);
- if( lCount == 0 &&
- pDirEntry->NameArrayReferenceCount <= 0)
- {
+ lCount = InterlockedDecrement( &pDirEntry->DirOpenReferenceCount);
- AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING|AFS_SUBSYSTEM_CLEANUP_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSLocateNameEntry Deleting dir entry %p (%p) for %wZ\n",
+ "AFSLocateNameEntry Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
+ &pDirEntry->NameInformation.FileName,
pDirEntry,
- pCurrentObject,
- &pDirEntry->NameInformation.FileName));
+ NULL,
+ lCount));
- //
- // Remove and delete the directory entry from the parent list
- //
+ ASSERT( lCount >= 0);
- AFSDeleteDirEntry( pParentObjectInfo,
- &pDirEntry);
+ if( lCount == 0 &&
+ pDirEntry->NameArrayReferenceCount <= 0)
+ {
- AFSAcquireShared( &pCurrentObject->NonPagedInfo->ObjectInfoLock,
- TRUE);
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING|AFS_SUBSYSTEM_CLEANUP_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSLocateNameEntry Deleting dir entry %p (%p) for %wZ\n",
+ pDirEntry,
+ pCurrentObject,
+ &pDirEntry->NameInformation.FileName));
- if( pCurrentObject->ObjectReferenceCount <= 0)
- {
+ //
+ // Remove and delete the directory entry from the parent list
+ //
+
+ AFSDeleteDirEntry( pParentObjectInfo,
+ &pDirEntry);
- if( BooleanFlagOn( pCurrentObject->Flags, AFS_OBJECT_INSERTED_HASH_TREE))
+ AFSAcquireShared( &pCurrentObject->NonPagedInfo->ObjectInfoLock,
+ TRUE);
+
+ if( pCurrentObject->ObjectReferenceCount <= 0)
{
- AFSDbgTrace(( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSLocateNameEntry Removing object %p from volume tree\n",
- pCurrentObject));
+ if( BooleanFlagOn( pCurrentObject->Flags, AFS_OBJECT_INSERTED_HASH_TREE))
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSLocateNameEntry Removing object %p from volume tree\n",
+ pCurrentObject));
- AFSRemoveHashEntry( &pCurrentObject->VolumeCB->ObjectInfoTree.TreeHead,
- &pCurrentObject->TreeEntry);
+ AFSRemoveHashEntry( &pCurrentObject->VolumeCB->ObjectInfoTree.TreeHead,
+ &pCurrentObject->TreeEntry);
- ClearFlag( pCurrentObject->Flags, AFS_OBJECT_INSERTED_HASH_TREE);
+ ClearFlag( pCurrentObject->Flags, AFS_OBJECT_INSERTED_HASH_TREE);
+ }
}
+
+ AFSReleaseResource( &pCurrentObject->NonPagedInfo->ObjectInfoLock);
}
+ else
+ {
- AFSReleaseResource( &pCurrentObject->NonPagedInfo->ObjectInfoLock);
- }
- else
- {
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSLocateNameEntry Setting DELETE flag in dir entry %p for %wZ\n",
+ pDirEntry,
+ &pDirEntry->NameInformation.FileName));
- AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSLocateNameEntry Setting DELETE flag in dir entry %p for %wZ\n",
- pDirEntry,
- &pDirEntry->NameInformation.FileName));
+ SetFlag( pDirEntry->Flags, AFS_DIR_ENTRY_DELETED);
- SetFlag( pDirEntry->Flags, AFS_DIR_ENTRY_DELETED);
+ AFSRemoveNameEntry( pParentObjectInfo,
+ pDirEntry);
+ }
- AFSRemoveNameEntry( pParentObjectInfo,
- pDirEntry);
- }
+ AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
- AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+ AFSReleaseResource( pCurrentObject->VolumeCB->ObjectInfoTree.TreeLock);
- AFSReleaseResource( pCurrentObject->VolumeCB->ObjectInfoTree.TreeLock);
+ //
+ // We deleted the dir entry so check if there is any remaining portion
+ // of the name to process.
+ //
- AFSReleaseObjectInfo( &pParentObjectInfo);
+ if( uniRemainingPath.Length > 0)
+ {
- //
- // We deleted the dir entry so check if there is any remaining portion
- // of the name to process.
- //
+ ntStatus = STATUS_OBJECT_PATH_NOT_FOUND;
- if( uniRemainingPath.Length > 0)
- {
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSLocateNameEntry (FO: %p) Returning path not found(2) for %wZ in Parent FID %08lX-%08lX-%08lX-%08lX\n",
+ FileObject,
+ &uniComponentName,
+ pParentObjectInfo->FileId.Cell,
+ pParentObjectInfo->FileId.Volume,
+ pParentObjectInfo->FileId.Vnode,
+ pParentObjectInfo->FileId.Unique));
- ntStatus = STATUS_OBJECT_PATH_NOT_FOUND;
+ AFSReleaseObjectInfo( &pParentObjectInfo);
+ }
+ else
+ {
- AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSLocateNameEntry (FO: %p) Returning path not found(2) for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
- FileObject,
- &uniComponentName,
- pCurrentObject->FileId.Cell,
- pCurrentObject->FileId.Volume,
- pCurrentObject->FileId.Vnode,
- pCurrentObject->FileId.Unique));
- }
- else
- {
+ ntStatus = STATUS_OBJECT_NAME_NOT_FOUND;
- ntStatus = STATUS_OBJECT_NAME_NOT_FOUND;
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSLocateNameEntry (FO: %p) Returning name not found(2) for %wZ in Parent FID %08lX-%08lX-%08lX-%08lX\n",
+ FileObject,
+ &uniComponentName,
+ pParentObjectInfo->FileId.Cell,
+ pParentObjectInfo->FileId.Volume,
+ pParentObjectInfo->FileId.Vnode,
+ pParentObjectInfo->FileId.Unique));
- AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSLocateNameEntry (FO: %p) Returning name not found(2) for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
- FileObject,
- &uniComponentName,
- pCurrentObject->FileId.Cell,
- pCurrentObject->FileId.Volume,
- pCurrentObject->FileId.Vnode,
- pCurrentObject->FileId.Unique));
+ AFSReleaseObjectInfo( &pParentObjectInfo);
- //
- // Pass back the directory entries
- //
+ //
+ // Pass back the directory entries
+ //
- *OutParentDirectoryCB = pParentDirEntry;
+ *OutParentDirectoryCB = pParentDirEntry;
- pParentDirEntry = NULL;
+ pParentDirEntry = NULL;
- *OutDirectoryCB = NULL;
+ *OutDirectoryCB = NULL;
- *OutVolumeCB = pCurrentVolume;
+ *OutVolumeCB = pCurrentVolume;
- *OutVolumeReferenceReason = VolumeReferenceReason;
+ *OutVolumeReferenceReason = VolumeReferenceReason;
- bReleaseCurrentVolume = FALSE;
+ bReleaseCurrentVolume = FALSE;
- if( ComponentName != NULL)
- {
+ if( ComponentName != NULL)
+ {
- *ComponentName = uniComponentName;
- }
+ *ComponentName = uniComponentName;
+ }
- *RootPathName = uniFullPathName;
+ *RootPathName = uniFullPathName;
+ }
}
}