X-Git-Url: https://git.openafs.org/?p=openafs.git;a=blobdiff_plain;f=src%2FWINNT%2Fafsrdr%2Fkernel%2Flib%2FAFSNameSupport.cpp;h=dff36d2ce03eddf812838b7718fe69030088643d;hp=f4fad073178adb4e6cc53e4ee625077ddfdcc9fa;hb=83c52997b7b9e4d91a0263fbd26ec19fb2092d9c;hpb=dac012a84b1fec9f2a5003e8cf45a7bdb8cb004a diff --git a/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp b/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp index f4fad07..dff36d2 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp @@ -154,7 +154,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup, pCurrentObject->FileId.Volume, pCurrentObject->FileId.Vnode, pCurrentObject->FileId.Unique, - ntStatus); + STATUS_FILE_DELETED); try_return( ntStatus = STATUS_FILE_DELETED); } @@ -171,7 +171,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup, pCurrentObject->FileId.Volume, pCurrentObject->FileId.Vnode, pCurrentObject->FileId.Unique, - ntStatus); + STATUS_DELETE_PENDING); try_return( ntStatus = STATUS_DELETE_PENDING); } @@ -663,13 +663,8 @@ AFSLocateNameEntry( IN GUID *AuthGroup, pCurrentVolume, pCurrentVolume->VolumeReferenceCount); - AFSReleaseResource( pCurrentVolume->VolumeLock); - pCurrentVolume = AFSGlobalRoot; - AFSAcquireShared( pCurrentVolume->VolumeLock, - TRUE); - InterlockedIncrement( &pCurrentVolume->VolumeReferenceCount); AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING, @@ -826,8 +821,6 @@ AFSLocateNameEntry( IN GUID *AuthGroup, pCurrentVolume, pCurrentVolume->VolumeReferenceCount); - AFSReleaseResource( pCurrentVolume->VolumeLock); - ntStatus = AFSBuildMountPointTarget( AuthGroup, pDirEntry, &pCurrentVolume); @@ -857,8 +850,6 @@ AFSLocateNameEntry( IN GUID *AuthGroup, ASSERT( pCurrentVolume->VolumeReferenceCount > 1); - ASSERT( ExIsResourceAcquiredLite( pCurrentVolume->VolumeLock)); - // // Replace the current name for the mp with the volume root of the target // @@ -935,7 +926,8 @@ AFSLocateNameEntry( IN GUID *AuthGroup, ntStatus = AFSProcessDFSLink( pDirEntry, FileObject, - &uniRemainingPath); + &uniRemainingPath, + AuthGroup); } else { @@ -1565,7 +1557,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup, 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, @@ -1589,7 +1581,7 @@ AFSLocateNameEntry( IN GUID *AuthGroup, 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, @@ -1874,8 +1866,6 @@ try_exit: ASSERT( pCurrentVolume->VolumeReferenceCount > 1); - ASSERT( ExIsResourceAcquiredLite( pCurrentVolume->VolumeLock)); - InterlockedDecrement( &pCurrentVolume->VolumeReferenceCount); AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING, @@ -1883,8 +1873,6 @@ try_exit: "AFSLocateNameEntry Decrement3 count on volume %08lX Cnt %d\n", pCurrentVolume, pCurrentVolume->VolumeReferenceCount); - - AFSReleaseResource( pCurrentVolume->VolumeLock); } if( RootPathName->Buffer != uniFullPathName.Buffer) @@ -1943,7 +1931,7 @@ AFSCreateDirEntry( IN GUID *AuthGroup, { NTSTATUS ntStatus = STATUS_SUCCESS; - AFSDirectoryCB *pDirNode = NULL; + AFSDirectoryCB *pDirNode = NULL, *pExistingDirNode = NULL; UNICODE_STRING uniShortName; LARGE_INTEGER liFileSize = {0,0}; @@ -2005,6 +1993,77 @@ AFSCreateDirEntry( IN GUID *AuthGroup, 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", @@ -2023,12 +2082,23 @@ AFSCreateDirEntry( IN GUID *AuthGroup, 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; @@ -2046,8 +2116,7 @@ AFSInsertDirectoryNode( IN AFSObjectInfoCB *ParentObjectInfo, __Enter { - AFSAcquireExcl( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock, - TRUE); + ASSERT( ExIsResourceAcquiredExclusiveLite( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock)); // // Insert the node into the directory node tree @@ -2128,18 +2197,31 @@ AFSInsertDirectoryNode( IN AFSObjectInfoCB *ParentObjectInfo, "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); + AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING, + AFS_TRACE_LEVEL_VERBOSE, + "AFSInsertDirectoryNode Insert DE %p to shortname tree for %wZ\n", + DirEntry, + &DirEntry->NameInformation.FileName); + } } } @@ -2189,8 +2271,6 @@ AFSInsertDirectoryNode( IN AFSObjectInfoCB *ParentObjectInfo, ParentObjectInfo->FileId.Vnode, ParentObjectInfo->FileId.Unique); } - - AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock); } return; @@ -2243,7 +2323,10 @@ AFSDeleteDirEntry( IN AFSObjectInfoCB *ParentObjectInfo, 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, @@ -2529,11 +2612,11 @@ AFSParseName( IN PIRP Irp, *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)) @@ -2583,7 +2666,7 @@ AFSParseName( IN PIRP Irp, } } - AFSConvertToShared( pVolumeCB->VolumeLock); + AFSReleaseResource( pVolumeCB->VolumeLock); if( BooleanFlagOn( pDirEntry->ObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY)) { @@ -2615,8 +2698,6 @@ AFSParseName( IN PIRP Irp, pDirEntry->ObjectInformation->FileId.Unique, ntStatus); - AFSReleaseResource( pVolumeCB->VolumeLock); - try_return( ntStatus); } } @@ -2644,8 +2725,6 @@ AFSParseName( IN PIRP Irp, "AFSParseName (%08lX) Failed to allocate full name buffer\n", Irp); - AFSReleaseResource( pVolumeCB->VolumeLock); - try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES); } @@ -2711,8 +2790,6 @@ AFSParseName( IN PIRP Irp, AFSExFreePool( uniFullName.Buffer); - AFSReleaseResource( pVolumeCB->VolumeLock); - try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES); } @@ -2740,8 +2817,6 @@ AFSParseName( IN PIRP Irp, AFSExFreePool( uniFullName.Buffer); - AFSReleaseResource( pVolumeCB->VolumeLock); - try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES); } @@ -2760,8 +2835,6 @@ AFSParseName( IN PIRP Irp, AFSExFreePool( uniFullName.Buffer); - AFSReleaseResource( pVolumeCB->VolumeLock); - try_return( ntStatus); } @@ -2940,8 +3013,8 @@ AFSParseName( IN PIRP Irp, // 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)) @@ -2991,6 +3064,8 @@ AFSParseName( IN PIRP Irp, } } + AFSReleaseResource( AFSGlobalRoot->VolumeLock); + if( !BooleanFlagOn( AFSGlobalRoot->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED)) { @@ -3012,8 +3087,6 @@ AFSParseName( IN PIRP Irp, Irp, ntStatus); - AFSReleaseResource( AFSGlobalRoot->VolumeLock); - try_return( ntStatus); } } @@ -3042,8 +3115,6 @@ AFSParseName( IN PIRP Irp, NULL, AFSGlobalRoot->DirectoryCB->OpenReferenceCount); - AFSReleaseResource( AFSGlobalRoot->VolumeLock); - *VolumeCB = NULL; FileName->Length = 0; @@ -3110,8 +3181,6 @@ AFSParseName( IN PIRP Irp, NULL, AFSGlobalRoot->DirectoryCB->OpenReferenceCount); - AFSReleaseResource( AFSGlobalRoot->VolumeLock); - *VolumeCB = NULL; FileName->Length = 0; @@ -3155,8 +3224,6 @@ AFSParseName( IN PIRP Irp, NULL, AFSGlobalRoot->DirectoryCB->OpenReferenceCount); - AFSReleaseResource( AFSGlobalRoot->VolumeLock); - ClearFlag( *ParseFlags, AFS_PARSE_FLAG_ROOT_ACCESS); *VolumeCB = NULL; @@ -3176,8 +3243,6 @@ AFSParseName( IN PIRP Irp, Irp, &uniComponentName); - AFSReleaseResource( AFSGlobalRoot->VolumeLock); - // // Add in the full share name to pass back // @@ -3286,7 +3351,6 @@ AFSParseName( IN PIRP Irp, if( !NT_SUCCESS( ntStatus)) { - AFSReleaseResource( AFSGlobalRoot->VolumeLock); if ( bIsAllShare && uniRemainingPath.Length == 0 && @@ -3431,12 +3495,6 @@ AFSParseName( IN PIRP Irp, } // - // We only need the volume shared at this point - // - - AFSConvertToShared( pVolumeCB->VolumeLock); - - // // Init our name array // @@ -3451,8 +3509,6 @@ AFSParseName( IN PIRP Irp, "AFSParseName (%08lX) Failed to initialize name array\n", Irp); - AFSReleaseResource( pVolumeCB->VolumeLock); - try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES); } @@ -3500,7 +3556,6 @@ try_exit: if( *VolumeCB != NULL) { - ASSERT( (*VolumeCB)->VolumeReferenceCount > 1); } @@ -3621,12 +3676,6 @@ AFSCheckCellName( IN GUID *AuthGroup, { // - // We have the global root on entry so drop it now - // - - AFSReleaseResource( AFSGlobalRoot->VolumeLock); - - // // Build the root volume entry // @@ -3636,14 +3685,6 @@ AFSCheckCellName( IN GUID *AuthGroup, if( !NT_SUCCESS( ntStatus)) { - - // - // On failure this routine is expecting to hold the global root - // - - AFSAcquireShared( AFSGlobalRoot->VolumeLock, - TRUE); - try_return( ntStatus); } @@ -3707,10 +3748,21 @@ AFSCheckCellName( IN GUID *AuthGroup, 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) { @@ -4009,8 +4061,6 @@ AFSBuildMountPointTarget( IN GUID *AuthGroup, 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", @@ -4022,6 +4072,8 @@ AFSBuildMountPointTarget( IN GUID *AuthGroup, 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", @@ -4166,8 +4218,6 @@ AFSBuildRootVolume( IN GUID *AuthGroup, 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", @@ -4179,6 +4229,8 @@ AFSBuildRootVolume( IN GUID *AuthGroup, 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", @@ -4198,14 +4250,14 @@ try_exit: 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 { @@ -4227,13 +4279,8 @@ AFSProcessDFSLink( IN AFSDirectoryCB *DirEntry, if( DirEntry->NameInformation.TargetName.Length == 0) { - if( DirEntry->ObjectInformation->Fcb != NULL) - { - pAuthGroup = &DirEntry->ObjectInformation->Fcb->AuthGroup; - } - ntStatus = AFSEvaluateTargetByID( DirEntry->ObjectInformation, - pAuthGroup, + AuthGroup, FALSE, &pDirEntry);