sys: avoid using FspFsextProvider unnecessarily

This commit is contained in:
Bill Zissimopoulos 2019-11-04 16:30:30 -08:00
parent 5110b3c5a1
commit 254174b8e9
No known key found for this signature in database
GPG Key ID: 3D4F95D52C7B3EA3
4 changed files with 11 additions and 31 deletions

View File

@ -340,6 +340,7 @@ static NTSTATUS FspFsvolDeviceInit(PDEVICE_OBJECT DeviceObject)
Result = Provider->DeviceInit(DeviceObject, &FsvolDeviceExtension->VolumeParams); Result = Provider->DeviceInit(DeviceObject, &FsvolDeviceExtension->VolumeParams);
if (!NT_SUCCESS(Result)) if (!NT_SUCCESS(Result))
return Result; return Result;
FsvolDeviceExtension->Provider = Provider;
FsvolDeviceExtension->InitDoneFsext = 1; FsvolDeviceExtension->InitDoneFsext = 1;
} }
else else
@ -525,10 +526,8 @@ static VOID FspFsvolDeviceFini(PDEVICE_OBJECT DeviceObject)
/* finalize any fsext provider */ /* finalize any fsext provider */
if (FsvolDeviceExtension->InitDoneFsext) if (FsvolDeviceExtension->InitDoneFsext)
{ {
FSP_FSEXT_PROVIDER *Provider = FspFsextProvider( if (0 != FsvolDeviceExtension->Provider)
FsvolDeviceExtension->VolumeParams.FsextControlCode, 0); FsvolDeviceExtension->Provider->DeviceFini(DeviceObject);
if (0 != Provider)
Provider->DeviceFini(DeviceObject);
} }
} }
@ -577,13 +576,8 @@ static VOID FspFsvolDeviceExpirationRoutine(PVOID Context)
FspMetaCacheInvalidateExpired(FsvolDeviceExtension->DirInfoCache, InterruptTime); FspMetaCacheInvalidateExpired(FsvolDeviceExtension->DirInfoCache, InterruptTime);
FspMetaCacheInvalidateExpired(FsvolDeviceExtension->StreamInfoCache, InterruptTime); FspMetaCacheInvalidateExpired(FsvolDeviceExtension->StreamInfoCache, InterruptTime);
/* run any fsext provider expiration routine */ /* run any fsext provider expiration routine */
if (0 != FsvolDeviceExtension->VolumeParams.FsextControlCode) if (0 != FsvolDeviceExtension->Provider)
{ FsvolDeviceExtension->Provider->DeviceExpirationRoutine(DeviceObject, InterruptTime);
FSP_FSEXT_PROVIDER *Provider = FspFsextProvider(
FsvolDeviceExtension->VolumeParams.FsextControlCode, 0);
if (0 != Provider)
Provider->DeviceExpirationRoutine(DeviceObject, InterruptTime);
}
FspIoqRemoveExpired(FsvolDeviceExtension->Ioq, InterruptTime); FspIoqRemoveExpired(FsvolDeviceExtension->Ioq, InterruptTime);
KeAcquireSpinLock(&FsvolDeviceExtension->ExpirationLock, &Irql); KeAcquireSpinLock(&FsvolDeviceExtension->ExpirationLock, &Irql);

View File

@ -1079,6 +1079,7 @@ typedef struct
PVPB SwapVpb; PVPB SwapVpb;
FSP_DELAYED_WORK_ITEM DeleteVolumeDelayedWorkItem; FSP_DELAYED_WORK_ITEM DeleteVolumeDelayedWorkItem;
FSP_FSCTL_VOLUME_PARAMS VolumeParams; FSP_FSCTL_VOLUME_PARAMS VolumeParams;
FSP_FSEXT_PROVIDER *Provider;
UNICODE_STRING VolumePrefix; UNICODE_STRING VolumePrefix;
UNICODE_PREFIX_TABLE_ENTRY VolumePrefixEntry; UNICODE_PREFIX_TABLE_ENTRY VolumePrefixEntry;
FSP_IOQ *Ioq; FSP_IOQ *Ioq;

View File

@ -28,7 +28,7 @@
* the data structure used to store providers (currently 2 parallel * the data structure used to store providers (currently 2 parallel
* arrays) must be revisited. * arrays) must be revisited.
*/ */
#define FSP_FSEXT_PROVIDER_COUNTMAX 4 #define FSP_FSEXT_PROVIDER_COUNTMAX 16
static KSPIN_LOCK FsextSpinLock = 0; static KSPIN_LOCK FsextSpinLock = 0;
static UINT32 FsextControlCodes[FSP_FSEXT_PROVIDER_COUNTMAX]; static UINT32 FsextControlCodes[FSP_FSEXT_PROVIDER_COUNTMAX];
@ -37,23 +37,9 @@ static FSP_FSEXT_PROVIDER *FsextProviders[FSP_FSEXT_PROVIDER_COUNTMAX];
static inline static inline
FSP_FSEXT_PROVIDER *FspFsextProviderGet(UINT32 FsextControlCode) FSP_FSEXT_PROVIDER *FspFsextProviderGet(UINT32 FsextControlCode)
{ {
#if 0
for (ULONG I = 0; FSP_FSEXT_PROVIDER_COUNTMAX > I; I++) for (ULONG I = 0; FSP_FSEXT_PROVIDER_COUNTMAX > I; I++)
if (FsextControlCode == FsextControlCodes[I]) if (FsextControlCode == FsextControlCodes[I])
return FsextProviders[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; return 0;
} }

View File

@ -992,14 +992,13 @@ NTSTATUS FspVolumeTransactFsext(
if (!FspDeviceReference(FsvolDeviceObject)) if (!FspDeviceReference(FsvolDeviceObject))
return STATUS_CANCELLED; return STATUS_CANCELLED;
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(FsvolDeviceObject);
NTSTATUS Result = STATUS_INVALID_DEVICE_REQUEST; NTSTATUS Result = STATUS_INVALID_DEVICE_REQUEST;
if (IrpSp->Parameters.FileSystemControl.FsControlCode == if (IrpSp->Parameters.FileSystemControl.FsControlCode ==
FspFsvolDeviceExtension(FsvolDeviceObject)->VolumeParams.FsextControlCode) FsvolDeviceExtension->VolumeParams.FsextControlCode)
{ {
FSP_FSEXT_PROVIDER *Provider = FspFsextProvider( if (0 != FsvolDeviceExtension->Provider)
IrpSp->Parameters.FileSystemControl.FsControlCode, 0); Result = FsvolDeviceExtension->Provider->DeviceTransact(FsvolDeviceObject, Irp);
if (0 != Provider)
Result = Provider->DeviceTransact(FsvolDeviceObject, Irp);
} }
FspDeviceDereference(FsvolDeviceObject); FspDeviceDereference(FsvolDeviceObject);