From bbb51b497141a87c49beb925e672eb8f8cc7176c Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Tue, 13 Dec 2016 11:52:32 -0800 Subject: [PATCH] sys,dll: Overwrite now correctly handles AllocationSize --- inc/winfsp/fsctl.h | 1 + inc/winfsp/winfsp.h | 4 +++- src/dll/fsop.c | 1 + src/dll/fuse/fuse_intf.c | 2 +- src/sys/create.c | 2 ++ tst/memfs/memfs.cpp | 14 ++++++++++++-- 6 files changed, 20 insertions(+), 4 deletions(-) diff --git a/inc/winfsp/fsctl.h b/inc/winfsp/fsctl.h index 7c5a77ac..e8d022a1 100644 --- a/inc/winfsp/fsctl.h +++ b/inc/winfsp/fsctl.h @@ -240,6 +240,7 @@ typedef struct UINT64 UserContext; UINT64 UserContext2; UINT32 FileAttributes; /* file attributes for overwritten/superseded files */ + UINT64 AllocationSize; /* allocation size for overwritten/superseded files */ UINT32 Supersede:1; /* 0: FILE_OVERWRITE operation, 1: FILE_SUPERSEDE operation */ } Overwrite; struct diff --git a/inc/winfsp/winfsp.h b/inc/winfsp/winfsp.h index d92daea6..a17c42f8 100644 --- a/inc/winfsp/winfsp.h +++ b/inc/winfsp/winfsp.h @@ -301,6 +301,8 @@ typedef struct _FSP_FILE_SYSTEM_INTERFACE * @param ReplaceFileAttributes * When TRUE the existing file attributes should be replaced with the new ones. * When FALSE the existing file attributes should be merged (or'ed) with the new ones. + * @param AllocationSize + * Allocation size for the overwritten file. * @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. @@ -308,7 +310,7 @@ typedef struct _FSP_FILE_SYSTEM_INTERFACE * STATUS_SUCCESS or error code. */ NTSTATUS (*Overwrite)(FSP_FILE_SYSTEM *FileSystem, - PVOID FileContext, UINT32 FileAttributes, BOOLEAN ReplaceFileAttributes, + PVOID FileContext, UINT32 FileAttributes, BOOLEAN ReplaceFileAttributes, UINT64 AllocationSize, FSP_FSCTL_FILE_INFO *FileInfo); /** * Cleanup a file. diff --git a/src/dll/fsop.c b/src/dll/fsop.c index 5aa89ecf..b47924e3 100644 --- a/src/dll/fsop.c +++ b/src/dll/fsop.c @@ -847,6 +847,7 @@ FSP_API NTSTATUS FspFileSystemOpOverwrite(FSP_FILE_SYSTEM *FileSystem, (PVOID)ValOfFileContext(Request->Req.Overwrite), Request->Req.Overwrite.FileAttributes, Request->Req.Overwrite.Supersede, + Request->Req.Overwrite.AllocationSize, &FileInfo); if (!NT_SUCCESS(Result)) { diff --git a/src/dll/fuse/fuse_intf.c b/src/dll/fuse/fuse_intf.c index ed8a5723..edeafbf9 100644 --- a/src/dll/fuse/fuse_intf.c +++ b/src/dll/fuse/fuse_intf.c @@ -1011,7 +1011,7 @@ exit: } static NTSTATUS fsp_fuse_intf_Overwrite(FSP_FILE_SYSTEM *FileSystem, - PVOID FileNode, UINT32 FileAttributes, BOOLEAN ReplaceFileAttributes, + PVOID FileNode, UINT32 FileAttributes, BOOLEAN ReplaceFileAttributes, UINT64 AllocationSize, FSP_FSCTL_FILE_INFO *FileInfo) { struct fuse *f = FileSystem->UserContext; diff --git a/src/sys/create.c b/src/sys/create.c index 1cbe6d63..41f5b63a 100644 --- a/src/sys/create.c +++ b/src/sys/create.c @@ -933,6 +933,7 @@ NTSTATUS FspFsvolCreateComplete( */ USHORT FileAttributes = IrpSp->Parameters.Create.FileAttributes; + UINT64 AllocationSize = Request->Req.Create.AllocationSize; ClearFlag(FileAttributes, FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_DIRECTORY); if (FileNode->IsDirectory) @@ -957,6 +958,7 @@ NTSTATUS FspFsvolCreateComplete( Request->Req.Overwrite.UserContext = FileNode->UserContext; Request->Req.Overwrite.UserContext2 = FileDesc->UserContext2; Request->Req.Overwrite.FileAttributes = FileAttributes; + Request->Req.Overwrite.AllocationSize = AllocationSize; Request->Req.Overwrite.Supersede = FILE_SUPERSEDED == Response->IoStatus.Information; /* diff --git a/tst/memfs/memfs.cpp b/tst/memfs/memfs.cpp index b58df9cf..b6a4e4e1 100644 --- a/tst/memfs/memfs.cpp +++ b/tst/memfs/memfs.cpp @@ -858,11 +858,16 @@ static NTSTATUS Open(FSP_FILE_SYSTEM *FileSystem, } static NTSTATUS Overwrite(FSP_FILE_SYSTEM *FileSystem, - PVOID FileNode0, UINT32 FileAttributes, BOOLEAN ReplaceFileAttributes, + PVOID FileNode0, UINT32 FileAttributes, BOOLEAN ReplaceFileAttributes, UINT64 AllocationSize, FSP_FSCTL_FILE_INFO *FileInfo) { MEMFS *Memfs = (MEMFS *)FileSystem->UserContext; MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0; + NTSTATUS Result; + + Result = SetFileSize(FileSystem, FileNode, AllocationSize, TRUE, FileInfo); + if (!NT_SUCCESS(Result)) + return Result; if (ReplaceFileAttributes) FileNode->FileInfo.FileAttributes = FileAttributes | FILE_ATTRIBUTE_ARCHIVE; @@ -982,6 +987,7 @@ static NTSTATUS Write(FSP_FILE_SYSTEM *FileSystem, MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0; UINT64 EndOffset; + NTSTATUS Result; if (ConstrainedIo) { @@ -997,7 +1003,11 @@ static NTSTATUS Write(FSP_FILE_SYSTEM *FileSystem, Offset = FileNode->FileInfo.FileSize; EndOffset = Offset + Length; if (EndOffset > FileNode->FileInfo.FileSize) - SetFileSize(FileSystem, FileNode, EndOffset, FALSE, FileInfo); + { + Result = SetFileSize(FileSystem, FileNode, EndOffset, FALSE, FileInfo); + if (!NT_SUCCESS(Result)) + return Result; + } } memcpy((PUINT8)FileNode->FileData + Offset, Buffer, (size_t)(EndOffset - Offset));