sys: FspFsvolReadNonCached,FspFsvolWriteNonCached: reuse work Requests

This commit is contained in:
Bill Zissimopoulos 2016-11-09 15:58:17 -08:00
parent becfd2e1c5
commit a0cb134bd3
2 changed files with 37 additions and 16 deletions

View File

@ -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;

View File

@ -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;