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,9 +266,9 @@ static NTSTATUS FspFsvolReadNonCached(
/* convert FileNode to shared */ /* convert FileNode to shared */
FspFileNodeConvertExclusiveToShared(FileNode, Full); FspFileNodeConvertExclusiveToShared(FileNode, Full);
/* delete any work item if present! */ Request = FspIrpRequest(Irp);
FspIrpDeleteRequest(Irp); if (0 == Request)
{
/* create request */ /* create request */
Result = FspIopCreateRequestEx(Irp, 0, 0, FspFsvolReadNonCachedRequestFini, &Request); Result = FspIopCreateRequestEx(Irp, 0, 0, FspFsvolReadNonCachedRequestFini, &Request);
if (!NT_SUCCESS(Result)) if (!NT_SUCCESS(Result))
@ -276,6 +276,16 @@ static NTSTATUS FspFsvolReadNonCached(
FspFileNodeRelease(FileNode, Full); FspFileNodeRelease(FileNode, Full);
return Result; 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; Request->Kind = FspFsctlTransactReadKind;
Request->Req.Read.UserContext = FileNode->UserContext; Request->Req.Read.UserContext = FileNode->UserContext;

View File

@ -333,9 +333,9 @@ static NTSTATUS FspFsvolWriteNonCached(
} }
} }
/* delete any work item if present! */ Request = FspIrpRequest(Irp);
FspIrpDeleteRequest(Irp); if (0 == Request)
{
/* create request */ /* create request */
Result = FspIopCreateRequestEx(Irp, 0, 0, FspFsvolWriteNonCachedRequestFini, &Request); Result = FspIopCreateRequestEx(Irp, 0, 0, FspFsvolWriteNonCachedRequestFini, &Request);
if (!NT_SUCCESS(Result)) if (!NT_SUCCESS(Result))
@ -343,6 +343,17 @@ static NTSTATUS FspFsvolWriteNonCached(
FspFileNodeRelease(FileNode, Full); FspFileNodeRelease(FileNode, Full);
return Result; 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->Kind = FspFsctlTransactWriteKind;
Request->Req.Write.UserContext = FileNode->UserContext; Request->Req.Write.UserContext = FileNode->UserContext;