From 254174b8e94c063f8d15bb86f5b55ac123a7953c Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Mon, 4 Nov 2019 16:30:30 -0800 Subject: [PATCH] sys: avoid using FspFsextProvider unnecessarily --- src/sys/device.c | 16 +++++----------- src/sys/driver.h | 1 + src/sys/fsext.c | 16 +--------------- src/sys/volume.c | 9 ++++----- 4 files changed, 11 insertions(+), 31 deletions(-) diff --git a/src/sys/device.c b/src/sys/device.c index 952187e6..859822f6 100644 --- a/src/sys/device.c +++ b/src/sys/device.c @@ -340,6 +340,7 @@ static NTSTATUS FspFsvolDeviceInit(PDEVICE_OBJECT DeviceObject) Result = Provider->DeviceInit(DeviceObject, &FsvolDeviceExtension->VolumeParams); if (!NT_SUCCESS(Result)) return Result; + FsvolDeviceExtension->Provider = Provider; FsvolDeviceExtension->InitDoneFsext = 1; } else @@ -525,10 +526,8 @@ static VOID FspFsvolDeviceFini(PDEVICE_OBJECT DeviceObject) /* finalize any fsext provider */ if (FsvolDeviceExtension->InitDoneFsext) { - FSP_FSEXT_PROVIDER *Provider = FspFsextProvider( - FsvolDeviceExtension->VolumeParams.FsextControlCode, 0); - if (0 != Provider) - Provider->DeviceFini(DeviceObject); + if (0 != FsvolDeviceExtension->Provider) + FsvolDeviceExtension->Provider->DeviceFini(DeviceObject); } } @@ -577,13 +576,8 @@ static VOID FspFsvolDeviceExpirationRoutine(PVOID Context) FspMetaCacheInvalidateExpired(FsvolDeviceExtension->DirInfoCache, InterruptTime); FspMetaCacheInvalidateExpired(FsvolDeviceExtension->StreamInfoCache, InterruptTime); /* run any fsext provider expiration routine */ - if (0 != FsvolDeviceExtension->VolumeParams.FsextControlCode) - { - FSP_FSEXT_PROVIDER *Provider = FspFsextProvider( - FsvolDeviceExtension->VolumeParams.FsextControlCode, 0); - if (0 != Provider) - Provider->DeviceExpirationRoutine(DeviceObject, InterruptTime); - } + if (0 != FsvolDeviceExtension->Provider) + FsvolDeviceExtension->Provider->DeviceExpirationRoutine(DeviceObject, InterruptTime); FspIoqRemoveExpired(FsvolDeviceExtension->Ioq, InterruptTime); KeAcquireSpinLock(&FsvolDeviceExtension->ExpirationLock, &Irql); diff --git a/src/sys/driver.h b/src/sys/driver.h index 787c87d8..c04e9858 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -1079,6 +1079,7 @@ typedef struct PVPB SwapVpb; FSP_DELAYED_WORK_ITEM DeleteVolumeDelayedWorkItem; FSP_FSCTL_VOLUME_PARAMS VolumeParams; + FSP_FSEXT_PROVIDER *Provider; UNICODE_STRING VolumePrefix; UNICODE_PREFIX_TABLE_ENTRY VolumePrefixEntry; FSP_IOQ *Ioq; diff --git a/src/sys/fsext.c b/src/sys/fsext.c index 0be629c4..e4faacb0 100644 --- a/src/sys/fsext.c +++ b/src/sys/fsext.c @@ -28,7 +28,7 @@ * the data structure used to store providers (currently 2 parallel * arrays) must be revisited. */ -#define FSP_FSEXT_PROVIDER_COUNTMAX 4 +#define FSP_FSEXT_PROVIDER_COUNTMAX 16 static KSPIN_LOCK FsextSpinLock = 0; static UINT32 FsextControlCodes[FSP_FSEXT_PROVIDER_COUNTMAX]; @@ -37,23 +37,9 @@ static FSP_FSEXT_PROVIDER *FsextProviders[FSP_FSEXT_PROVIDER_COUNTMAX]; static inline FSP_FSEXT_PROVIDER *FspFsextProviderGet(UINT32 FsextControlCode) { -#if 0 for (ULONG I = 0; FSP_FSEXT_PROVIDER_COUNTMAX > I; I++) if (FsextControlCode == FsextControlCodes[I]) return FsextProviders[I]; -#else - /* unroll by hand */ - FSP_FSCTL_STATIC_ASSERT(4 == FSP_FSEXT_PROVIDER_COUNTMAX, - "unrolled loop expects FsextProviders to have 4 elements"); - if (FsextControlCode == FsextControlCodes[0]) - return FsextProviders[0]; - if (FsextControlCode == FsextControlCodes[1]) - return FsextProviders[1]; - if (FsextControlCode == FsextControlCodes[2]) - return FsextProviders[2]; - if (FsextControlCode == FsextControlCodes[3]) - return FsextProviders[3]; -#endif return 0; } diff --git a/src/sys/volume.c b/src/sys/volume.c index 3292d35c..bf78785f 100644 --- a/src/sys/volume.c +++ b/src/sys/volume.c @@ -992,14 +992,13 @@ NTSTATUS FspVolumeTransactFsext( if (!FspDeviceReference(FsvolDeviceObject)) return STATUS_CANCELLED; + FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(FsvolDeviceObject); NTSTATUS Result = STATUS_INVALID_DEVICE_REQUEST; if (IrpSp->Parameters.FileSystemControl.FsControlCode == - FspFsvolDeviceExtension(FsvolDeviceObject)->VolumeParams.FsextControlCode) + FsvolDeviceExtension->VolumeParams.FsextControlCode) { - FSP_FSEXT_PROVIDER *Provider = FspFsextProvider( - IrpSp->Parameters.FileSystemControl.FsControlCode, 0); - if (0 != Provider) - Result = Provider->DeviceTransact(FsvolDeviceObject, Irp); + if (0 != FsvolDeviceExtension->Provider) + Result = FsvolDeviceExtension->Provider->DeviceTransact(FsvolDeviceObject, Irp); } FspDeviceDereference(FsvolDeviceObject);