From 781deff06f378bdf15f9745276c237c3d61da940 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Tue, 11 Jun 2019 17:53:34 -0700 Subject: [PATCH] sys: default TransactTimeout changes --- inc/winfsp/fsctl.h | 4 ++-- src/sys/driver.h | 1 - src/sys/ioq.c | 6 ++++++ src/sys/volume.c | 12 +++++++----- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/inc/winfsp/fsctl.h b/inc/winfsp/fsctl.h index 8821200d..f2b083e6 100644 --- a/inc/winfsp/fsctl.h +++ b/inc/winfsp/fsctl.h @@ -121,7 +121,7 @@ enum { FspFsctlTransactTimeoutMinimum = 1000, FspFsctlTransactTimeoutMaximum = 10000, - FspFsctlTransactTimeoutDefault = 1000, + FspFsctlTransactTimeoutDefault = 1000, /* DEPRECATED: default is unspecified */ FspFsctlIrpTimeoutMinimum = 60000, FspFsctlIrpTimeoutMaximum = 600000, FspFsctlIrpTimeoutDefault = 300000, @@ -139,7 +139,7 @@ enum UINT64 VolumeCreationTime;\ UINT32 VolumeSerialNumber;\ /* I/O timeouts, capacity, etc. */\ - UINT32 TransactTimeout; /* FSP_FSCTL_TRANSACT timeout (millis; 1 sec - 10 sec) */\ + UINT32 TransactTimeout; /* DEPRECATED: (millis; 1 sec - 10 sec) */\ UINT32 IrpTimeout; /* pending IRP timeout (millis; 1 min - 10 min) */\ UINT32 IrpCapacity; /* maximum number of pending IRP's (100 - 1000)*/\ UINT32 FileInfoTimeout; /* FileInfo/Security/VolumeInfo timeout (millis) */\ diff --git a/src/sys/driver.h b/src/sys/driver.h index 4b7068ec..973c8ae0 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -1216,7 +1216,6 @@ NTSTATUS FspMupHandleIrp( PDEVICE_OBJECT FsmupDeviceObject, PIRP Irp); /* volume management */ -#define FspVolumeTransactEarlyTimeout (1 * 10000ULL) NTSTATUS FspVolumeCreate( PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp); VOID FspVolumeDelete( diff --git a/src/sys/ioq.c b/src/sys/ioq.c index 2fcf82b5..8e7632d7 100644 --- a/src/sys/ioq.c +++ b/src/sys/ioq.c @@ -688,6 +688,12 @@ BOOLEAN FspIoqRetryCompleteIrp(FSP_IOQ *Ioq, PIRP Irp, NTSTATUS *PResult) Result = FspCsqInsertIrpEx(&Ioq->RetriedIoCsq, Irp, 0, 0); if (NT_SUCCESS(Result)) { + /* wake up a waiter */ + KIRQL Irql; + KeAcquireSpinLock(&Ioq->SpinLock, &Irql); + FspIoqEventSet(&Ioq->PendingIrpEvent); + KeReleaseSpinLock(&Ioq->SpinLock, Irql); + if (0 != PResult) *PResult = STATUS_PENDING; return TRUE; diff --git a/src/sys/volume.c b/src/sys/volume.c index 3ea77490..6cfc645c 100644 --- a/src/sys/volume.c +++ b/src/sys/volume.c @@ -132,7 +132,9 @@ static NTSTATUS FspVolumeCreateNoLock( VolumeParams.SectorsPerAllocationUnit = 1; if (0 == VolumeParams.MaxComponentLength) VolumeParams.MaxComponentLength = 255; - if (FspFsctlTransactTimeoutMinimum > VolumeParams.TransactTimeout || + if (0 == VolumeParams.TransactTimeout) + VolumeParams.TransactTimeout = 24 * 60 * 60 * 1000; /* 1 day */ + else if (FspFsctlTransactTimeoutMinimum > VolumeParams.TransactTimeout || VolumeParams.TransactTimeout > FspFsctlTransactTimeoutMaximum) VolumeParams.TransactTimeout = FspFsctlTransactTimeoutDefault; if (FspFsctlIrpTimeoutMinimum > VolumeParams.IrpTimeout || @@ -770,17 +772,17 @@ NTSTATUS FspVolumeTransact( /* wait for an IRP to arrive */ KeQuerySystemTime(&Timeout); - Timeout.QuadPart += 0 == RepostedIrp ? - FsvolDeviceExtension->VolumeParams.TransactTimeout * 10000ULL : - FspVolumeTransactEarlyTimeout; + Timeout.QuadPart += FsvolDeviceExtension->VolumeParams.TransactTimeout * 10000ULL; /* convert millis to nanos and add to absolute time */ - while (0 == (PendingIrp = FspIoqNextPendingIrp(FsvolDeviceExtension->Ioq, 0, &Timeout, Irp))) + if (0 == (PendingIrp = FspIoqNextPendingIrp(FsvolDeviceExtension->Ioq, 0, &Timeout, Irp))) { if (FspIoqStopped(FsvolDeviceExtension->Ioq)) { Result = STATUS_CANCELLED; goto exit; } + + PendingIrp = FspIoqTimeout; } if (FspIoqTimeout == PendingIrp || FspIoqCancelled == PendingIrp) {