mirror of
https://github.com/winfsp/winfsp.git
synced 2025-06-08 21:12:15 -05:00
sys: consolidate Timeout functionality (ioq.c not included)
This commit is contained in:
parent
f29f415d0c
commit
46fa75a74d
@ -327,7 +327,7 @@ static NTSTATUS FspFsvolDeviceInit(PDEVICE_OBJECT DeviceObject)
|
|||||||
FsvolDeviceExtension->InitDoneIoq = 1;
|
FsvolDeviceExtension->InitDoneIoq = 1;
|
||||||
|
|
||||||
/* create our security meta cache */
|
/* create our security meta cache */
|
||||||
MetaTimeout.QuadPart = FsvolDeviceExtension->VolumeParams.FileInfoTimeout * 10000ULL;
|
MetaTimeout.QuadPart = FspTimeoutFromMillis(FsvolDeviceExtension->VolumeParams.FileInfoTimeout);
|
||||||
/* convert millis to nanos */
|
/* convert millis to nanos */
|
||||||
Result = FspMetaCacheCreate(
|
Result = FspMetaCacheCreate(
|
||||||
FspFsvolDeviceSecurityCacheCapacity, FspFsvolDeviceSecurityCacheItemSizeMax, &MetaTimeout,
|
FspFsvolDeviceSecurityCacheCapacity, FspFsvolDeviceSecurityCacheItemSizeMax, &MetaTimeout,
|
||||||
@ -761,8 +761,7 @@ BOOLEAN FspFsvolTryGetVolumeInfo(PDEVICE_OBJECT DeviceObject, FSP_FSCTL_VOLUME_I
|
|||||||
BOOLEAN Result;
|
BOOLEAN Result;
|
||||||
|
|
||||||
KeAcquireSpinLock(&FsvolDeviceExtension->InfoSpinLock, &Irql);
|
KeAcquireSpinLock(&FsvolDeviceExtension->InfoSpinLock, &Irql);
|
||||||
if (0 < FsvolDeviceExtension->InfoExpirationTime &&
|
if (FspExpirationTimeValid(FsvolDeviceExtension->InfoExpirationTime))
|
||||||
KeQueryInterruptTime() < FsvolDeviceExtension->InfoExpirationTime)
|
|
||||||
{
|
{
|
||||||
VolumeInfoNp = FsvolDeviceExtension->VolumeInfo;
|
VolumeInfoNp = FsvolDeviceExtension->VolumeInfo;
|
||||||
Result = TRUE;
|
Result = TRUE;
|
||||||
@ -785,12 +784,11 @@ VOID FspFsvolSetVolumeInfo(PDEVICE_OBJECT DeviceObject, const FSP_FSCTL_VOLUME_I
|
|||||||
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(DeviceObject);
|
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(DeviceObject);
|
||||||
FSP_FSCTL_VOLUME_INFO VolumeInfoNp = *VolumeInfo;
|
FSP_FSCTL_VOLUME_INFO VolumeInfoNp = *VolumeInfo;
|
||||||
KIRQL Irql;
|
KIRQL Irql;
|
||||||
UINT64 FileInfoTimeout = FsvolDeviceExtension->VolumeParams.FileInfoTimeout * 10000ULL;
|
|
||||||
|
|
||||||
KeAcquireSpinLock(&FsvolDeviceExtension->InfoSpinLock, &Irql);
|
KeAcquireSpinLock(&FsvolDeviceExtension->InfoSpinLock, &Irql);
|
||||||
FsvolDeviceExtension->VolumeInfo = VolumeInfoNp;
|
FsvolDeviceExtension->VolumeInfo = VolumeInfoNp;
|
||||||
FsvolDeviceExtension->InfoExpirationTime = 0 != FileInfoTimeout ?
|
FsvolDeviceExtension->InfoExpirationTime = FspExpirationTimeFromMillis(
|
||||||
KeQueryInterruptTime() + FileInfoTimeout : 0;
|
FsvolDeviceExtension->VolumeParams.FileInfoTimeout);
|
||||||
KeReleaseSpinLock(&FsvolDeviceExtension->InfoSpinLock, Irql);
|
KeReleaseSpinLock(&FsvolDeviceExtension->InfoSpinLock, Irql);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -326,6 +326,39 @@ ULONG FspHashMixPointer(PVOID Pointer)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* timeouts */
|
||||||
|
#define FspTimeoutInfinity32 ((UINT32)-1L)
|
||||||
|
#define FspTimeoutInfinity64 ((UINT64)-1LL)
|
||||||
|
static inline
|
||||||
|
UINT64 FspTimeoutFromMillis(UINT32 Millis)
|
||||||
|
{
|
||||||
|
/* if Millis is 0 or -1 then sign-extend else 10000ULL * Millis */
|
||||||
|
return 1 >= Millis + 1 ? (INT64)(INT32)Millis : 10000ULL * Millis;
|
||||||
|
}
|
||||||
|
static inline
|
||||||
|
UINT64 FspExpirationTimeFromMillis(UINT32 Millis)
|
||||||
|
{
|
||||||
|
/* if Millis is 0 or -1 then sign-extend else KeQueryInterruptTime() + 10000ULL * Millis */
|
||||||
|
return 1 >= Millis + 1 ? (INT64)(INT32)Millis : KeQueryInterruptTime() + 10000ULL * Millis;
|
||||||
|
}
|
||||||
|
static inline
|
||||||
|
UINT64 FspExpirationTimeFromTimeout(UINT64 Timeout)
|
||||||
|
{
|
||||||
|
/* if Timeout is 0 or -1 then Timeout else KeQueryInterruptTime() + Timeout */
|
||||||
|
return 1 >= Timeout + 1 ? Timeout : KeQueryInterruptTime() + Timeout;
|
||||||
|
}
|
||||||
|
static inline
|
||||||
|
BOOLEAN FspExpirationTimeValid(UINT64 ExpirationTime)
|
||||||
|
{
|
||||||
|
/* if ExpirationTime is 0 or -1 then ExpirationTime else KeQueryInterruptTime() < ExpirationTime */
|
||||||
|
return 1 >= ExpirationTime + 1 ? (0 != ExpirationTime) : (KeQueryInterruptTime() < ExpirationTime);
|
||||||
|
}
|
||||||
|
static inline
|
||||||
|
BOOLEAN FspExpirationTimeValid2(UINT64 ExpirationTime, UINT64 CurrentTime)
|
||||||
|
{
|
||||||
|
return CurrentTime < ExpirationTime;
|
||||||
|
}
|
||||||
|
|
||||||
/* utility */
|
/* utility */
|
||||||
PVOID FspAllocatePoolMustSucceed(POOL_TYPE PoolType, SIZE_T Size, ULONG Tag);
|
PVOID FspAllocatePoolMustSucceed(POOL_TYPE PoolType, SIZE_T Size, ULONG Tag);
|
||||||
PVOID FspAllocateIrpMustSucceed(CCHAR StackSize);
|
PVOID FspAllocateIrpMustSucceed(CCHAR StackSize);
|
||||||
@ -704,9 +737,9 @@ VOID FspFileNodeDereference(FSP_FILE_NODE *FileNode)
|
|||||||
FspFileNodeDelete(FileNode);
|
FspFileNodeDelete(FileNode);
|
||||||
}
|
}
|
||||||
VOID FspFileNodeAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags);
|
VOID FspFileNodeAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags);
|
||||||
BOOLEAN FspFileNodeTryAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags);
|
BOOLEAN FspFileNodeTryAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags, BOOLEAN Wait);
|
||||||
VOID FspFileNodeAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags);
|
VOID FspFileNodeAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags);
|
||||||
BOOLEAN FspFileNodeTryAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags);
|
BOOLEAN FspFileNodeTryAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags, BOOLEAN Wait);
|
||||||
VOID FspFileNodeSetOwnerF(FSP_FILE_NODE *FileNode, ULONG Flags, PVOID Owner);
|
VOID FspFileNodeSetOwnerF(FSP_FILE_NODE *FileNode, ULONG Flags, PVOID Owner);
|
||||||
VOID FspFileNodeReleaseF(FSP_FILE_NODE *FileNode, ULONG Flags);
|
VOID FspFileNodeReleaseF(FSP_FILE_NODE *FileNode, ULONG Flags);
|
||||||
VOID FspFileNodeReleaseOwnerF(FSP_FILE_NODE *FileNode, ULONG Flags, PVOID Owner);
|
VOID FspFileNodeReleaseOwnerF(FSP_FILE_NODE *FileNode, ULONG Flags, PVOID Owner);
|
||||||
@ -728,9 +761,9 @@ BOOLEAN FspFileNodeTrySetSecurity(FSP_FILE_NODE *FileNode, PCVOID Buffer, ULONG
|
|||||||
NTSTATUS FspFileDescCreate(FSP_FILE_DESC **PFileDesc);
|
NTSTATUS FspFileDescCreate(FSP_FILE_DESC **PFileDesc);
|
||||||
VOID FspFileDescDelete(FSP_FILE_DESC *FileDesc);
|
VOID FspFileDescDelete(FSP_FILE_DESC *FileDesc);
|
||||||
#define FspFileNodeAcquireShared(N,F) FspFileNodeAcquireSharedF(N, FspFileNodeAcquire ## F)
|
#define FspFileNodeAcquireShared(N,F) FspFileNodeAcquireSharedF(N, FspFileNodeAcquire ## F)
|
||||||
#define FspFileNodeTryAcquireShared(N,F) FspFileNodeTryAcquireSharedF(N, FspFileNodeAcquire ## F)
|
#define FspFileNodeTryAcquireShared(N,F) FspFileNodeTryAcquireSharedF(N, FspFileNodeAcquire ## F, FALSE)
|
||||||
#define FspFileNodeAcquireExclusive(N,F) FspFileNodeAcquireExclusiveF(N, FspFileNodeAcquire ## F)
|
#define FspFileNodeAcquireExclusive(N,F) FspFileNodeAcquireExclusiveF(N, FspFileNodeAcquire ## F)
|
||||||
#define FspFileNodeTryAcquireExclusive(N,F) FspFileNodeTryAcquireExclusiveF(N, FspFileNodeAcquire ## F)
|
#define FspFileNodeTryAcquireExclusive(N,F) FspFileNodeTryAcquireExclusiveF(N, FspFileNodeAcquire ## F, FALSE)
|
||||||
#define FspFileNodeSetOwner(N,F,P) FspFileNodeSetOwnerF(N, FspFileNodeAcquire ## F, P)
|
#define FspFileNodeSetOwner(N,F,P) FspFileNodeSetOwnerF(N, FspFileNodeAcquire ## F, P)
|
||||||
#define FspFileNodeRelease(N,F) FspFileNodeReleaseF(N, FspFileNodeAcquire ## F)
|
#define FspFileNodeRelease(N,F) FspFileNodeReleaseF(N, FspFileNodeAcquire ## F)
|
||||||
#define FspFileNodeReleaseOwner(N,F,P) FspFileNodeReleaseOwnerF(N, FspFileNodeAcquire ## F, P)
|
#define FspFileNodeReleaseOwner(N,F,P) FspFileNodeReleaseOwnerF(N, FspFileNodeAcquire ## F, P)
|
||||||
|
@ -10,9 +10,9 @@ NTSTATUS FspFileNodeCreate(PDEVICE_OBJECT DeviceObject,
|
|||||||
ULONG ExtraSize, FSP_FILE_NODE **PFileNode);
|
ULONG ExtraSize, FSP_FILE_NODE **PFileNode);
|
||||||
VOID FspFileNodeDelete(FSP_FILE_NODE *FileNode);
|
VOID FspFileNodeDelete(FSP_FILE_NODE *FileNode);
|
||||||
VOID FspFileNodeAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags);
|
VOID FspFileNodeAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags);
|
||||||
BOOLEAN FspFileNodeTryAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags);
|
BOOLEAN FspFileNodeTryAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags, BOOLEAN Wait);
|
||||||
VOID FspFileNodeAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags);
|
VOID FspFileNodeAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags);
|
||||||
BOOLEAN FspFileNodeTryAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags);
|
BOOLEAN FspFileNodeTryAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags, BOOLEAN Wait);
|
||||||
VOID FspFileNodeSetOwnerF(FSP_FILE_NODE *FileNode, ULONG Flags, PVOID Owner);
|
VOID FspFileNodeSetOwnerF(FSP_FILE_NODE *FileNode, ULONG Flags, PVOID Owner);
|
||||||
VOID FspFileNodeReleaseF(FSP_FILE_NODE *FileNode, ULONG Flags);
|
VOID FspFileNodeReleaseF(FSP_FILE_NODE *FileNode, ULONG Flags);
|
||||||
VOID FspFileNodeReleaseOwnerF(FSP_FILE_NODE *FileNode, ULONG Flags, PVOID Owner);
|
VOID FspFileNodeReleaseOwnerF(FSP_FILE_NODE *FileNode, ULONG Flags, PVOID Owner);
|
||||||
@ -135,7 +135,7 @@ VOID FspFileNodeAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags)
|
|||||||
ExAcquireResourceSharedLite(FileNode->Header.PagingIoResource, TRUE);
|
ExAcquireResourceSharedLite(FileNode->Header.PagingIoResource, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOLEAN FspFileNodeTryAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags)
|
BOOLEAN FspFileNodeTryAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags, BOOLEAN Wait)
|
||||||
{
|
{
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
@ -143,14 +143,14 @@ BOOLEAN FspFileNodeTryAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags)
|
|||||||
|
|
||||||
if (Flags & FspFileNodeAcquireMain)
|
if (Flags & FspFileNodeAcquireMain)
|
||||||
{
|
{
|
||||||
Result = ExAcquireResourceSharedLite(FileNode->Header.Resource, FALSE);
|
Result = ExAcquireResourceSharedLite(FileNode->Header.Resource, Wait);
|
||||||
if (!Result)
|
if (!Result)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Flags & FspFileNodeAcquirePgio)
|
if (Flags & FspFileNodeAcquirePgio)
|
||||||
{
|
{
|
||||||
Result = ExAcquireResourceSharedLite(FileNode->Header.PagingIoResource, FALSE);
|
Result = ExAcquireResourceSharedLite(FileNode->Header.PagingIoResource, Wait);
|
||||||
if (!Result)
|
if (!Result)
|
||||||
{
|
{
|
||||||
if (Flags & FspFileNodeAcquireMain)
|
if (Flags & FspFileNodeAcquireMain)
|
||||||
@ -173,7 +173,7 @@ VOID FspFileNodeAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags)
|
|||||||
ExAcquireResourceExclusiveLite(FileNode->Header.PagingIoResource, TRUE);
|
ExAcquireResourceExclusiveLite(FileNode->Header.PagingIoResource, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOLEAN FspFileNodeTryAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags)
|
BOOLEAN FspFileNodeTryAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags, BOOLEAN Wait)
|
||||||
{
|
{
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
@ -181,14 +181,14 @@ BOOLEAN FspFileNodeTryAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags)
|
|||||||
|
|
||||||
if (Flags & FspFileNodeAcquireMain)
|
if (Flags & FspFileNodeAcquireMain)
|
||||||
{
|
{
|
||||||
Result = ExAcquireResourceExclusiveLite(FileNode->Header.Resource, FALSE);
|
Result = ExAcquireResourceExclusiveLite(FileNode->Header.Resource, Wait);
|
||||||
if (!Result)
|
if (!Result)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Flags & FspFileNodeAcquirePgio)
|
if (Flags & FspFileNodeAcquirePgio)
|
||||||
{
|
{
|
||||||
Result = ExAcquireResourceExclusiveLite(FileNode->Header.PagingIoResource, FALSE);
|
Result = ExAcquireResourceExclusiveLite(FileNode->Header.PagingIoResource, Wait);
|
||||||
if (!Result)
|
if (!Result)
|
||||||
{
|
{
|
||||||
if (Flags & FspFileNodeAcquireMain)
|
if (Flags & FspFileNodeAcquireMain)
|
||||||
@ -418,7 +418,7 @@ BOOLEAN FspFileNodeTryGetFileInfo(FSP_FILE_NODE *FileNode, FSP_FSCTL_FILE_INFO *
|
|||||||
|
|
||||||
BOOLEAN Result;
|
BOOLEAN Result;
|
||||||
|
|
||||||
if (0 < FileNode->InfoExpirationTime && KeQueryInterruptTime() < FileNode->InfoExpirationTime)
|
if (FspExpirationTimeValid(FileNode->InfoExpirationTime))
|
||||||
{
|
{
|
||||||
FileInfo->AllocationSize = FileNode->Header.AllocationSize.QuadPart;
|
FileInfo->AllocationSize = FileNode->Header.AllocationSize.QuadPart;
|
||||||
FileInfo->FileSize = FileNode->Header.FileSize.QuadPart;
|
FileInfo->FileSize = FileNode->Header.FileSize.QuadPart;
|
||||||
@ -444,7 +444,6 @@ VOID FspFileNodeSetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject,
|
|||||||
|
|
||||||
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension =
|
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension =
|
||||||
FspFsvolDeviceExtension(FileNode->FsvolDeviceObject);
|
FspFsvolDeviceExtension(FileNode->FsvolDeviceObject);
|
||||||
UINT64 FileInfoTimeout = FsvolDeviceExtension->VolumeParams.FileInfoTimeout * 10000ULL;
|
|
||||||
UINT64 AllocationSize = FileInfo->AllocationSize > FileInfo->FileSize ?
|
UINT64 AllocationSize = FileInfo->AllocationSize > FileInfo->FileSize ?
|
||||||
FileInfo->AllocationSize : FileInfo->FileSize;
|
FileInfo->AllocationSize : FileInfo->FileSize;
|
||||||
UINT64 AllocationUnit;
|
UINT64 AllocationUnit;
|
||||||
@ -462,8 +461,8 @@ VOID FspFileNodeSetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject,
|
|||||||
FileNode->LastAccessTime = FileInfo->LastAccessTime;
|
FileNode->LastAccessTime = FileInfo->LastAccessTime;
|
||||||
FileNode->LastWriteTime = FileInfo->LastWriteTime;
|
FileNode->LastWriteTime = FileInfo->LastWriteTime;
|
||||||
FileNode->ChangeTime = FileInfo->ChangeTime;
|
FileNode->ChangeTime = FileInfo->ChangeTime;
|
||||||
FileNode->InfoExpirationTime = 0 != FileInfoTimeout ?
|
FileNode->InfoExpirationTime = FspExpirationTimeFromMillis(
|
||||||
KeQueryInterruptTime() + FileInfoTimeout : 0;
|
FsvolDeviceExtension->VolumeParams.FileInfoTimeout);
|
||||||
FileNode->InfoChangeNumber++;
|
FileNode->InfoChangeNumber++;
|
||||||
|
|
||||||
if (0 != CcFileObject)
|
if (0 != CcFileObject)
|
||||||
|
@ -86,7 +86,7 @@ static inline FSP_META_CACHE_ITEM *FspMetaCacheRemoveExpiredItemAtDpcLevel(FSP_M
|
|||||||
if (Head == Entry)
|
if (Head == Entry)
|
||||||
return 0;
|
return 0;
|
||||||
FSP_META_CACHE_ITEM *Item = CONTAINING_RECORD(Entry, FSP_META_CACHE_ITEM, ListEntry);
|
FSP_META_CACHE_ITEM *Item = CONTAINING_RECORD(Entry, FSP_META_CACHE_ITEM, ListEntry);
|
||||||
if (Item->ExpirationTime > ExpirationTime)
|
if (!FspExpirationTimeValid2(Item->ExpirationTime, ExpirationTime))
|
||||||
return 0;
|
return 0;
|
||||||
ULONG HashIndex = Item->ItemIndex % MetaCache->ItemBucketCount;
|
ULONG HashIndex = Item->ItemIndex % MetaCache->ItemBucketCount;
|
||||||
for (FSP_META_CACHE_ITEM **P = (PVOID)&MetaCache->ItemBuckets[HashIndex]; *P; P = &(*P)->DictNext)
|
for (FSP_META_CACHE_ITEM **P = (PVOID)&MetaCache->ItemBuckets[HashIndex]; *P; P = &(*P)->DictNext)
|
||||||
@ -203,7 +203,7 @@ UINT64 FspMetaCacheAddItem(FSP_META_CACHE *MetaCache, PCVOID Buffer, ULONG Size)
|
|||||||
RtlZeroMemory(Item, sizeof *Item);
|
RtlZeroMemory(Item, sizeof *Item);
|
||||||
RtlZeroMemory(ItemBuffer, sizeof *ItemBuffer);
|
RtlZeroMemory(ItemBuffer, sizeof *ItemBuffer);
|
||||||
Item->ItemBuffer = ItemBuffer;
|
Item->ItemBuffer = ItemBuffer;
|
||||||
Item->ExpirationTime = KeQueryInterruptTime() + MetaCache->MetaTimeout;
|
Item->ExpirationTime = FspExpirationTimeFromTimeout(MetaCache->MetaTimeout);
|
||||||
Item->RefCount = 1;
|
Item->RefCount = 1;
|
||||||
ItemBuffer->Item = Item;
|
ItemBuffer->Item = Item;
|
||||||
ItemBuffer->Size = Size;
|
ItemBuffer->Size = Size;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user