From: pete scott Date: Tue, 23 Sep 2014 19:20:45 +0000 (-0600) Subject: Windows: !overwrite IOMgr populated FileInfo data X-Git-Tag: openafs-stable-1_8_0pre1~574 X-Git-Url: https://git.openafs.org/?p=openafs.git;a=commitdiff_plain;h=06995ceb4d664c3f14f6626da447cf9891470719;hp=5ebe2437efa7a64f0b0cc61e2123f9ae766b84cf Windows: !overwrite IOMgr populated FileInfo data I/O Manager will populate the FILE_ACCESS_INFORMATION, FILE_MODE_INFORMATION, and FILE_ALIGNMENT_INFORMATION portions of a FILE_ALL_INFORMATION structure prior to forwarding a FileAllInformation FileInfo query to the file system. There is no need for the file system to duplicate the effort. Change-Id: Iaa7f1de95c6b7e42bdc326cc3f4bfe8596add949 Reviewed-on: http://gerrit.openafs.org/11478 Reviewed-by: Peter Scott Tested-by: BuildBot Reviewed-by: Jeffrey Altman --- diff --git a/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp b/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp index 478d546..c0645be 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp @@ -245,17 +245,18 @@ AFSQueryFileInfo( IN PDEVICE_OBJECT LibDeviceObject, try_return( ntStatus); } - ntStatus = AFSQueryAccess( Irp, - pFcb, - &pAllInfo->AccessInformation, - &lLength); + // + // We skip setting AccessInformation since this is set by the IO Mgr prior + // to sending this request to the file system + // - if( !NT_SUCCESS( ntStatus)) + if( lLength < sizeof( FILE_ACCESS_INFORMATION)) { - - try_return( ntStatus); + try_return( ntStatus = STATUS_BUFFER_TOO_SMALL); } + lLength -= sizeof( FILE_ACCESS_INFORMATION); + ntStatus = AFSQueryPositionInfo( Irp, pFcb, &pAllInfo->PositionInformation, @@ -267,28 +268,29 @@ AFSQueryFileInfo( IN PDEVICE_OBJECT LibDeviceObject, try_return( ntStatus); } - ntStatus = AFSQueryMode( Irp, - pFcb, - &pAllInfo->ModeInformation, - &lLength); + // + // We skip setting ModeInformation and AlignmentInformation since this is set by the IO Mgr prior + // to sending this request to the file system + // - if( !NT_SUCCESS( ntStatus)) + if( lLength < sizeof( FILE_MODE_INFORMATION)) { - - try_return( ntStatus); + try_return( ntStatus = STATUS_BUFFER_TOO_SMALL); } - ntStatus = AFSQueryAlignment( Irp, - pFcb, - &pAllInfo->AlignmentInformation, - &lLength); + lLength -= sizeof( FILE_MODE_INFORMATION); - if( !NT_SUCCESS( ntStatus)) + if( lLength < sizeof( FILE_ALIGNMENT_INFORMATION)) { - - try_return( ntStatus); + try_return( ntStatus = STATUS_BUFFER_TOO_SMALL); } + lLength -= sizeof( FILE_ALIGNMENT_INFORMATION); + + // + // Populate the name information + // + ntStatus = AFSQueryNameInfo( Irp, pCcb->DirectoryCB, &pAllInfo->NameInformation, @@ -1126,96 +1128,6 @@ AFSQueryPositionInfo( IN PIRP Irp, } NTSTATUS -AFSQueryAccess( IN PIRP Irp, - IN AFSFcb *Fcb, - IN OUT PFILE_ACCESS_INFORMATION Buffer, - IN OUT PLONG Length) -{ - - UNREFERENCED_PARAMETER(Irp); - UNREFERENCED_PARAMETER(Fcb); - NTSTATUS ntStatus = STATUS_SUCCESS; - - if( *Length >= sizeof( FILE_ACCESS_INFORMATION)) - { - - RtlZeroMemory( Buffer, - *Length); - - Buffer->AccessFlags = 0; - - *Length -= sizeof( FILE_ACCESS_INFORMATION); - } - else - { - - ntStatus = STATUS_BUFFER_TOO_SMALL; - } - - return ntStatus; -} - -NTSTATUS -AFSQueryMode( IN PIRP Irp, - IN AFSFcb *Fcb, - IN OUT PFILE_MODE_INFORMATION Buffer, - IN OUT PLONG Length) -{ - - UNREFERENCED_PARAMETER(Irp); - UNREFERENCED_PARAMETER(Fcb); - NTSTATUS ntStatus = STATUS_SUCCESS; - - if( *Length >= sizeof( FILE_MODE_INFORMATION)) - { - - RtlZeroMemory( Buffer, - *Length); - - Buffer->Mode = 0; - - *Length -= sizeof( FILE_MODE_INFORMATION); - } - else - { - - ntStatus = STATUS_BUFFER_TOO_SMALL; - } - - return ntStatus; -} - -NTSTATUS -AFSQueryAlignment( IN PIRP Irp, - IN AFSFcb *Fcb, - IN OUT PFILE_ALIGNMENT_INFORMATION Buffer, - IN OUT PLONG Length) -{ - - UNREFERENCED_PARAMETER(Irp); - UNREFERENCED_PARAMETER(Fcb); - NTSTATUS ntStatus = STATUS_SUCCESS; - - if( *Length >= sizeof( FILE_ALIGNMENT_INFORMATION)) - { - - RtlZeroMemory( Buffer, - *Length); - - Buffer->AlignmentRequirement = 1; - - *Length -= sizeof( FILE_ALIGNMENT_INFORMATION); - } - else - { - - ntStatus = STATUS_BUFFER_TOO_SMALL; - } - - return ntStatus; -} - -NTSTATUS AFSQueryNameInfo( IN PIRP Irp, IN AFSDirectoryCB *DirectoryCB, IN OUT PFILE_NAME_INFORMATION Buffer, diff --git a/src/WINNT/afsrdr/kernel/lib/Include/AFSCommon.h b/src/WINNT/afsrdr/kernel/lib/Include/AFSCommon.h index f853960..55735e2 100644 --- a/src/WINNT/afsrdr/kernel/lib/Include/AFSCommon.h +++ b/src/WINNT/afsrdr/kernel/lib/Include/AFSCommon.h @@ -798,24 +798,6 @@ AFSQueryStreamInfo( IN PIRP Irp, IN OUT PLONG Length); NTSTATUS -AFSQueryAccess( IN PIRP Irp, - IN AFSFcb *Fcb, - IN OUT PFILE_ACCESS_INFORMATION Buffer, - IN OUT PLONG Length); - -NTSTATUS -AFSQueryMode( IN PIRP Irp, - IN AFSFcb *Fcb, - IN OUT PFILE_MODE_INFORMATION Buffer, - IN OUT PLONG Length); - -NTSTATUS -AFSQueryAlignment( IN PIRP Irp, - IN AFSFcb *Fcb, - IN OUT PFILE_ALIGNMENT_INFORMATION Buffer, - IN OUT PLONG Length); - -NTSTATUS AFSQueryAttribTagInfo( IN PIRP Irp, IN AFSDirectoryCB *DirectoryCB, IN OUT FILE_ATTRIBUTE_TAG_INFORMATION *Buffer,