mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-22 08:23:05 -05:00
sys: avoid using FspFsextProvider unnecessarily
This commit is contained in:
parent
5110b3c5a1
commit
254174b8e9
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user