diff --git a/src/sys/cleanup.c b/src/sys/cleanup.c index 48c27882..694bec47 100644 --- a/src/sys/cleanup.c +++ b/src/sys/cleanup.c @@ -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. */ - return STATUS_PENDING; + + if (FspIoqPostIrpNoCap(FsvolDeviceExtension->Ioq, Irp, 0)) + return STATUS_PENDING; + else + return STATUS_SUCCESS; } VOID FspFsvolCleanupComplete( diff --git a/src/sys/close.c b/src/sys/close.c index eed7ab56..b10bb5d2 100644 --- a/src/sys/close.c +++ b/src/sys/close.c @@ -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, diff --git a/src/sys/driver.h b/src/sys/driver.h index 89ab6e3b..0ecb5a7e 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -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); diff --git a/src/sys/fsctl.c b/src/sys/fsctl.c index b785caae..d9c57c8b 100644 --- a/src/sys/fsctl.c +++ b/src/sys/fsctl.c @@ -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; } diff --git a/src/sys/volume.c b/src/sys/volume.c index 2e2c4230..e4cb25a0 100644 --- a/src/sys/volume.c +++ b/src/sys/volume.c @@ -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;