mirror of
				https://github.com/winfsp/winfsp.git
				synced 2025-10-29 19:18:39 -05:00 
			
		
		
		
	sys: FspIopPostWorkRequestBestEffort
This commit is contained in:
		| @@ -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( | ||||
|   | ||||
| @@ -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; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user