mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-24 01:13:04 -05:00
sys: FspIopPostWorkRequestBestEffort
This commit is contained in:
parent
bd5b1e59c1
commit
0bfd946edb
@ -94,7 +94,11 @@ static NTSTATUS FspFsvolCleanup(
|
||||
* from our perspective, because they mean that the file system is going
|
||||
* away and should correctly tear things down.
|
||||
*/
|
||||
|
||||
if (FspIoqPostIrpNoCap(FsvolDeviceExtension->Ioq, Irp, 0))
|
||||
return STATUS_PENDING;
|
||||
else
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
VOID FspFsvolCleanupComplete(
|
||||
|
@ -62,7 +62,7 @@ static NTSTATUS FspFsvolClose(
|
||||
FspFileContextRelease(FsContext);
|
||||
|
||||
/* 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 */
|
||||
Request->Kind = FspFsctlTransactCloseKind;
|
||||
@ -70,10 +70,10 @@ static NTSTATUS FspFsvolClose(
|
||||
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.
|
||||
*/
|
||||
FspIopPostWorkRequestMustSucceed(FsvolDeviceObject, Request);
|
||||
FspIopPostWorkRequestBestEffort(FsvolDeviceObject, Request);
|
||||
|
||||
/*
|
||||
* Note that it is still possible for this request to not be delivered,
|
||||
|
@ -377,6 +377,8 @@ PIRP FspIoqEndProcessingIrp(FSP_IOQ *Ioq, UINT_PTR IrpHint);
|
||||
/* I/O processing */
|
||||
#define FSP_FSCTL_WORK \
|
||||
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) \
|
||||
FspIopCreateRequestFunnel(I, F, E, 0, FALSE, P)
|
||||
#define FspIopCreateRequestMustSucceed(I, F, E, P)\
|
||||
@ -386,7 +388,7 @@ PIRP FspIoqEndProcessingIrp(FSP_IOQ *Ioq, UINT_PTR IrpHint);
|
||||
#define FspIopRequestContext(Request, I)\
|
||||
(*FspIopRequestContextAddress(Request, I))
|
||||
#define FspIopPostWorkRequest(D, R) FspIopPostWorkRequestFunnel(D, R, FALSE)
|
||||
#define FspIopPostWorkRequestMustSucceed(D, R)\
|
||||
#define FspIopPostWorkRequestBestEffort(D, R)\
|
||||
FspIopPostWorkRequestFunnel(D, R, TRUE)
|
||||
#define FspIopCompleteIrp(I, R) FspIopCompleteIrpEx(I, R, TRUE)
|
||||
typedef VOID FSP_IOP_REQUEST_FINI(PVOID Context[3]);
|
||||
@ -397,7 +399,7 @@ NTSTATUS FspIopCreateRequestFunnel(
|
||||
VOID FspIopDeleteRequest(FSP_FSCTL_TRANSACT_REQ *Request);
|
||||
PVOID *FspIopRequestContextAddress(FSP_FSCTL_TRANSACT_REQ *Request, ULONG I);
|
||||
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 FspIopCompleteCanceledIrp(PIRP Irp);
|
||||
NTSTATUS FspIopDispatchPrepare(PIRP Irp, FSP_FSCTL_TRANSACT_REQ *Request);
|
||||
|
@ -61,6 +61,7 @@ static NTSTATUS FspFsvolFileSystemControl(
|
||||
switch (IrpSp->Parameters.FileSystemControl.FsControlCode)
|
||||
{
|
||||
case FSP_FSCTL_WORK:
|
||||
case FSP_FSCTL_WORK_BEST_EFFORT:
|
||||
Result = FspVolumeWork(DeviceObject, Irp, IrpSp);
|
||||
break;
|
||||
}
|
||||
|
@ -606,7 +606,9 @@ NTSTATUS FspVolumeWork(
|
||||
|
||||
ASSERT(IRP_MJ_FILE_SYSTEM_CONTROL == IrpSp->MajorFunction);
|
||||
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)
|
||||
return STATUS_INVALID_DEVICE_REQUEST;
|
||||
@ -614,6 +616,7 @@ NTSTATUS FspVolumeWork(
|
||||
NTSTATUS Result;
|
||||
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(FsvolDeviceObject);
|
||||
FSP_FSCTL_TRANSACT_REQ *Request = IrpSp->Parameters.FileSystemControl.Type3InputBuffer;
|
||||
BOOLEAN BestEffort = FSP_FSCTL_WORK_BEST_EFFORT == IrpSp->Parameters.FileSystemControl.FsControlCode;
|
||||
|
||||
ASSERT(0 == Request->Hint);
|
||||
|
||||
@ -622,11 +625,11 @@ NTSTATUS FspVolumeWork(
|
||||
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
|
||||
* back to the caller.
|
||||
*/
|
||||
if (!FspIoqPostIrp(FsvolDeviceExtension->Ioq, Irp, &Result))
|
||||
if (!FspIoqPostIrpEx(FsvolDeviceExtension->Ioq, Irp, !BestEffort, &Result))
|
||||
{
|
||||
Request->Hint = 0;
|
||||
FspIrpRequest(Irp) = 0;
|
||||
|
Loading…
x
Reference in New Issue
Block a user