From 0cf70387ff09dd7e7d39ef5d094e2ddf9ab1a172 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Wed, 16 Mar 2016 00:29:30 -0700 Subject: [PATCH] sys: FspVolumeTransact: timeout early if there are retried IRP completions (to avoid stalling unnecessarily) --- src/sys/driver.h | 1 + src/sys/volume.c | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/sys/driver.h b/src/sys/driver.h index 22408acb..cc5a97bd 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -730,6 +730,7 @@ VOID FspDeviceDeleteAll(VOID); // STATUS_VOLUME_DISMOUNTED : STATUS_DEVICE_NOT_CONNECTED) /* volume management */ +#define FspVolumeTransactEarlyTimeout (1 * 10000ULL) NTSTATUS FspVolumeCreate( PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp); VOID FspVolumeDelete( diff --git a/src/sys/volume.c b/src/sys/volume.c index 43e8f811..8e04e671 100644 --- a/src/sys/volume.c +++ b/src/sys/volume.c @@ -619,7 +619,9 @@ NTSTATUS FspVolumeTransact( /* wait for an IRP to arrive */ KeQuerySystemTime(&Timeout); - Timeout.QuadPart += FsvolDeviceExtension->VolumeParams.TransactTimeout * 10000ULL; + Timeout.QuadPart += 0 == RepostedIrp ? + FsvolDeviceExtension->VolumeParams.TransactTimeout * 10000ULL : + FspVolumeTransactEarlyTimeout; /* convert millis to nanos and add to absolute time */ while (0 == (PendingIrp = FspIoqNextPendingIrp(FsvolDeviceExtension->Ioq, 0, &Timeout, Irp))) {