pCurrentObject->FileId.Volume,
pCurrentObject->FileId.Vnode,
pCurrentObject->FileId.Unique,
- ntStatus);
+ STATUS_FILE_DELETED);
try_return( ntStatus = STATUS_FILE_DELETED);
}
pCurrentObject->FileId.Volume,
pCurrentObject->FileId.Vnode,
pCurrentObject->FileId.Unique,
- ntStatus);
+ STATUS_DELETE_PENDING);
try_return( ntStatus = STATUS_DELETE_PENDING);
}
if( pDirEntry->NameInformation.TargetName.Length == 0)
{
- ntStatus = STATUS_ACCESS_DENIED;
+ ntStatus = STATUS_REPARSE_POINT_NOT_RESOLVED;
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
pCurrentVolume,
pCurrentVolume->VolumeReferenceCount);
- AFSReleaseResource( pCurrentVolume->VolumeLock);
-
pCurrentVolume = AFSGlobalRoot;
- AFSAcquireShared( pCurrentVolume->VolumeLock,
- TRUE);
-
InterlockedIncrement( &pCurrentVolume->VolumeReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
pCurrentVolume,
pCurrentVolume->VolumeReferenceCount);
- AFSReleaseResource( pCurrentVolume->VolumeLock);
-
ntStatus = AFSBuildMountPointTarget( AuthGroup,
pDirEntry,
&pCurrentVolume);
bReleaseCurrentVolume = FALSE;
- try_return( ntStatus = STATUS_ACCESS_DENIED);
+ try_return( ntStatus);
}
ASSERT( pCurrentVolume->VolumeReferenceCount > 1);
- ASSERT( ExIsResourceAcquiredLite( pCurrentVolume->VolumeLock));
-
//
// Replace the current name for the mp with the volume root of the target
//
ntStatus = AFSProcessDFSLink( pDirEntry,
FileObject,
- &uniRemainingPath);
+ &uniRemainingPath,
+ AuthGroup);
}
else
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSLocateNameEntry (FO: %08lX) Deleted parent %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+ "AFSLocateNameEntry (FO: %08lX) Deleted entry %wZ FID %08lX-%08lX-%08lX-%08lX\n",
FileObject,
&pDirEntry->NameInformation.FileName,
pCurrentObject->FileId.Cell,
if( InterlockedDecrement( &pDirEntry->OpenReferenceCount) == 0)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING|AFS_SUBSYSTEM_CLEANUP_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSLocateNameEntry Deleting dir entry %08lX (%08lX) for %wZ\n",
pDirEntry,
ASSERT( pCurrentVolume->VolumeReferenceCount > 1);
- ASSERT( ExIsResourceAcquiredLite( pCurrentVolume->VolumeLock));
-
InterlockedDecrement( &pCurrentVolume->VolumeReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
"AFSLocateNameEntry Decrement3 count on volume %08lX Cnt %d\n",
pCurrentVolume,
pCurrentVolume->VolumeReferenceCount);
-
- AFSReleaseResource( pCurrentVolume->VolumeLock);
}
if( RootPathName->Buffer != uniFullPathName.Buffer)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSDirectoryCB *pDirNode = NULL;
+ AFSDirectoryCB *pDirNode = NULL, *pExistingDirNode = NULL;
UNICODE_STRING uniShortName;
LARGE_INTEGER liFileSize = {0,0};
try_return( ntStatus);
}
+ AFSAcquireExcl( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ TRUE);
+
+ //
+ // Before attempting to insert the new entry, check if we need to validate the parent
+ //
+
+ if( BooleanFlagOn( ParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY))
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCreateDirEntry Verifying parent %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+ &ParentDirCB->NameInformation.FileName,
+ ParentObjectInfo->FileId.Cell,
+ ParentObjectInfo->FileId.Volume,
+ ParentObjectInfo->FileId.Vnode,
+ ParentObjectInfo->FileId.Unique);
+
+ ntStatus = AFSVerifyEntry( AuthGroup,
+ ParentDirCB);
+
+ if( !NT_SUCCESS( ntStatus))
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSCreateDirEntry Failed to verify parent %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+ &ParentDirCB->NameInformation.FileName,
+ ParentObjectInfo->FileId.Cell,
+ ParentObjectInfo->FileId.Volume,
+ ParentObjectInfo->FileId.Vnode,
+ ParentObjectInfo->FileId.Unique,
+ ntStatus);
+
+ AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+
+ try_return( ntStatus);
+ }
+ }
+
+ //
+ // Check for the entry in the event we raced with some other thread
+ //
+
+ AFSLocateCaseSensitiveDirEntry( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.CaseSensitiveTreeHead,
+ (ULONG)pDirNode->CaseSensitiveTreeEntry.HashIndex,
+ &pExistingDirNode);
+
+ if( pExistingDirNode != NULL)
+ {
+
+ AFSDeleteDirEntry( ParentObjectInfo,
+ pDirNode);
+
+ InterlockedIncrement( &pExistingDirNode->OpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCreateDirEntry Increment count on %wZ DE %p Cnt %d\n",
+ &pExistingDirNode->NameInformation.FileName,
+ pExistingDirNode,
+ pExistingDirNode->OpenReferenceCount);
+
+ *DirEntry = pExistingDirNode;
+
+ AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+
+ try_return( ntStatus = STATUS_SUCCESS);
+ }
+
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE_2,
"AFSCreateDirEntry Inserting dir entry in parent %wZ FID %08lX-%08lX-%08lX-%08lX Component %wZ\n",
pDirNode,
TRUE);
+ InterlockedIncrement( &pDirNode->OpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCreateDirEntry Increment2 count on %wZ DE %p Cnt %d\n",
+ &pDirNode->NameInformation.FileName,
+ pDirNode,
+ pDirNode->OpenReferenceCount);
+
//
// Pass back the dir entry
//
*DirEntry = pDirNode;
+ AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+
try_exit:
NOTHING;
__Enter
{
- AFSAcquireExcl( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
- TRUE);
+ ASSERT( ExIsResourceAcquiredExclusiveLite( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock));
//
// Insert the node into the directory node tree
//
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInsertDirectoryNode Insert DE %p for %wZ Clearing NOT_IN flag\n",
+ DirEntry,
+ &DirEntry->NameInformation.FileName);
+
ClearFlag( DirEntry->Flags, AFS_DIR_ENTRY_NOT_IN_PARENT_TREE);
if( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.CaseSensitiveTreeHead == NULL)
{
ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.CaseSensitiveTreeHead = DirEntry;
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInsertDirectoryNode Insert DE %p to head of case sensitive tree for %wZ\n",
+ DirEntry,
+ &DirEntry->NameInformation.FileName);
}
else
{
AFSInsertCaseSensitiveDirEntry( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.CaseSensitiveTreeHead,
DirEntry);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInsertDirectoryNode Insert DE %p to case sensitive tree for %wZ\n",
+ DirEntry,
+ &DirEntry->NameInformation.FileName);
}
if( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.CaseInsensitiveTreeHead == NULL)
ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.CaseInsensitiveTreeHead = DirEntry;
SetFlag( DirEntry->Flags, AFS_DIR_ENTRY_CASE_INSENSTIVE_LIST_HEAD);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInsertDirectoryNode Insert DE %p to head of case insensitive tree for %wZ\n",
+ DirEntry,
+ &DirEntry->NameInformation.FileName);
}
else
{
AFSInsertCaseInsensitiveDirEntry( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.CaseInsensitiveTreeHead,
DirEntry);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInsertDirectoryNode Insert DE %p to case insensitive tree for %wZ\n",
+ DirEntry,
+ &DirEntry->NameInformation.FileName);
}
//
{
ParentObjectInfo->Specific.Directory.ShortNameTree = DirEntry;
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInsertDirectoryNode Insert DE %p to head of shortname tree for %wZ\n",
+ DirEntry,
+ &DirEntry->NameInformation.FileName);
+
+ SetFlag( DirEntry->Flags, AFS_DIR_ENTRY_INSERTED_SHORT_NAME);
}
else
{
- AFSInsertShortNameDirEntry( ParentObjectInfo->Specific.Directory.ShortNameTree,
- DirEntry);
+ if( !NT_SUCCESS( AFSInsertShortNameDirEntry( ParentObjectInfo->Specific.Directory.ShortNameTree,
+ DirEntry)))
+ {
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInsertDirectoryNode Failed to insert DE %p to shortname tree for %wZ\n",
+ DirEntry,
+ &DirEntry->NameInformation.FileName);
+ }
+ else
+ {
+ SetFlag( DirEntry->Flags, AFS_DIR_ENTRY_INSERTED_SHORT_NAME);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInsertDirectoryNode Insert DE %p to shortname tree for %wZ\n",
+ DirEntry,
+ &DirEntry->NameInformation.FileName);
+ }
}
}
ParentObjectInfo->FileId.Vnode,
ParentObjectInfo->FileId.Unique);
}
-
- AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
}
return;
ASSERT( DirEntry->ObjectInformation->ObjectReferenceCount > 0);
- InterlockedDecrement( &DirEntry->ObjectInformation->ObjectReferenceCount);
+ if( InterlockedDecrement( &DirEntry->ObjectInformation->ObjectReferenceCount) == 0)
+ {
+ SetFlag( DirEntry->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED);
+ }
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
if( !BooleanFlagOn( DirEntry->Flags, AFS_DIR_ENTRY_NOT_IN_PARENT_TREE))
{
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSRemoveDirNodeFromParent Removing DirEntry %08lX name %wZ\n",
+ DirEntry,
+ &DirEntry->NameInformation.FileName);
+
AFSRemoveNameEntry( ParentObjectInfo,
DirEntry);
}
+ else
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSRemoveDirNodeFromParent DE %p for %wZ NOT removing entry due to flag set\n",
+ DirEntry,
+ &DirEntry->NameInformation.FileName);
+
+ }
if( RemoveFromEnumList &&
BooleanFlagOn( DirEntry->Flags, AFS_DIR_ENTRY_INSERTED_ENUM_LIST))
*FileName = pIrpSp->FileObject->FileName;
//
- // Grab the root node exclusive before returning
+ // Grab the root node while checking state
//
- AFSAcquireExcl( pVolumeCB->VolumeLock,
- TRUE);
+ AFSAcquireShared( pVolumeCB->VolumeLock,
+ TRUE);
if( BooleanFlagOn( pVolumeCB->ObjectInformation.Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID) ||
BooleanFlagOn( pVolumeCB->Flags, AFS_VOLUME_FLAGS_OFFLINE))
}
}
- AFSConvertToShared( pVolumeCB->VolumeLock);
+ AFSReleaseResource( pVolumeCB->VolumeLock);
if( BooleanFlagOn( pDirEntry->ObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY))
{
pDirEntry->ObjectInformation->FileId.Unique,
ntStatus);
- AFSReleaseResource( pVolumeCB->VolumeLock);
-
try_return( ntStatus);
}
}
"AFSParseName (%08lX) Failed to allocate full name buffer\n",
Irp);
- AFSReleaseResource( pVolumeCB->VolumeLock);
-
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
AFSExFreePool( uniFullName.Buffer);
- AFSReleaseResource( pVolumeCB->VolumeLock);
-
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
AFSExFreePool( uniFullName.Buffer);
- AFSReleaseResource( pVolumeCB->VolumeLock);
-
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
AFSExFreePool( uniFullName.Buffer);
- AFSReleaseResource( pVolumeCB->VolumeLock);
-
try_return( ntStatus);
}
// Be sure we are online and ready to go
//
- AFSAcquireExcl( AFSGlobalRoot->VolumeLock,
- TRUE);
+ AFSAcquireShared( AFSGlobalRoot->VolumeLock,
+ TRUE);
if( BooleanFlagOn( AFSGlobalRoot->ObjectInformation.Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID) ||
BooleanFlagOn( AFSGlobalRoot->Flags, AFS_VOLUME_FLAGS_OFFLINE))
}
}
+ AFSReleaseResource( AFSGlobalRoot->VolumeLock);
+
if( !BooleanFlagOn( AFSGlobalRoot->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
{
Irp,
ntStatus);
- AFSReleaseResource( AFSGlobalRoot->VolumeLock);
-
try_return( ntStatus);
}
}
NULL,
AFSGlobalRoot->DirectoryCB->OpenReferenceCount);
- AFSReleaseResource( AFSGlobalRoot->VolumeLock);
-
*VolumeCB = NULL;
FileName->Length = 0;
NULL,
AFSGlobalRoot->DirectoryCB->OpenReferenceCount);
- AFSReleaseResource( AFSGlobalRoot->VolumeLock);
-
*VolumeCB = NULL;
FileName->Length = 0;
NULL,
AFSGlobalRoot->DirectoryCB->OpenReferenceCount);
- AFSReleaseResource( AFSGlobalRoot->VolumeLock);
-
ClearFlag( *ParseFlags, AFS_PARSE_FLAG_ROOT_ACCESS);
*VolumeCB = NULL;
Irp,
&uniComponentName);
- AFSReleaseResource( AFSGlobalRoot->VolumeLock);
-
//
// Add in the full share name to pass back
//
if( !NT_SUCCESS( ntStatus))
{
- AFSReleaseResource( AFSGlobalRoot->VolumeLock);
if ( bIsAllShare &&
uniRemainingPath.Length == 0 &&
}
//
- // We only need the volume shared at this point
- //
-
- AFSConvertToShared( pVolumeCB->VolumeLock);
-
- //
// Init our name array
//
"AFSParseName (%08lX) Failed to initialize name array\n",
Irp);
- AFSReleaseResource( pVolumeCB->VolumeLock);
-
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
if( *VolumeCB != NULL)
{
-
ASSERT( (*VolumeCB)->VolumeReferenceCount > 1);
}
NTSTATUS ntStatus = STATUS_SUCCESS;
UNICODE_STRING uniName;
- AFSFileID stFileID;
AFSDirEnumEntry *pDirEnumEntry = NULL;
AFSDeviceExt *pDevExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
AFSDirHdr *pDirHdr = &AFSGlobalRoot->ObjectInformation.Specific.Directory.DirectoryNodeHdr;
// OK, ask the CM about this component name
//
- stFileID = AFSGlobalRoot->ObjectInformation.FileId;
-
ntStatus = AFSEvaluateTargetByName( AuthGroup,
- &stFileID,
+ &AFSGlobalRoot->ObjectInformation,
CellName,
&pDirEnumEntry);
{
//
- // We have the global root on entry so drop it now
- //
-
- AFSReleaseResource( AFSGlobalRoot->VolumeLock);
-
- //
// Build the root volume entry
//
if( !NT_SUCCESS( ntStatus))
{
-
- //
- // On failure this routine is expecting to hold the global root
- //
-
- AFSAcquireShared( AFSGlobalRoot->VolumeLock,
- TRUE);
-
try_return( ntStatus);
}
else
{
- AFSInsertCaseSensitiveDirEntry( pDirHdr->CaseSensitiveTreeHead,
- pDirNode);
+ if( !NT_SUCCESS( AFSInsertCaseSensitiveDirEntry( pDirHdr->CaseSensitiveTreeHead,
+ pDirNode)))
+ {
+
+ AFSDeleteDirEntry( &AFSGlobalRoot->ObjectInformation,
+ pDirNode);
+
+ AFSReleaseResource( AFSGlobalRoot->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock);
+
+ try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
+ }
}
+ ClearFlag( pDirNode->Flags, AFS_DIR_ENTRY_NOT_IN_PARENT_TREE);
+
if( pDirHdr->CaseInsensitiveTreeHead == NULL)
{
DirectoryCB->ObjectInformation->FileId.Vnode,
DirectoryCB->ObjectInformation->FileId.Unique);
- try_return( ntStatus = STATUS_ACCESS_DENIED);
+ try_return( ntStatus = STATUS_REPARSE_POINT_NOT_RESOLVED);
}
AFSAcquireExcl( &DirectoryCB->NonPaged->Lock,
AFSReleaseResource( &pVolumeCB->RootFcb->NPFcb->Resource);
}
- AFSConvertToShared( pVolumeCB->VolumeLock);
-
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE_2,
"AFSBuildMountPointTarget Evaluated target of %wZ FID %08lX-%08lX-%08lX-%08lX as root volume\n",
InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+ AFSReleaseResource( pVolumeCB->VolumeLock);
+
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSBuildMountPointTarget Increment count on volume %08lX Cnt %d\n",
AFSReleaseResource( &pVolumeCB->RootFcb->NPFcb->Resource);
}
- AFSConvertToShared( pVolumeCB->VolumeLock);
-
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE_2,
"AFSBuildRootVolume Evaluated target of %wZ FID %08lX-%08lX-%08lX-%08lX as root volume\n",
InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+ AFSReleaseResource( pVolumeCB->VolumeLock);
+
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSBuildRootVolume Increment count on volume %08lX Cnt %d\n",
NTSTATUS
AFSProcessDFSLink( IN AFSDirectoryCB *DirEntry,
IN PFILE_OBJECT FileObject,
- IN UNICODE_STRING *RemainingPath)
+ IN UNICODE_STRING *RemainingPath,
+ IN GUID *AuthGroup)
{
NTSTATUS ntStatus = STATUS_INVALID_DEVICE_REQUEST;
UNICODE_STRING uniReparseName;
UNICODE_STRING uniMUPDeviceName;
AFSDirEnumEntry *pDirEntry = NULL;
- GUID *pAuthGroup = NULL;
__Enter
{
if( DirEntry->NameInformation.TargetName.Length == 0)
{
- if( DirEntry->ObjectInformation->Fcb != NULL)
- {
- pAuthGroup = &DirEntry->ObjectInformation->Fcb->AuthGroup;
- }
-
ntStatus = AFSEvaluateTargetByID( DirEntry->ObjectInformation,
- pAuthGroup,
+ AuthGroup,
FALSE,
&pDirEntry);
if( NT_SUCCESS( ntStatus))
{
- ntStatus = STATUS_ACCESS_DENIED;
+ ntStatus = STATUS_REPARSE_POINT_NOT_RESOLVED;
}
try_return( ntStatus);