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
|
* 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.
|
||||||
*/
|
*/
|
||||||
return STATUS_PENDING;
|
|
||||||
|
if (FspIoqPostIrpNoCap(FsvolDeviceExtension->Ioq, Irp, 0))
|
||||||
|
return STATUS_PENDING;
|
||||||
|
else
|
||||||
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID FspFsvolCleanupComplete(
|
VOID FspFsvolCleanupComplete(
|
||||||
|
@ -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,
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user