sys: FspIopPostWorkRequestBestEffort

This commit is contained in:
Bill Zissimopoulos 2016-01-05 16:24:10 -08:00
parent bd5b1e59c1
commit 0bfd946edb
5 changed files with 19 additions and 9 deletions

View File

@ -94,7 +94,11 @@ static NTSTATUS FspFsvolCleanup(
* from our perspective, because they mean that the file system is going * from our perspective, because they mean that the file system is going
* away and should correctly tear things down. * away and should correctly tear things down.
*/ */
if (FspIoqPostIrpNoCap(FsvolDeviceExtension->Ioq, Irp, 0))
return STATUS_PENDING; return STATUS_PENDING;
else
return STATUS_SUCCESS;
} }
VOID FspFsvolCleanupComplete( VOID FspFsvolCleanupComplete(

View File

@ -62,7 +62,7 @@ static NTSTATUS FspFsvolClose(
FspFileContextRelease(FsContext); FspFileContextRelease(FsContext);
/* create the user-mode file system request; MustSucceed because IRP_MJ_CLOSE cannot fail */ /* create the user-mode file system request; MustSucceed because IRP_MJ_CLOSE cannot fail */
FspIopCreateRequestMustSucceed(Irp, FileNameRequired ? &FsContext->FileName : 0, 0, &Request); FspIopCreateRequestMustSucceed(0, FileNameRequired ? &FsContext->FileName : 0, 0, &Request);
/* populate the Close request */ /* populate the Close request */
Request->Kind = FspFsctlTransactCloseKind; Request->Kind = FspFsctlTransactCloseKind;
@ -70,10 +70,10 @@ static NTSTATUS FspFsvolClose(
Request->Req.Close.UserContext2 = UserContext2; Request->Req.Close.UserContext2 = UserContext2;
/* /*
* Post as a MustSucceed work request. This allows us to complete our own IRP * Post as a BestEffort work request. This allows us to complete our own IRP
* and return immediately. * and return immediately.
*/ */
FspIopPostWorkRequestMustSucceed(FsvolDeviceObject, Request); FspIopPostWorkRequestBestEffort(FsvolDeviceObject, Request);
/* /*
* Note that it is still possible for this request to not be delivered, * Note that it is still possible for this request to not be delivered,

View File

@ -377,6 +377,8 @@ PIRP FspIoqEndProcessingIrp(FSP_IOQ *Ioq, UINT_PTR IrpHint);
/* I/O processing */ /* I/O processing */
#define FSP_FSCTL_WORK \ #define FSP_FSCTL_WORK \
CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 'W', METHOD_NEITHER, FILE_ANY_ACCESS) CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 'W', METHOD_NEITHER, FILE_ANY_ACCESS)
#define FSP_FSCTL_WORK_BEST_EFFORT \
CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 'w', METHOD_NEITHER, FILE_ANY_ACCESS)
#define FspIopCreateRequest(I, F, E, P) \ #define FspIopCreateRequest(I, F, E, P) \
FspIopCreateRequestFunnel(I, F, E, 0, FALSE, P) FspIopCreateRequestFunnel(I, F, E, 0, FALSE, P)
#define FspIopCreateRequestMustSucceed(I, F, E, P)\ #define FspIopCreateRequestMustSucceed(I, F, E, P)\
@ -386,7 +388,7 @@ PIRP FspIoqEndProcessingIrp(FSP_IOQ *Ioq, UINT_PTR IrpHint);
#define FspIopRequestContext(Request, I)\ #define FspIopRequestContext(Request, I)\
(*FspIopRequestContextAddress(Request, I)) (*FspIopRequestContextAddress(Request, I))
#define FspIopPostWorkRequest(D, R) FspIopPostWorkRequestFunnel(D, R, FALSE) #define FspIopPostWorkRequest(D, R) FspIopPostWorkRequestFunnel(D, R, FALSE)
#define FspIopPostWorkRequestMustSucceed(D, R)\ #define FspIopPostWorkRequestBestEffort(D, R)\
FspIopPostWorkRequestFunnel(D, R, TRUE) FspIopPostWorkRequestFunnel(D, R, TRUE)
#define FspIopCompleteIrp(I, R) FspIopCompleteIrpEx(I, R, TRUE) #define FspIopCompleteIrp(I, R) FspIopCompleteIrpEx(I, R, TRUE)
typedef VOID FSP_IOP_REQUEST_FINI(PVOID Context[3]); typedef VOID FSP_IOP_REQUEST_FINI(PVOID Context[3]);
@ -397,7 +399,7 @@ NTSTATUS FspIopCreateRequestFunnel(
VOID FspIopDeleteRequest(FSP_FSCTL_TRANSACT_REQ *Request); VOID FspIopDeleteRequest(FSP_FSCTL_TRANSACT_REQ *Request);
PVOID *FspIopRequestContextAddress(FSP_FSCTL_TRANSACT_REQ *Request, ULONG I); PVOID *FspIopRequestContextAddress(FSP_FSCTL_TRANSACT_REQ *Request, ULONG I);
NTSTATUS FspIopPostWorkRequestFunnel(PDEVICE_OBJECT DeviceObject, NTSTATUS FspIopPostWorkRequestFunnel(PDEVICE_OBJECT DeviceObject,
FSP_FSCTL_TRANSACT_REQ *Request, BOOLEAN AllocateIrpMustSucceed); FSP_FSCTL_TRANSACT_REQ *Request, BOOLEAN BestEffort);
VOID FspIopCompleteIrpEx(PIRP Irp, NTSTATUS Result, BOOLEAN DeviceRelease); VOID FspIopCompleteIrpEx(PIRP Irp, NTSTATUS Result, BOOLEAN DeviceRelease);
VOID FspIopCompleteCanceledIrp(PIRP Irp); VOID FspIopCompleteCanceledIrp(PIRP Irp);
NTSTATUS FspIopDispatchPrepare(PIRP Irp, FSP_FSCTL_TRANSACT_REQ *Request); NTSTATUS FspIopDispatchPrepare(PIRP Irp, FSP_FSCTL_TRANSACT_REQ *Request);

View File

@ -61,6 +61,7 @@ static NTSTATUS FspFsvolFileSystemControl(
switch (IrpSp->Parameters.FileSystemControl.FsControlCode) switch (IrpSp->Parameters.FileSystemControl.FsControlCode)
{ {
case FSP_FSCTL_WORK: case FSP_FSCTL_WORK:
case FSP_FSCTL_WORK_BEST_EFFORT:
Result = FspVolumeWork(DeviceObject, Irp, IrpSp); Result = FspVolumeWork(DeviceObject, Irp, IrpSp);
break; break;
} }

View File

@ -606,7 +606,9 @@ NTSTATUS FspVolumeWork(
ASSERT(IRP_MJ_FILE_SYSTEM_CONTROL == IrpSp->MajorFunction); ASSERT(IRP_MJ_FILE_SYSTEM_CONTROL == IrpSp->MajorFunction);
ASSERT(IRP_MN_USER_FS_REQUEST == IrpSp->MinorFunction); ASSERT(IRP_MN_USER_FS_REQUEST == IrpSp->MinorFunction);
ASSERT(FSP_FSCTL_TRANSACT == IrpSp->Parameters.FileSystemControl.FsControlCode); ASSERT(
FSP_FSCTL_WORK == IrpSp->Parameters.FileSystemControl.FsControlCode ||
FSP_FSCTL_WORK_BEST_EFFORT == IrpSp->Parameters.FileSystemControl.FsControlCode);
if (KernelMode != Irp->RequestorMode) if (KernelMode != Irp->RequestorMode)
return STATUS_INVALID_DEVICE_REQUEST; return STATUS_INVALID_DEVICE_REQUEST;
@ -614,6 +616,7 @@ NTSTATUS FspVolumeWork(
NTSTATUS Result; NTSTATUS Result;
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(FsvolDeviceObject); FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(FsvolDeviceObject);
FSP_FSCTL_TRANSACT_REQ *Request = IrpSp->Parameters.FileSystemControl.Type3InputBuffer; FSP_FSCTL_TRANSACT_REQ *Request = IrpSp->Parameters.FileSystemControl.Type3InputBuffer;
BOOLEAN BestEffort = FSP_FSCTL_WORK_BEST_EFFORT == IrpSp->Parameters.FileSystemControl.FsControlCode;
ASSERT(0 == Request->Hint); ASSERT(0 == Request->Hint);
@ -622,11 +625,11 @@ NTSTATUS FspVolumeWork(
FspIrpRequest(Irp) = Request; FspIrpRequest(Irp) = Request;
/* /*
* Post the IRP to our Ioq; we do this here instead of at IRP_LEAVE_MJ time, * Post the IRP to our Ioq; we do this here instead of at FSP_LEAVE_MJ time,
* so that we can disassociate the Request on failure and release ownership * so that we can disassociate the Request on failure and release ownership
* back to the caller. * back to the caller.
*/ */
if (!FspIoqPostIrp(FsvolDeviceExtension->Ioq, Irp, &Result)) if (!FspIoqPostIrpEx(FsvolDeviceExtension->Ioq, Irp, !BestEffort, &Result))
{ {
Request->Hint = 0; Request->Hint = 0;
FspIrpRequest(Irp) = 0; FspIrpRequest(Irp) = 0;