From a0cb134bd3ad1894096fc6894ce0731146b5b7b5 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Wed, 9 Nov 2016 15:58:17 -0800 Subject: [PATCH] sys: FspFsvolReadNonCached,FspFsvolWriteNonCached: reuse work Requests --- src/sys/read.c | 26 ++++++++++++++++++-------- src/sys/write.c | 27 +++++++++++++++++++-------- 2 files changed, 37 insertions(+), 16 deletions(-) diff --git a/src/sys/read.c b/src/sys/read.c index 1a9f0bd4..e9248652 100644 --- a/src/sys/read.c +++ b/src/sys/read.c @@ -266,15 +266,25 @@ static NTSTATUS FspFsvolReadNonCached( /* convert FileNode to shared */ FspFileNodeConvertExclusiveToShared(FileNode, Full); - /* delete any work item if present! */ - FspIrpDeleteRequest(Irp); - - /* create request */ - Result = FspIopCreateRequestEx(Irp, 0, 0, FspFsvolReadNonCachedRequestFini, &Request); - if (!NT_SUCCESS(Result)) + Request = FspIrpRequest(Irp); + if (0 == Request) { - FspFileNodeRelease(FileNode, Full); - return Result; + /* create request */ + Result = FspIopCreateRequestEx(Irp, 0, 0, FspFsvolReadNonCachedRequestFini, &Request); + if (!NT_SUCCESS(Result)) + { + FspFileNodeRelease(FileNode, Full); + return Result; + } + } + else + { + /* reuse existing request */ + ASSERT(Request->Size == sizeof *Request); + ASSERT(Request->Hint == (UINT_PTR)Irp); + FspIopResetRequest(Request, FspFsvolReadNonCachedRequestFini); + RtlZeroMemory(&Request->Req, + sizeof *Request - FIELD_OFFSET(FSP_FSCTL_TRANSACT_REQ, Req)); } Request->Kind = FspFsctlTransactReadKind; diff --git a/src/sys/write.c b/src/sys/write.c index 9f141da3..ea2a5a7e 100644 --- a/src/sys/write.c +++ b/src/sys/write.c @@ -333,16 +333,27 @@ static NTSTATUS FspFsvolWriteNonCached( } } - /* delete any work item if present! */ - FspIrpDeleteRequest(Irp); - - /* create request */ - Result = FspIopCreateRequestEx(Irp, 0, 0, FspFsvolWriteNonCachedRequestFini, &Request); - if (!NT_SUCCESS(Result)) + Request = FspIrpRequest(Irp); + if (0 == Request) { - FspFileNodeRelease(FileNode, Full); - return Result; + /* create request */ + Result = FspIopCreateRequestEx(Irp, 0, 0, FspFsvolWriteNonCachedRequestFini, &Request); + if (!NT_SUCCESS(Result)) + { + FspFileNodeRelease(FileNode, Full); + return Result; + } } + else + { + /* reuse existing request */ + ASSERT(Request->Size == sizeof *Request); + ASSERT(Request->Hint == (UINT_PTR)Irp); + FspIopResetRequest(Request, FspFsvolWriteNonCachedRequestFini); + RtlZeroMemory(&Request->Req, + sizeof *Request - FIELD_OFFSET(FSP_FSCTL_TRANSACT_REQ, Req)); + } + Request->Kind = FspFsctlTransactWriteKind; Request->Req.Write.UserContext = FileNode->UserContext;