From 1239c610a585847a56694bcb5bf348af3b987536 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Wed, 13 Apr 2016 20:33:10 -0700 Subject: [PATCH] sys: IRP_MJ_READ: remove FspFileNodeTrySetFileInfo at completion sys: IRP_MJ_READ: remove PagingIo early exit optimization sys: IRP_MJ_WRITE: remove PagingIo early exit optimization --- inc/winfsp/fsctl.h | 4 ---- inc/winfsp/winfsp.h | 2 +- src/dll/fsop.c | 7 +------ src/sys/read.c | 38 +------------------------------------- src/sys/write.c | 8 -------- tst/memfs/memfs.cpp | 3 +-- 6 files changed, 4 insertions(+), 58 deletions(-) diff --git a/inc/winfsp/fsctl.h b/inc/winfsp/fsctl.h index f6c156aa..14e641ab 100644 --- a/inc/winfsp/fsctl.h +++ b/inc/winfsp/fsctl.h @@ -321,10 +321,6 @@ typedef struct FSP_FSCTL_FILE_INFO FileInfo; } Overwrite; struct - { - FSP_FSCTL_FILE_INFO FileInfo; - } Read; - struct { FSP_FSCTL_FILE_INFO FileInfo; } Write; diff --git a/inc/winfsp/winfsp.h b/inc/winfsp/winfsp.h index d8248276..79c82db0 100644 --- a/inc/winfsp/winfsp.h +++ b/inc/winfsp/winfsp.h @@ -67,7 +67,7 @@ typedef struct _FSP_FILE_SYSTEM_INTERFACE NTSTATUS (*Read)(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, PVOID FileNode, PVOID Buffer, UINT64 Offset, ULONG Length, - PULONG PBytesTransferred, FSP_FSCTL_FILE_INFO *FileInfo); + PULONG PBytesTransferred); NTSTATUS (*Write)(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, PVOID FileNode, PVOID Buffer, UINT64 Offset, ULONG Length, diff --git a/src/dll/fsop.c b/src/dll/fsop.c index 41f6c39e..94d12ad5 100644 --- a/src/dll/fsop.c +++ b/src/dll/fsop.c @@ -407,7 +407,6 @@ FSP_API NTSTATUS FspFileSystemOpRead(FSP_FILE_SYSTEM *FileSystem, { NTSTATUS Result; ULONG BytesTransferred; - FSP_FSCTL_FILE_INFO FileInfo; if (0 == FileSystem->Interface->Read) return STATUS_INVALID_DEVICE_REQUEST; @@ -418,16 +417,12 @@ FSP_API NTSTATUS FspFileSystemOpRead(FSP_FILE_SYSTEM *FileSystem, (PVOID)Request->Req.Read.Address, Request->Req.Read.Offset, Request->Req.Read.Length, - &BytesTransferred, - &FileInfo); + &BytesTransferred); if (!NT_SUCCESS(Result)) return Result; if (STATUS_PENDING != Result) - { Response->IoStatus.Information = BytesTransferred; - memcpy(&Response->Rsp.Read.FileInfo, &FileInfo, sizeof FileInfo); - } return Result; } diff --git a/src/sys/read.c b/src/sys/read.c index d7aac06f..d8c2459e 100644 --- a/src/sys/read.c +++ b/src/sys/read.c @@ -36,9 +36,6 @@ enum RequestSafeMdl = 1, RequestAddress = 2, RequestProcess = 3, - - /* ReadNonCachedComplete retry */ - RequestInfoChangeNumber = 0, }; static NTSTATUS FspFsvolRead( @@ -210,7 +207,6 @@ static NTSTATUS FspFsvolReadNonCached( ULONG ReadLength = IrpSp->Parameters.Read.Length; ULONG ReadKey = IrpSp->Parameters.Read.Key; BOOLEAN PagingIo = BooleanFlagOn(Irp->Flags, IRP_PAGING_IO); - FSP_FSCTL_FILE_INFO FileInfo; FSP_FSCTL_TRANSACT_REQ *Request; BOOLEAN Success; @@ -220,13 +216,6 @@ static NTSTATUS FspFsvolReadNonCached( if (FlagOn(IrpSp->MinorFunction, IRP_MN_MDL)) return STATUS_INVALID_PARAMETER; - /* if this is a Paging I/O see if we can optimize it away! */ - if (PagingIo && /* if this is Paging I/O */ - FlagOn(FspIrpTopFlags(Irp), FspFileNodeAcquireMain) && /* and TopLevelIrp has acquired Main */ - FspFileNodeTryGetFileInfo(FileNode, &FileInfo) && /* and the cached FileSize is valid */ - (UINT64)ReadOffset.QuadPart >= FileInfo.FileSize) /* and the ReadOffset is past EOF */ - return STATUS_END_OF_FILE; - /* probe and lock the user buffer */ Result = FspLockUserBuffer(Irp, ReadLength, IoWriteAccess); if (!NT_SUCCESS(Result)) @@ -348,12 +337,9 @@ NTSTATUS FspFsvolReadComplete( FSP_FSCTL_TRANSACT_REQ *Request = FspIrpRequest(Irp); FSP_SAFE_MDL *SafeMdl = FspIopRequestContext(Request, RequestSafeMdl); PFILE_OBJECT FileObject = IrpSp->FileObject; - FSP_FILE_NODE *FileNode = FileObject->FsContext; LARGE_INTEGER ReadOffset = IrpSp->Parameters.Read.ByteOffset; BOOLEAN PagingIo = BooleanFlagOn(Irp->Flags, IRP_PAGING_IO); BOOLEAN SynchronousIo = BooleanFlagOn(FileObject->Flags, FO_SYNCHRONOUS_IO); - ULONG InfoChangeNumber; - BOOLEAN Success; if (0 != SafeMdl) FspSafeMdlCopyBack(SafeMdl); @@ -361,34 +347,12 @@ NTSTATUS FspFsvolReadComplete( /* if we are top-level */ if (0 == FspIrpTopFlags(Irp)) { - if (FspFsctlTransactReadKind == Request->Kind) - { - InfoChangeNumber = FileNode->InfoChangeNumber; - Request->Kind = FspFsctlTransactReservedKind; - FspIopResetRequest(Request, 0); - FspIopRequestContext(Request, RequestInfoChangeNumber) = (PVOID)InfoChangeNumber; - } - else - InfoChangeNumber = - (ULONG)(UINT_PTR)FspIopRequestContext(Request, RequestInfoChangeNumber); - - Success = DEBUGTEST(90) && FspFileNodeTryAcquireExclusive(FileNode, Main); - if (!Success) - { - FspIopRetryCompleteIrp(Irp, Response, &Result); - FSP_RETURN(); - } - - /* update file info */ - FspFileNodeTrySetFileInfo(FileNode, FileObject, &Response->Rsp.Read.FileInfo, - InfoChangeNumber); - /* update the current file offset if synchronous I/O (and not paging I/O) */ if (SynchronousIo && !PagingIo) FileObject->CurrentByteOffset.QuadPart = ReadOffset.QuadPart + Response->IoStatus.Information; - FspFileNodeRelease(FileNode, Main); + FspIopResetRequest(Request, 0); } else { diff --git a/src/sys/write.c b/src/sys/write.c index 8af828e4..f28539b6 100644 --- a/src/sys/write.c +++ b/src/sys/write.c @@ -258,7 +258,6 @@ static NTSTATUS FspFsvolWriteNonCached( BOOLEAN WriteToEndOfFile = FILE_WRITE_TO_END_OF_FILE == WriteOffset.LowPart && -1L == WriteOffset.HighPart; BOOLEAN PagingIo = BooleanFlagOn(Irp->Flags, IRP_PAGING_IO); - FSP_FSCTL_FILE_INFO FileInfo; FSP_FSCTL_TRANSACT_REQ *Request; BOOLEAN Success; @@ -276,13 +275,6 @@ static NTSTATUS FspFsvolWriteNonCached( if (FspIoqStopped(FspFsvolDeviceExtension(FsvolDeviceObject)->Ioq)) return FspFsvolDeviceStoppedStatus(FsvolDeviceObject); - /* if this is a Paging I/O see if we can optimize it away! */ - if (PagingIo && /* if this is Paging I/O */ - FlagOn(FspIrpTopFlags(Irp), FspFileNodeAcquireMain) && /* and TopLevelIrp has acquired Main */ - FspFileNodeTryGetFileInfo(FileNode, &FileInfo) && /* and the cached FileSize is valid */ - (UINT64)WriteOffset.QuadPart >= FileInfo.FileSize) /* and the WriteOffset is past EOF */ - return STATUS_SUCCESS; - /* probe and lock the user buffer */ Result = FspLockUserBuffer(Irp, WriteLength, IoReadAccess); if (!NT_SUCCESS(Result)) diff --git a/tst/memfs/memfs.cpp b/tst/memfs/memfs.cpp index 05015be5..6e4fcaad 100644 --- a/tst/memfs/memfs.cpp +++ b/tst/memfs/memfs.cpp @@ -460,7 +460,7 @@ static VOID Close(FSP_FILE_SYSTEM *FileSystem, static NTSTATUS Read(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, PVOID FileNode0, PVOID Buffer, UINT64 Offset, ULONG Length, - PULONG PBytesTransferred, FSP_FSCTL_FILE_INFO *FileInfo) + PULONG PBytesTransferred) { MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0; UINT64 EndOffset; @@ -475,7 +475,6 @@ static NTSTATUS Read(FSP_FILE_SYSTEM *FileSystem, memcpy(Buffer, (PUINT8)FileNode->FileData + Offset, EndOffset - Offset); *PBytesTransferred = (ULONG)(EndOffset - Offset); - *FileInfo = FileNode->FileInfo; return STATUS_SUCCESS; }