From c8206751d2dc682cae72c20a6347155973112618 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Mon, 26 Dec 2016 13:59:53 -0800 Subject: [PATCH] sys,dll: Flush now takes FileInfo parameter --- inc/winfsp/fsctl.h | 4 ++++ inc/winfsp/winfsp.h | 7 ++++++- src/dll/fsop.c | 18 ++++++++++++++---- src/dll/fuse/fuse_intf.c | 16 ++++++++++++++-- src/sys/flush.c | 2 +- tools/run-tests.bat | 4 ++-- tst/memfs/memfs.cpp | 25 +++++++++++++++++++++++-- 7 files changed, 64 insertions(+), 12 deletions(-) diff --git a/inc/winfsp/fsctl.h b/inc/winfsp/fsctl.h index 846d0523..741c9de0 100644 --- a/inc/winfsp/fsctl.h +++ b/inc/winfsp/fsctl.h @@ -422,6 +422,10 @@ typedef struct FSP_FSCTL_FILE_INFO FileInfo; /* valid: File{Allocation,Basic,EndOfFile}Information */ } SetInformation; struct + { + FSP_FSCTL_FILE_INFO FileInfo; /* valid when flushing file (not volume) */ + } FlushBuffers; + struct { FSP_FSCTL_VOLUME_INFO VolumeInfo; } QueryVolumeInformation; diff --git a/inc/winfsp/winfsp.h b/inc/winfsp/winfsp.h index ea4d9f0a..e8a4d929 100644 --- a/inc/winfsp/winfsp.h +++ b/inc/winfsp/winfsp.h @@ -433,11 +433,16 @@ typedef struct _FSP_FILE_SYSTEM_INTERFACE * The file system on which this request is posted. * @param FileContext * The file context of the file to be flushed. When NULL the whole volume is being flushed. + * @param FileInfo [out] + * Pointer to a structure that will receive the file information on successful return + * from this call. This information includes file attributes, file times, etc. Used when + * flushing file (not volume). * @return * STATUS_SUCCESS or error code. */ NTSTATUS (*Flush)(FSP_FILE_SYSTEM *FileSystem, - PVOID FileContext); + PVOID FileContext, + FSP_FSCTL_FILE_INFO *FileInfo); /** * Get file or directory information. * diff --git a/src/dll/fsop.c b/src/dll/fsop.c index 30ab7138..695239ee 100644 --- a/src/dll/fsop.c +++ b/src/dll/fsop.c @@ -961,11 +961,21 @@ FSP_API NTSTATUS FspFileSystemOpWrite(FSP_FILE_SYSTEM *FileSystem, FSP_API NTSTATUS FspFileSystemOpFlushBuffers(FSP_FILE_SYSTEM *FileSystem, FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response) { - if (0 == FileSystem->Interface->Flush) - return STATUS_SUCCESS; /* liar! */ + NTSTATUS Result; + FSP_FSCTL_FILE_INFO FileInfo; - return FileSystem->Interface->Flush(FileSystem, - (PVOID)ValOfFileContext(Request->Req.FlushBuffers)); + memset(&FileInfo, 0, sizeof FileInfo); + if (0 == FileSystem->Interface->Flush) + Result = FileSystem->Interface->GetFileInfo(FileSystem, + (PVOID)ValOfFileContext(Request->Req.FlushBuffers), &FileInfo); + else + Result = FileSystem->Interface->Flush(FileSystem, + (PVOID)ValOfFileContext(Request->Req.FlushBuffers), &FileInfo); + if (!NT_SUCCESS(Result)) + return Result; + + memcpy(&Response->Rsp.FlushBuffers.FileInfo, &FileInfo, sizeof FileInfo); + return STATUS_SUCCESS; } FSP_API NTSTATUS FspFileSystemOpQueryInformation(FSP_FILE_SYSTEM *FileSystem, diff --git a/src/dll/fuse/fuse_intf.c b/src/dll/fuse/fuse_intf.c index 6a6c8083..26ec6f93 100644 --- a/src/dll/fuse/fuse_intf.c +++ b/src/dll/fuse/fuse_intf.c @@ -1215,11 +1215,14 @@ success: } static NTSTATUS fsp_fuse_intf_Flush(FSP_FILE_SYSTEM *FileSystem, - PVOID FileNode) + PVOID FileNode, + FSP_FSCTL_FILE_INFO *FileInfo) { struct fuse *f = FileSystem->UserContext; struct fsp_fuse_file_desc *filedesc = FileNode; + UINT32 Uid, Gid, Mode; struct fuse_file_info fi; + FSP_FSCTL_FILE_INFO FileInfoBuf; int err; NTSTATUS Result; @@ -1249,8 +1252,17 @@ static NTSTATUS fsp_fuse_intf_Flush(FSP_FILE_SYSTEM *FileSystem, Result = fsp_fuse_ntstatus_from_errno(f->env, err); } } + if (!NT_SUCCESS(Result)) + return Result; - return Result; + Result = fsp_fuse_intf_GetFileInfoEx(FileSystem, filedesc->PosixPath, &fi, + &Uid, &Gid, &Mode, &FileInfoBuf); + if (!NT_SUCCESS(Result)) + return Result; + + memcpy(FileInfo, &FileInfoBuf, sizeof FileInfoBuf); + + return STATUS_SUCCESS; } static NTSTATUS fsp_fuse_intf_GetFileInfo(FSP_FILE_SYSTEM *FileSystem, diff --git a/src/sys/flush.c b/src/sys/flush.c index e8619fc4..bcb5108c 100644 --- a/src/sys/flush.c +++ b/src/sys/flush.c @@ -160,7 +160,7 @@ NTSTATUS FspFsvolFlushBuffersComplete( if (!FspFileNodeIsValid(FileNode) || FileNode->IsRootDirectory) ; else - SetFlag(FileObject->Flags, FO_FILE_MODIFIED); + FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.FlushBuffers.FileInfo, TRUE); Result = STATUS_SUCCESS; } diff --git a/tools/run-tests.bat b/tools/run-tests.bat index 34278b65..bdc0d0fb 100755 --- a/tools/run-tests.bat +++ b/tools/run-tests.bat @@ -369,8 +369,8 @@ call :__ifstest %1 /d %2 /g VolumeInformation /z /v if !ERRORLEVEL! neq 0 set IfsTestMemfsExit=1 rem call :__ifstest %1 /d %2 /g FileInformation /z /v rem if !ERRORLEVEL! neq 0 set IfsTestMemfsExit=1 -rem call :__ifstest %1 /d %2 /g DirectoryInformation /z /v -rem if !ERRORLEVEL! neq 0 set IfsTestMemfsExit=1 +call :__ifstest %1 /d %2 /g DirectoryInformation /z /v +if !ERRORLEVEL! neq 0 set IfsTestMemfsExit=1 call :__ifstest %1 /d %2 /g FileLocking /z /v if !ERRORLEVEL! neq 0 set IfsTestMemfsExit=1 rem call :__ifstest %1 /d %2 /g OpLocks /z /v diff --git a/tst/memfs/memfs.cpp b/tst/memfs/memfs.cpp index fd62cc6c..cde9815b 100644 --- a/tst/memfs/memfs.cpp +++ b/tst/memfs/memfs.cpp @@ -1110,9 +1110,30 @@ static NTSTATUS Write(FSP_FILE_SYSTEM *FileSystem, } NTSTATUS Flush(FSP_FILE_SYSTEM *FileSystem, - PVOID FileNode0) + PVOID FileNode0, + FSP_FSCTL_FILE_INFO *FileInfo) { - /* nothing to flush, since we do not cache anything */ + MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0; + + /* nothing to flush, since we do not cache anything */ + + if (0 != FileNode) + { +#if 0 +#if defined(MEMFS_NAMED_STREAMS) + if (0 != FileNode->MainFileNode) + FileNode->MainFileNode->FileInfo.LastAccessTime = + FileNode->MainFileNode->FileInfo.LastWriteTime = + FileNode->MainFileNode->FileInfo.ChangeTime = MemfsGetSystemTime(); + else +#endif + FileNode->FileInfo.LastAccessTime = + FileNode->FileInfo.LastWriteTime = + FileNode->FileInfo.ChangeTime = MemfsGetSystemTime(); +#endif + + MemfsFileNodeGetFileInfo(FileNode, FileInfo); + } return STATUS_SUCCESS; }