tst: FlushAndPurgeOnCleanup: testing

This commit is contained in:
Bill Zissimopoulos 2018-04-19 10:23:15 -07:00
parent 5c3549c6eb
commit 740411d604
No known key found for this signature in database
GPG Key ID: 3D4F95D52C7B3EA3
7 changed files with 28 additions and 8 deletions

View File

@ -891,8 +891,11 @@ VOID FspFileNodeCleanupComplete(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject
FspFsvolDeviceUnlockContextTable(FsvolDeviceObject);
/* Flush and purge on last Cleanup. Keeps files off the "standby" list. (GitHub issue #104) */
if (SingleHandle && FsvolDeviceExtension->VolumeParams.FlushAndPurgeOnCleanup)
{
/* NOTE: Do not use FspFileNodeFlushAndPurgeCache. It does not seem to work well! */
IO_STATUS_BLOCK IoStatus;
FspCcFlushCache(FileObject->SectionObjectPointer, 0, 0, &IoStatus);

View File

@ -39,8 +39,8 @@ NTSTATUS SvcStart(FSP_SERVICE *Service, ULONG argc, PWSTR *argv)
wchar_t **argp, **arge;
ULONG DebugFlags = 0;
PWSTR DebugLogFile = 0;
ULONG CaseInsensitiveFlags = 0;
ULONG Flags = MemfsDisk;
ULONG OtherFlags = 0;
ULONG FileInfoTimeout = INFINITE;
ULONG MaxFileNodes = 1024;
ULONG MaxFileSize = 16 * 1024 * 1024;
@ -69,11 +69,14 @@ NTSTATUS SvcStart(FSP_SERVICE *Service, ULONG argc, PWSTR *argv)
case L'D':
argtos(DebugLogFile);
break;
case L'f':
OtherFlags = MemfsFlushAndPurgeOnCleanup;
break;
case L'F':
argtos(FileSystemName);
break;
case L'i':
CaseInsensitiveFlags = MemfsCaseInsensitive;
OtherFlags = MemfsCaseInsensitive;
break;
case L'm':
argtos(MountPoint);
@ -138,7 +141,7 @@ NTSTATUS SvcStart(FSP_SERVICE *Service, ULONG argc, PWSTR *argv)
}
Result = MemfsCreateFunnel(
CaseInsensitiveFlags | Flags,
Flags | OtherFlags,
FileInfoTimeout,
MaxFileNodes,
MaxFileSize,
@ -201,6 +204,7 @@ usage:
" -d DebugFlags [-1: enable all debug logs]\n"
" -D DebugLogFile [file path; use - for stderr]\n"
" -i [case insensitive file system]\n"
" -f [flush and purge cache on cleanup]\n"
" -t FileInfoTimeout [millis]\n"
" -n MaxFileNodes\n"
" -s MaxFileSize [bytes]\n"

View File

@ -1959,7 +1959,8 @@ NTSTATUS MemfsCreateFunnel(
NTSTATUS Result;
FSP_FSCTL_VOLUME_PARAMS VolumeParams;
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;
UINT64 AllocationUnit;
MEMFS *Memfs;
@ -2025,6 +2026,7 @@ NTSTATUS MemfsCreateFunnel(
#if defined(MEMFS_DIRINFO_BY_NAME)
VolumeParams.PassQueryDirectoryFileName = 1;
#endif
VolumeParams.FlushAndPurgeOnCleanup = FlushAndPurgeOnCleanup;
if (0 != VolumePrefix)
wcscpy_s(VolumeParams.Prefix, sizeof VolumeParams.Prefix / sizeof(WCHAR), VolumePrefix);
wcscpy_s(VolumeParams.FileSystemName, sizeof VolumeParams.FileSystemName / sizeof(WCHAR),

View File

@ -28,9 +28,11 @@ typedef struct _MEMFS MEMFS;
enum
{
MemfsDisk = 0x00,
MemfsNet = 0x01,
MemfsCaseInsensitive = 0x80,
MemfsDisk = 0x00000000,
MemfsNet = 0x00000001,
MemfsDeviceMask = 0x0000000f,
MemfsCaseInsensitive = 0x80000000,
MemfsFlushAndPurgeOnCleanup = 0x40000000,
};
#define MemfsCreate(Flags, FileInfoTimeout, MaxFileNodes, MaxFileSize, VolumePrefix, RootSddl, PMemfs)\

View File

@ -36,7 +36,9 @@ void *memfs_start_ex(ULONG Flags, ULONG FileInfoTimeout)
NTSTATUS Result;
Result = MemfsCreateFunnel(
(OptCaseInsensitive ? MemfsCaseInsensitive : 0) | Flags,
Flags |
(OptCaseInsensitive ? MemfsCaseInsensitive : 0) |
(OptFlushAndPurgeOnCleanup ? MemfsFlushAndPurgeOnCleanup : 0),
FileInfoTimeout,
1024,
1024 * 1024,

View File

@ -33,6 +33,7 @@ BOOLEAN OptResilient = FALSE;
BOOLEAN OptCaseInsensitiveCmp = FALSE;
BOOLEAN OptCaseInsensitive = FALSE;
BOOLEAN OptCaseRandomize = FALSE;
BOOLEAN OptFlushAndPurgeOnCleanup = FALSE;
WCHAR OptOplock = 0;
WCHAR OptMountPointBuf[MAX_PATH], *OptMountPoint;
WCHAR OptShareNameBuf[MAX_PATH], *OptShareName, *OptShareTarget;
@ -241,6 +242,11 @@ int main(int argc, char *argv[])
OptCaseInsensitiveCmp = TRUE;
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))
{
OptOplock = 'B';

View File

@ -154,6 +154,7 @@ extern BOOLEAN OptResilient;
extern BOOLEAN OptCaseInsensitiveCmp;
extern BOOLEAN OptCaseInsensitive;
extern BOOLEAN OptCaseRandomize;
extern BOOLEAN OptFlushAndPurgeOnCleanup;
extern WCHAR OptOplock;
extern WCHAR OptMountPointBuf[], *OptMountPoint;
extern WCHAR OptShareNameBuf[], *OptShareName, *OptShareTarget;