mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-22 08:23:05 -05:00
tst: FlushAndPurgeOnCleanup: testing
This commit is contained in:
parent
5c3549c6eb
commit
740411d604
@ -891,8 +891,11 @@ VOID FspFileNodeCleanupComplete(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject
|
|||||||
|
|
||||||
FspFsvolDeviceUnlockContextTable(FsvolDeviceObject);
|
FspFsvolDeviceUnlockContextTable(FsvolDeviceObject);
|
||||||
|
|
||||||
|
/* Flush and purge on last Cleanup. Keeps files off the "standby" list. (GitHub issue #104) */
|
||||||
if (SingleHandle && FsvolDeviceExtension->VolumeParams.FlushAndPurgeOnCleanup)
|
if (SingleHandle && FsvolDeviceExtension->VolumeParams.FlushAndPurgeOnCleanup)
|
||||||
{
|
{
|
||||||
|
/* NOTE: Do not use FspFileNodeFlushAndPurgeCache. It does not seem to work well! */
|
||||||
|
|
||||||
IO_STATUS_BLOCK IoStatus;
|
IO_STATUS_BLOCK IoStatus;
|
||||||
|
|
||||||
FspCcFlushCache(FileObject->SectionObjectPointer, 0, 0, &IoStatus);
|
FspCcFlushCache(FileObject->SectionObjectPointer, 0, 0, &IoStatus);
|
||||||
|
@ -39,8 +39,8 @@ NTSTATUS SvcStart(FSP_SERVICE *Service, ULONG argc, PWSTR *argv)
|
|||||||
wchar_t **argp, **arge;
|
wchar_t **argp, **arge;
|
||||||
ULONG DebugFlags = 0;
|
ULONG DebugFlags = 0;
|
||||||
PWSTR DebugLogFile = 0;
|
PWSTR DebugLogFile = 0;
|
||||||
ULONG CaseInsensitiveFlags = 0;
|
|
||||||
ULONG Flags = MemfsDisk;
|
ULONG Flags = MemfsDisk;
|
||||||
|
ULONG OtherFlags = 0;
|
||||||
ULONG FileInfoTimeout = INFINITE;
|
ULONG FileInfoTimeout = INFINITE;
|
||||||
ULONG MaxFileNodes = 1024;
|
ULONG MaxFileNodes = 1024;
|
||||||
ULONG MaxFileSize = 16 * 1024 * 1024;
|
ULONG MaxFileSize = 16 * 1024 * 1024;
|
||||||
@ -69,11 +69,14 @@ NTSTATUS SvcStart(FSP_SERVICE *Service, ULONG argc, PWSTR *argv)
|
|||||||
case L'D':
|
case L'D':
|
||||||
argtos(DebugLogFile);
|
argtos(DebugLogFile);
|
||||||
break;
|
break;
|
||||||
|
case L'f':
|
||||||
|
OtherFlags = MemfsFlushAndPurgeOnCleanup;
|
||||||
|
break;
|
||||||
case L'F':
|
case L'F':
|
||||||
argtos(FileSystemName);
|
argtos(FileSystemName);
|
||||||
break;
|
break;
|
||||||
case L'i':
|
case L'i':
|
||||||
CaseInsensitiveFlags = MemfsCaseInsensitive;
|
OtherFlags = MemfsCaseInsensitive;
|
||||||
break;
|
break;
|
||||||
case L'm':
|
case L'm':
|
||||||
argtos(MountPoint);
|
argtos(MountPoint);
|
||||||
@ -138,7 +141,7 @@ NTSTATUS SvcStart(FSP_SERVICE *Service, ULONG argc, PWSTR *argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
Result = MemfsCreateFunnel(
|
Result = MemfsCreateFunnel(
|
||||||
CaseInsensitiveFlags | Flags,
|
Flags | OtherFlags,
|
||||||
FileInfoTimeout,
|
FileInfoTimeout,
|
||||||
MaxFileNodes,
|
MaxFileNodes,
|
||||||
MaxFileSize,
|
MaxFileSize,
|
||||||
@ -201,6 +204,7 @@ usage:
|
|||||||
" -d DebugFlags [-1: enable all debug logs]\n"
|
" -d DebugFlags [-1: enable all debug logs]\n"
|
||||||
" -D DebugLogFile [file path; use - for stderr]\n"
|
" -D DebugLogFile [file path; use - for stderr]\n"
|
||||||
" -i [case insensitive file system]\n"
|
" -i [case insensitive file system]\n"
|
||||||
|
" -f [flush and purge cache on cleanup]\n"
|
||||||
" -t FileInfoTimeout [millis]\n"
|
" -t FileInfoTimeout [millis]\n"
|
||||||
" -n MaxFileNodes\n"
|
" -n MaxFileNodes\n"
|
||||||
" -s MaxFileSize [bytes]\n"
|
" -s MaxFileSize [bytes]\n"
|
||||||
|
@ -1959,7 +1959,8 @@ NTSTATUS MemfsCreateFunnel(
|
|||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
FSP_FSCTL_VOLUME_PARAMS VolumeParams;
|
FSP_FSCTL_VOLUME_PARAMS VolumeParams;
|
||||||
BOOLEAN CaseInsensitive = !!(Flags & MemfsCaseInsensitive);
|
BOOLEAN CaseInsensitive = !!(Flags & MemfsCaseInsensitive);
|
||||||
PWSTR DevicePath = (Flags & MemfsNet) ?
|
BOOLEAN FlushAndPurgeOnCleanup = !!(Flags & MemfsFlushAndPurgeOnCleanup);
|
||||||
|
PWSTR DevicePath = MemfsNet == (Flags & MemfsDeviceMask) ?
|
||||||
L"" FSP_FSCTL_NET_DEVICE_NAME : L"" FSP_FSCTL_DISK_DEVICE_NAME;
|
L"" FSP_FSCTL_NET_DEVICE_NAME : L"" FSP_FSCTL_DISK_DEVICE_NAME;
|
||||||
UINT64 AllocationUnit;
|
UINT64 AllocationUnit;
|
||||||
MEMFS *Memfs;
|
MEMFS *Memfs;
|
||||||
@ -2025,6 +2026,7 @@ NTSTATUS MemfsCreateFunnel(
|
|||||||
#if defined(MEMFS_DIRINFO_BY_NAME)
|
#if defined(MEMFS_DIRINFO_BY_NAME)
|
||||||
VolumeParams.PassQueryDirectoryFileName = 1;
|
VolumeParams.PassQueryDirectoryFileName = 1;
|
||||||
#endif
|
#endif
|
||||||
|
VolumeParams.FlushAndPurgeOnCleanup = FlushAndPurgeOnCleanup;
|
||||||
if (0 != VolumePrefix)
|
if (0 != VolumePrefix)
|
||||||
wcscpy_s(VolumeParams.Prefix, sizeof VolumeParams.Prefix / sizeof(WCHAR), VolumePrefix);
|
wcscpy_s(VolumeParams.Prefix, sizeof VolumeParams.Prefix / sizeof(WCHAR), VolumePrefix);
|
||||||
wcscpy_s(VolumeParams.FileSystemName, sizeof VolumeParams.FileSystemName / sizeof(WCHAR),
|
wcscpy_s(VolumeParams.FileSystemName, sizeof VolumeParams.FileSystemName / sizeof(WCHAR),
|
||||||
|
@ -28,9 +28,11 @@ typedef struct _MEMFS MEMFS;
|
|||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
MemfsDisk = 0x00,
|
MemfsDisk = 0x00000000,
|
||||||
MemfsNet = 0x01,
|
MemfsNet = 0x00000001,
|
||||||
MemfsCaseInsensitive = 0x80,
|
MemfsDeviceMask = 0x0000000f,
|
||||||
|
MemfsCaseInsensitive = 0x80000000,
|
||||||
|
MemfsFlushAndPurgeOnCleanup = 0x40000000,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MemfsCreate(Flags, FileInfoTimeout, MaxFileNodes, MaxFileSize, VolumePrefix, RootSddl, PMemfs)\
|
#define MemfsCreate(Flags, FileInfoTimeout, MaxFileNodes, MaxFileSize, VolumePrefix, RootSddl, PMemfs)\
|
||||||
|
@ -36,7 +36,9 @@ void *memfs_start_ex(ULONG Flags, ULONG FileInfoTimeout)
|
|||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
|
|
||||||
Result = MemfsCreateFunnel(
|
Result = MemfsCreateFunnel(
|
||||||
(OptCaseInsensitive ? MemfsCaseInsensitive : 0) | Flags,
|
Flags |
|
||||||
|
(OptCaseInsensitive ? MemfsCaseInsensitive : 0) |
|
||||||
|
(OptFlushAndPurgeOnCleanup ? MemfsFlushAndPurgeOnCleanup : 0),
|
||||||
FileInfoTimeout,
|
FileInfoTimeout,
|
||||||
1024,
|
1024,
|
||||||
1024 * 1024,
|
1024 * 1024,
|
||||||
|
@ -33,6 +33,7 @@ BOOLEAN OptResilient = FALSE;
|
|||||||
BOOLEAN OptCaseInsensitiveCmp = FALSE;
|
BOOLEAN OptCaseInsensitiveCmp = FALSE;
|
||||||
BOOLEAN OptCaseInsensitive = FALSE;
|
BOOLEAN OptCaseInsensitive = FALSE;
|
||||||
BOOLEAN OptCaseRandomize = FALSE;
|
BOOLEAN OptCaseRandomize = FALSE;
|
||||||
|
BOOLEAN OptFlushAndPurgeOnCleanup = FALSE;
|
||||||
WCHAR OptOplock = 0;
|
WCHAR OptOplock = 0;
|
||||||
WCHAR OptMountPointBuf[MAX_PATH], *OptMountPoint;
|
WCHAR OptMountPointBuf[MAX_PATH], *OptMountPoint;
|
||||||
WCHAR OptShareNameBuf[MAX_PATH], *OptShareName, *OptShareTarget;
|
WCHAR OptShareNameBuf[MAX_PATH], *OptShareName, *OptShareTarget;
|
||||||
@ -241,6 +242,11 @@ int main(int argc, char *argv[])
|
|||||||
OptCaseInsensitiveCmp = TRUE;
|
OptCaseInsensitiveCmp = TRUE;
|
||||||
rmarg(argv, argc, argi);
|
rmarg(argv, argc, argi);
|
||||||
}
|
}
|
||||||
|
else if (0 == strcmp("--flush-and-purge-on-cleanup", a))
|
||||||
|
{
|
||||||
|
OptFlushAndPurgeOnCleanup = TRUE;
|
||||||
|
rmarg(argv, argc, argi);
|
||||||
|
}
|
||||||
else if (0 == strcmp("--oplock=batch", a))
|
else if (0 == strcmp("--oplock=batch", a))
|
||||||
{
|
{
|
||||||
OptOplock = 'B';
|
OptOplock = 'B';
|
||||||
|
@ -154,6 +154,7 @@ extern BOOLEAN OptResilient;
|
|||||||
extern BOOLEAN OptCaseInsensitiveCmp;
|
extern BOOLEAN OptCaseInsensitiveCmp;
|
||||||
extern BOOLEAN OptCaseInsensitive;
|
extern BOOLEAN OptCaseInsensitive;
|
||||||
extern BOOLEAN OptCaseRandomize;
|
extern BOOLEAN OptCaseRandomize;
|
||||||
|
extern BOOLEAN OptFlushAndPurgeOnCleanup;
|
||||||
extern WCHAR OptOplock;
|
extern WCHAR OptOplock;
|
||||||
extern WCHAR OptMountPointBuf[], *OptMountPoint;
|
extern WCHAR OptMountPointBuf[], *OptMountPoint;
|
||||||
extern WCHAR OptShareNameBuf[], *OptShareName, *OptShareTarget;
|
extern WCHAR OptShareNameBuf[], *OptShareName, *OptShareTarget;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user