try_return( ntStatus);
}
+ else if( pFcb->Header.NodeTypeCode == AFS_INVALID_FCB)
+ {
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSQueryFileInfo request against Invalid Fcb\n");
+
+ try_return( ntStatus = STATUS_ACCESS_DENIED);
+ }
+
//
// Process the request
//
PFILE_OBJECT pFileObject = NULL;
BOOLEAN bReleaseMain = FALSE;
BOOLEAN bUpdateFileInfo = FALSE;
- BOOLEAN bReleaseVolumeLock = FALSE;
AFSFileID stParentFileId;
__try
bCanQueueRequest = !(IoIsOperationSynchronous( Irp) | (KeGetCurrentIrql() != PASSIVE_LEVEL));
FileInformationClass = pIrpSp->Parameters.SetFile.FileInformationClass;
- if( FileInformationClass == FileRenameInformation)
- {
-
- AFSAcquireExcl( pFcb->ObjectInformation->VolumeCB->VolumeLock,
- TRUE);
-
- bReleaseVolumeLock = TRUE;
- }
-
//
// Grab the Fcb EXCL
//
"AFSSetFileInfo Request failed due to read only volume\n",
Irp);
+ try_return( ntStatus = STATUS_MEDIA_WRITE_PROTECTED);
+ }
+
+ if( pFcb->Header.NodeTypeCode == AFS_INVALID_FCB &&
+ FileInformationClass != FileDispositionInformation)
+ {
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetFileInfo request against Invalid Fcb\n");
+
try_return( ntStatus = STATUS_ACCESS_DENIED);
}
AFSReleaseResource( &pFcb->NPFcb->Resource);
}
- if( bReleaseVolumeLock)
- {
- AFSReleaseResource( pFcb->ObjectInformation->VolumeCB->VolumeLock);
- }
-
if( NT_SUCCESS( ntStatus) &&
bUpdateFileInfo)
{
try_return( ntStatus = STATUS_DIRECTORY_NOT_EMPTY);
}
}
- else
+ else if( pFcb->Header.NodeTypeCode == AFS_FILE_FCB)
{
//
&stNewFid))
{
+ AFSAcquireExcl( pSrcObject->VolumeCB->ObjectInfoTree.TreeLock,
+ TRUE);
+
//
// Remove the old information entry
//
else
{
- AFSInsertHashEntry( pSrcObject->VolumeCB->ObjectInfoTree.TreeHead,
- &pSrcObject->TreeEntry);
+ if ( !NT_SUCCESS( AFSInsertHashEntry( pSrcObject->VolumeCB->ObjectInfoTree.TreeHead,
+ &pSrcObject->TreeEntry)))
+ {
+
+ //
+ // Lost a race, an ObjectInfo object already exists for this FID.
+ // Let this copy be garbage collected.
+ //
+
+ ClearFlag( pSrcObject->Flags, AFS_OBJECT_INSERTED_HASH_TREE);
+ }
}
+
+ AFSReleaseResource( pSrcObject->VolumeCB->ObjectInfoTree.TreeLock);
}
//