mirror of
				https://github.com/winfsp/winfsp.git
				synced 2025-10-30 19:48:38 -05:00 
			
		
		
		
	sys: FspFsvolClose: convert CLOSE requests to synchronous when above the IOQ watermark
This commit is contained in:
		| @@ -84,8 +84,9 @@ static NTSTATUS FspFsvolClose( | ||||
|     FspFileDescDelete(FileDesc); /* this will also close the MainFileObject if any */ | ||||
|     FspFileNodeDereference(FileNode); | ||||
|  | ||||
|     /* if we are closing files in the context of a rename make it synchronous */ | ||||
|     if (FspFsvolDeviceFileRenameIsAcquiredExclusive(FsvolDeviceObject)) | ||||
|     /* if closing in the context of a rename or IOQ is above the watermark make it synchronous */ | ||||
|     if (FspFsvolDeviceFileRenameIsAcquiredExclusive(FsvolDeviceObject) || | ||||
|         FspIoqPendingAboveWatermark(FspFsvolDeviceExtension(FsvolDeviceObject)->Ioq, 50)) | ||||
|     { | ||||
|         /* acquire ownership of the Request */ | ||||
|         Request->Hint = (UINT_PTR)Irp; | ||||
|   | ||||
| @@ -953,6 +953,7 @@ BOOLEAN FspIoqPostIrpEx(FSP_IOQ *Ioq, PIRP Irp, BOOLEAN BestEffort, NTSTATUS *PR | ||||
| PIRP FspIoqNextPendingIrp(FSP_IOQ *Ioq, PIRP BoundaryIrp, PLARGE_INTEGER Timeout, | ||||
|     PIRP CancellableIrp); | ||||
| ULONG FspIoqPendingIrpCount(FSP_IOQ *Ioq); | ||||
| BOOLEAN FspIoqPendingAboveWatermark(FSP_IOQ *Ioq, ULONG Watermark); | ||||
| BOOLEAN FspIoqStartProcessingIrp(FSP_IOQ *Ioq, PIRP Irp); | ||||
| PIRP FspIoqEndProcessingIrp(FSP_IOQ *Ioq, UINT_PTR IrpHint); | ||||
| ULONG FspIoqProcessIrpCount(FSP_IOQ *Ioq); | ||||
|   | ||||
| @@ -643,6 +643,16 @@ ULONG FspIoqPendingIrpCount(FSP_IOQ *Ioq) | ||||
|     return Result; | ||||
| } | ||||
|  | ||||
| BOOLEAN FspIoqPendingAboveWatermark(FSP_IOQ *Ioq, ULONG Watermark) | ||||
| { | ||||
|     BOOLEAN Result; | ||||
|     KIRQL Irql; | ||||
|     KeAcquireSpinLock(&Ioq->SpinLock, &Irql); | ||||
|     Result = Watermark < 100 * Ioq->PendingIrpCount / Ioq->PendingIrpCapacity; | ||||
|     KeReleaseSpinLock(&Ioq->SpinLock, Irql); | ||||
|     return Result; | ||||
| } | ||||
|  | ||||
| BOOLEAN FspIoqStartProcessingIrp(FSP_IOQ *Ioq, PIRP Irp) | ||||
| { | ||||
|     NTSTATUS Result; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user