From b729500d7b16c59c03f9e14ef16601bb994bc0ea Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Wed, 6 Apr 2016 13:40:32 -0700 Subject: [PATCH] sys: FspIrpDeleteRequest --- src/sys/dirctl.c | 2 +- src/sys/driver.h | 11 ++++++++++- src/sys/iop.c | 3 +++ src/sys/read.c | 3 +++ src/sys/wq.c | 12 ------------ src/sys/write.c | 3 +++ 6 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/sys/dirctl.c b/src/sys/dirctl.c index b7d8b239..44f37a19 100644 --- a/src/sys/dirctl.c +++ b/src/sys/dirctl.c @@ -424,7 +424,7 @@ static NTSTATUS FspFsvolQueryDirectoryRetry( /* if we have been retried reset our work item now! */ if (0 != Request) { - FspWqDeleteIrpWorkItem(Irp); + FspIrpDeleteRequest(Irp); Request = 0; } diff --git a/src/sys/driver.h b/src/sys/driver.h index 7cb13de3..f45b4126 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -643,6 +643,16 @@ BOOLEAN FspIopRetryCompleteIrp(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response, FSP_FSCTL_TRANSACT_RSP *FspIopIrpResponse(PIRP Irp); NTSTATUS FspIopDispatchPrepare(PIRP Irp, FSP_FSCTL_TRANSACT_REQ *Request); NTSTATUS FspIopDispatchComplete(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response); +static inline +VOID FspIrpDeleteRequest(PIRP Irp) +{ + FSP_FSCTL_TRANSACT_REQ *Request = FspIrpRequest(Irp); + if (0 != Request) + { + FspIopDeleteRequest(Request); + FspIrpSetRequest(Irp, 0); + } +} /* work queue processing */ enum @@ -655,7 +665,6 @@ typedef NTSTATUS FSP_WQ_REQUEST_WORK( NTSTATUS FspWqCreateAndPostIrpWorkItem(PIRP Irp, FSP_WQ_REQUEST_WORK *WorkRoutine, FSP_IOP_REQUEST_FINI *RequestFini, BOOLEAN CreateAndPost); -VOID FspWqDeleteIrpWorkItem(PIRP Irp); VOID FspWqPostIrpWorkItem(PIRP Irp); #define FspWqCreateIrpWorkItem(I, RW, RF)\ FspWqCreateAndPostIrpWorkItem(I, RW, RF, FALSE) diff --git a/src/sys/iop.c b/src/sys/iop.c index ddcb3860..f70a37e1 100644 --- a/src/sys/iop.c +++ b/src/sys/iop.c @@ -95,7 +95,10 @@ NTSTATUS FspIopCreateRequestFunnel( } if (0 != Irp) + { + ASSERT(0 == FspIrpRequest(Irp)); FspIrpSetRequest(Irp, Request); + } *PRequest = Request; return STATUS_SUCCESS; diff --git a/src/sys/read.c b/src/sys/read.c index 278afd25..8b05ce0b 100644 --- a/src/sys/read.c +++ b/src/sys/read.c @@ -257,6 +257,9 @@ 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)) diff --git a/src/sys/wq.c b/src/sys/wq.c index 7ac5c171..cade0147 100644 --- a/src/sys/wq.c +++ b/src/sys/wq.c @@ -50,18 +50,6 @@ NTSTATUS FspWqCreateAndPostIrpWorkItem(PIRP Irp, return STATUS_PENDING; } -VOID FspWqDeleteIrpWorkItem(PIRP Irp) -{ - FSP_FSCTL_TRANSACT_REQ *RequestWorkItem = FspIrpRequest(Irp); - - ASSERT(RequestWorkItem->Kind == FspFsctlTransactReservedKind); - ASSERT(RequestWorkItem->Size == sizeof *RequestWorkItem + sizeof(WORK_QUEUE_ITEM)); - ASSERT(RequestWorkItem->Hint == (UINT_PTR)Irp); - - FspIopDeleteRequest(RequestWorkItem); - FspIrpSetRequest(Irp, 0); -} - VOID FspWqPostIrpWorkItem(PIRP Irp) { FSP_FSCTL_TRANSACT_REQ *RequestWorkItem = FspIrpRequest(Irp); diff --git a/src/sys/write.c b/src/sys/write.c index 9f73d6f9..ba14b35e 100644 --- a/src/sys/write.c +++ b/src/sys/write.c @@ -320,6 +320,9 @@ static NTSTATUS FspFsvolWriteNonCached( } } + /* delete any work item if present! */ + FspIrpDeleteRequest(Irp); + /* create request */ Result = FspIopCreateRequestEx(Irp, 0, 0, FspFsvolWriteNonCachedRequestFini, &Request); if (!NT_SUCCESS(Result))