mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-22 16:33:02 -05:00
sys: FSP_FILE_DESC: DirectoryNoMoreFiles optimization
This commit is contained in:
parent
0dff9a4c07
commit
c70089a176
@ -339,6 +339,10 @@ static NTSTATUS FspFsvolQueryDirectoryCopyCache(
|
||||
if (0 != *PDestLen)
|
||||
FileDesc->DirectoryHasSuchFile = TRUE;
|
||||
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)
|
||||
@ -361,6 +365,7 @@ static NTSTATUS FspFsvolQueryDirectoryCopyInPlace(
|
||||
BOOLEAN CaseInsensitive = !FileDesc->CaseSensitive;
|
||||
PUNICODE_STRING DirectoryPattern = &FileDesc->DirectoryPattern;
|
||||
UNICODE_STRING DirectoryMarker = FileDesc->DirectoryMarker;
|
||||
PUINT8 DirInfoEnd = (PUINT8)DirInfo + DirInfoSize;
|
||||
|
||||
ASSERT(DirInfo == DestBuf);
|
||||
FSP_FSCTL_STATIC_ASSERT(
|
||||
@ -381,6 +386,10 @@ static NTSTATUS FspFsvolQueryDirectoryCopyInPlace(
|
||||
{
|
||||
if (0 != *PDestLen)
|
||||
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)
|
||||
@ -529,6 +538,14 @@ static NTSTATUS FspFsvolQueryDirectoryRetry(
|
||||
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! */
|
||||
if (FspFileNodeReferenceDirInfo(FileNode, &DirInfoBuffer, &DirInfoSize))
|
||||
{
|
||||
|
@ -1267,7 +1267,7 @@ typedef struct
|
||||
DidSetMetadata:1,
|
||||
DidSetFileAttributes:1, DidSetReparsePoint:1, DidSetSecurity:1,
|
||||
DidSetCreationTime:1, DidSetLastAccessTime:1, DidSetLastWriteTime:1, DidSetChangeTime:1,
|
||||
DirectoryHasSuchFile:1;
|
||||
DirectoryHasSuchFile:1, DirectoryNoMoreFiles:1;
|
||||
UNICODE_STRING DirectoryPattern;
|
||||
UNICODE_STRING DirectoryMarker;
|
||||
UINT64 DirInfo;
|
||||
|
@ -2121,6 +2121,7 @@ NTSTATUS FspFileDescResetDirectory(FSP_FILE_DESC *FileDesc,
|
||||
|
||||
FileDesc->DirectoryPattern = DirectoryPattern;
|
||||
FileDesc->DirectoryHasSuchFile = FALSE;
|
||||
FileDesc->DirectoryNoMoreFiles = FALSE;
|
||||
|
||||
if (0 != FileDesc->DirectoryMarker.Buffer)
|
||||
{
|
||||
@ -2133,6 +2134,7 @@ NTSTATUS FspFileDescResetDirectory(FSP_FILE_DESC *FileDesc,
|
||||
ASSERT(0 == FileName || 0 == FileName->Length);
|
||||
|
||||
FileDesc->DirectoryHasSuchFile = FALSE;
|
||||
FileDesc->DirectoryNoMoreFiles = FALSE;
|
||||
|
||||
if (0 != FileDesc->DirectoryMarker.Buffer)
|
||||
{
|
||||
@ -2149,6 +2151,7 @@ NTSTATUS FspFileDescResetDirectory(FSP_FILE_DESC *FileDesc,
|
||||
return Result;
|
||||
|
||||
FileDesc->DirectoryHasSuchFile = FALSE;
|
||||
FileDesc->DirectoryNoMoreFiles = FALSE;
|
||||
}
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
|
Loading…
x
Reference in New Issue
Block a user