sys: FSP_FILE_DESC: DirectoryNoMoreFiles optimization

This commit is contained in:
Bill Zissimopoulos 2017-09-27 18:01:17 -07:00
parent 0dff9a4c07
commit c70089a176
3 changed files with 21 additions and 1 deletions

View File

@ -339,6 +339,10 @@ static NTSTATUS FspFsvolQueryDirectoryCopyCache(
if (0 != *PDestLen) if (0 != *PDestLen)
FileDesc->DirectoryHasSuchFile = TRUE; FileDesc->DirectoryHasSuchFile = TRUE;
FileDesc->DirInfoCacheHint = (ULONG)((PUINT8)DirInfo - DirInfoBgn); FileDesc->DirInfoCacheHint = (ULONG)((PUINT8)DirInfo - DirInfoBgn);
if (DirInfoEnd >= (PUINT8)DirInfo + sizeof(DirInfo->Size) &&
sizeof(FSP_FSCTL_DIR_INFO) > DirInfo->Size)
FileDesc->DirectoryNoMoreFiles = TRUE;
} }
} }
else if (STATUS_NO_MORE_FILES == Result && !FileDesc->DirectoryHasSuchFile) else if (STATUS_NO_MORE_FILES == Result && !FileDesc->DirectoryHasSuchFile)
@ -361,6 +365,7 @@ static NTSTATUS FspFsvolQueryDirectoryCopyInPlace(
BOOLEAN CaseInsensitive = !FileDesc->CaseSensitive; BOOLEAN CaseInsensitive = !FileDesc->CaseSensitive;
PUNICODE_STRING DirectoryPattern = &FileDesc->DirectoryPattern; PUNICODE_STRING DirectoryPattern = &FileDesc->DirectoryPattern;
UNICODE_STRING DirectoryMarker = FileDesc->DirectoryMarker; UNICODE_STRING DirectoryMarker = FileDesc->DirectoryMarker;
PUINT8 DirInfoEnd = (PUINT8)DirInfo + DirInfoSize;
ASSERT(DirInfo == DestBuf); ASSERT(DirInfo == DestBuf);
FSP_FSCTL_STATIC_ASSERT( FSP_FSCTL_STATIC_ASSERT(
@ -381,6 +386,10 @@ static NTSTATUS FspFsvolQueryDirectoryCopyInPlace(
{ {
if (0 != *PDestLen) if (0 != *PDestLen)
FileDesc->DirectoryHasSuchFile = TRUE; FileDesc->DirectoryHasSuchFile = TRUE;
if (DirInfoEnd >= (PUINT8)DirInfo + sizeof(DirInfo->Size) &&
sizeof(FSP_FSCTL_DIR_INFO) > DirInfo->Size)
FileDesc->DirectoryNoMoreFiles = TRUE;
} }
} }
else if (STATUS_NO_MORE_FILES == Result && !FileDesc->DirectoryHasSuchFile) else if (STATUS_NO_MORE_FILES == Result && !FileDesc->DirectoryHasSuchFile)
@ -529,6 +538,14 @@ static NTSTATUS FspFsvolQueryDirectoryRetry(
return Result; return Result;
} }
/* check if the FileDesc has already seen the "End Of Directory" mark */
if (FileDesc->DirectoryNoMoreFiles)
{
FspFileNodeRelease(FileNode, Full);
return !FileDesc->DirectoryHasSuchFile ?
STATUS_NO_SUCH_FILE : STATUS_NO_MORE_FILES;
}
/* see if the required information is still in the cache and valid! */ /* see if the required information is still in the cache and valid! */
if (FspFileNodeReferenceDirInfo(FileNode, &DirInfoBuffer, &DirInfoSize)) if (FspFileNodeReferenceDirInfo(FileNode, &DirInfoBuffer, &DirInfoSize))
{ {

View File

@ -1267,7 +1267,7 @@ typedef struct
DidSetMetadata:1, DidSetMetadata:1,
DidSetFileAttributes:1, DidSetReparsePoint:1, DidSetSecurity:1, DidSetFileAttributes:1, DidSetReparsePoint:1, DidSetSecurity:1,
DidSetCreationTime:1, DidSetLastAccessTime:1, DidSetLastWriteTime:1, DidSetChangeTime:1, DidSetCreationTime:1, DidSetLastAccessTime:1, DidSetLastWriteTime:1, DidSetChangeTime:1,
DirectoryHasSuchFile:1; DirectoryHasSuchFile:1, DirectoryNoMoreFiles:1;
UNICODE_STRING DirectoryPattern; UNICODE_STRING DirectoryPattern;
UNICODE_STRING DirectoryMarker; UNICODE_STRING DirectoryMarker;
UINT64 DirInfo; UINT64 DirInfo;

View File

@ -2121,6 +2121,7 @@ NTSTATUS FspFileDescResetDirectory(FSP_FILE_DESC *FileDesc,
FileDesc->DirectoryPattern = DirectoryPattern; FileDesc->DirectoryPattern = DirectoryPattern;
FileDesc->DirectoryHasSuchFile = FALSE; FileDesc->DirectoryHasSuchFile = FALSE;
FileDesc->DirectoryNoMoreFiles = FALSE;
if (0 != FileDesc->DirectoryMarker.Buffer) if (0 != FileDesc->DirectoryMarker.Buffer)
{ {
@ -2133,6 +2134,7 @@ NTSTATUS FspFileDescResetDirectory(FSP_FILE_DESC *FileDesc,
ASSERT(0 == FileName || 0 == FileName->Length); ASSERT(0 == FileName || 0 == FileName->Length);
FileDesc->DirectoryHasSuchFile = FALSE; FileDesc->DirectoryHasSuchFile = FALSE;
FileDesc->DirectoryNoMoreFiles = FALSE;
if (0 != FileDesc->DirectoryMarker.Buffer) if (0 != FileDesc->DirectoryMarker.Buffer)
{ {
@ -2149,6 +2151,7 @@ NTSTATUS FspFileDescResetDirectory(FSP_FILE_DESC *FileDesc,
return Result; return Result;
FileDesc->DirectoryHasSuchFile = FALSE; FileDesc->DirectoryHasSuchFile = FALSE;
FileDesc->DirectoryNoMoreFiles = FALSE;
} }
return STATUS_SUCCESS; return STATUS_SUCCESS;