sys: wq: FspWqOplockPrepare, FspWqOplockComplete

This commit is contained in:
Bill Zissimopoulos 2016-11-12 11:31:38 -08:00
parent 93254bede4
commit 7c34d738b7
2 changed files with 86 additions and 12 deletions

View File

@ -796,6 +796,8 @@ NTSTATUS FspWqCreateAndPostIrpWorkItem(PIRP Irp,
FSP_IOP_REQUEST_WORK *WorkRoutine, FSP_IOP_REQUEST_FINI *RequestFini,
BOOLEAN CreateAndPost);
VOID FspWqPostIrpWorkItem(PIRP Irp);
VOID FspWqOplockPrepare(PVOID Context, PIRP Irp);
VOID FspWqOplockComplete(PVOID Context, PIRP Irp);
#define FspWqCreateIrpWorkItem(I, RW, RF)\
FspWqCreateAndPostIrpWorkItem(I, RW, RF, FALSE)
#define FspWqRepostIrpWorkItem(I, RW, RF)\

View File

@ -17,16 +17,24 @@
#include <sys/driver.h>
static VOID FspWqWorkRoutine(PVOID Context);
NTSTATUS FspWqCreateAndPostIrpWorkItem(PIRP Irp,
FSP_IOP_REQUEST_WORK *WorkRoutine, FSP_IOP_REQUEST_FINI *RequestFini,
BOOLEAN CreateAndPost)
{
FSP_FSCTL_TRANSACT_REQ *Request = FspIrpRequest(Irp);
FSP_FSCTL_TRANSACT_REQ_WORK_ITEM *RequestWorkItem;
BOOLEAN CreateAndPost);
VOID FspWqPostIrpWorkItem(PIRP Irp);
static VOID FspWqWorkRoutine(PVOID Context);
VOID FspWqOplockPrepare(PVOID Context, PIRP Irp);
VOID FspWqOplockComplete(PVOID Context, PIRP Irp);
if (0 == Request)
#ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGE, FspWqCreateAndPostIrpWorkItem)
#pragma alloc_text(PAGE, FspWqPostIrpWorkItem)
#pragma alloc_text(PAGE, FspWqWorkRoutine)
#pragma alloc_text(PAGE, FspWqOplockPrepare)
#pragma alloc_text(PAGE, FspWqOplockComplete)
#endif
static inline
NTSTATUS FspWqPrepareIrpWorkItem(PIRP Irp)
{
NTSTATUS Result;
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
@ -43,6 +51,26 @@ NTSTATUS FspWqCreateAndPostIrpWorkItem(PIRP Irp,
return Result;
}
return STATUS_SUCCESS;
}
NTSTATUS FspWqCreateAndPostIrpWorkItem(PIRP Irp,
FSP_IOP_REQUEST_WORK *WorkRoutine, FSP_IOP_REQUEST_FINI *RequestFini,
BOOLEAN CreateAndPost)
{
PAGED_CODE();
FSP_FSCTL_TRANSACT_REQ *Request = FspIrpRequest(Irp);
FSP_FSCTL_TRANSACT_REQ_WORK_ITEM *RequestWorkItem;
if (0 == Request)
{
NTSTATUS Result;
Result = FspWqPrepareIrpWorkItem(Irp);
if (!NT_SUCCESS(Result))
return Result;
Result = FspIopCreateRequestAndWorkItem(Irp, 0, RequestFini, &Request);
if (!NT_SUCCESS(Result))
return Result;
@ -77,9 +105,26 @@ NTSTATUS FspWqCreateAndPostIrpWorkItem(PIRP Irp,
VOID FspWqPostIrpWorkItem(PIRP Irp)
{
PAGED_CODE();
FSP_FSCTL_TRANSACT_REQ *Request = FspIrpRequest(Irp);
FSP_FSCTL_TRANSACT_REQ_WORK_ITEM *RequestWorkItem = FspIopRequestWorkItem(Request);
#if DBG
switch (IoGetCurrentIrpStackLocation(Irp)->MajorFunction)
{
case IRP_MJ_CREATE:
ASSERT(0 != FspIopIrpResponse(Irp));
break;
case IRP_MJ_READ:
case IRP_MJ_WRITE:
case IRP_MJ_DIRECTORY_CONTROL:
case IRP_MJ_LOCK_CONTROL:
default:
ASSERT(0);
break;
}
#endif
ASSERT(Request->Hint == (UINT_PTR)Irp);
ASSERT(0 != RequestWorkItem);
ASSERT(0 != RequestWorkItem->WorkRoutine);
@ -90,6 +135,8 @@ VOID FspWqPostIrpWorkItem(PIRP Irp)
static VOID FspWqWorkRoutine(PVOID Context)
{
PAGED_CODE();
PIRP Irp = Context;
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
PDEVICE_OBJECT DeviceObject = IrpSp->DeviceObject;
@ -125,3 +172,28 @@ static VOID FspWqWorkRoutine(PVOID Context)
IoSetTopLevelIrp(0);
}
VOID FspWqOplockPrepare(PVOID Context, PIRP Irp)
{
PAGED_CODE();
NTSTATUS Result;
Result = FspWqPrepareIrpWorkItem(Irp);
if (!NT_SUCCESS(Result))
/*
* Only way to communicate failure is through ExRaiseStatus.
* We will catch it in FspCheckOplock, etc.
*/
ExRaiseStatus(Result);
}
VOID FspWqOplockComplete(PVOID Context, PIRP Irp)
{
PAGED_CODE();
if (STATUS_SUCCESS == Irp->IoStatus.Status)
FspWqPostIrpWorkItem(Irp);
else
FspIopCompleteIrp(Irp, Irp->IoStatus.Status);
}