From 7b94f2bebffa352367accda70d85afcb7ca64246 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Wed, 21 Dec 2016 16:45:01 -0800 Subject: [PATCH] sys: FspFileNodeSetFileInfo: TruncateOnClose --- src/sys/create.c | 14 +++----------- src/sys/driver.h | 2 +- src/sys/file.c | 22 +++++++++++++++++----- src/sys/fileinfo.c | 8 +++----- src/sys/write.c | 9 +++------ 5 files changed, 27 insertions(+), 28 deletions(-) diff --git a/src/sys/create.c b/src/sys/create.c index 5492e498..e5cbe595 100644 --- a/src/sys/create.c +++ b/src/sys/create.c @@ -1024,11 +1024,7 @@ NTSTATUS FspFsvolCreateComplete( /* file was successfully overwritten/superseded */ if (0 == FileNode->MainFileNode) FspFileNodeOverwriteStreams(FileNode); - FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.Overwrite.FileInfo); - - if (0 != Response->Rsp.Overwrite.FileInfo.AllocationSize) - FileNode->TruncateOnClose = TRUE; - + FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.Overwrite.FileInfo, TRUE); FspFileNodeNotifyChange(FileNode, FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE, FILE_ACTION_MODIFIED); @@ -1094,7 +1090,8 @@ static NTSTATUS FspFsvolCreateTryOpen(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Re return Result; } - FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.Create.Opened.FileInfo); + FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.Create.Opened.FileInfo, + FILE_CREATED == Response->IoStatus.Information); if (FlushImage) { @@ -1119,14 +1116,9 @@ static NTSTATUS FspFsvolCreateTryOpen(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Re } if (FILE_CREATED == Response->IoStatus.Information) - { - if (0 != Response->Rsp.Create.Opened.FileInfo.AllocationSize) - FileNode->TruncateOnClose = TRUE; - FspFileNodeNotifyChange(FileNode, FileNode->IsDirectory ? FILE_NOTIFY_CHANGE_DIR_NAME : FILE_NOTIFY_CHANGE_FILE_NAME, FILE_ACTION_ADDED); - } FspFileNodeRelease(FileNode, Main); diff --git a/src/sys/driver.h b/src/sys/driver.h index 0c24b8e8..8b129479 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -1281,7 +1281,7 @@ VOID FspFileNodeRename(FSP_FILE_NODE *FileNode, PUNICODE_STRING NewFileName); VOID FspFileNodeGetFileInfo(FSP_FILE_NODE *FileNode, FSP_FSCTL_FILE_INFO *FileInfo); BOOLEAN FspFileNodeTryGetFileInfo(FSP_FILE_NODE *FileNode, FSP_FSCTL_FILE_INFO *FileInfo); VOID FspFileNodeSetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject, - const FSP_FSCTL_FILE_INFO *FileInfo); + const FSP_FSCTL_FILE_INFO *FileInfo, BOOLEAN TruncateOnClose); BOOLEAN FspFileNodeTrySetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject, const FSP_FSCTL_FILE_INFO *FileInfo, ULONG InfoChangeNumber); static inline diff --git a/src/sys/file.c b/src/sys/file.c index ee704d3a..d35ec6a5 100644 --- a/src/sys/file.c +++ b/src/sys/file.c @@ -55,7 +55,7 @@ VOID FspFileNodeRename(FSP_FILE_NODE *FileNode, PUNICODE_STRING NewFileName); VOID FspFileNodeGetFileInfo(FSP_FILE_NODE *FileNode, FSP_FSCTL_FILE_INFO *FileInfo); BOOLEAN FspFileNodeTryGetFileInfo(FSP_FILE_NODE *FileNode, FSP_FSCTL_FILE_INFO *FileInfo); VOID FspFileNodeSetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject, - const FSP_FSCTL_FILE_INFO *FileInfo); + const FSP_FSCTL_FILE_INFO *FileInfo, BOOLEAN TruncateOnClose); BOOLEAN FspFileNodeTrySetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject, const FSP_FSCTL_FILE_INFO *FileInfo, ULONG InfoChangeNumber); BOOLEAN FspFileNodeReferenceSecurity(FSP_FILE_NODE *FileNode, PCVOID *PBuffer, PULONG PSize); @@ -1416,7 +1416,7 @@ BOOLEAN FspFileNodeTryGetFileInfo(FSP_FILE_NODE *FileNode, FSP_FSCTL_FILE_INFO * } VOID FspFileNodeSetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject, - const FSP_FSCTL_FILE_INFO *FileInfo) + const FSP_FSCTL_FILE_INFO *FileInfo, BOOLEAN TruncateOnClose) { PAGED_CODE(); @@ -1430,8 +1430,20 @@ VOID FspFileNodeSetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject, FsvolDeviceExtension->VolumeParams.SectorsPerAllocationUnit; AllocationSize = (AllocationSize + AllocationUnit - 1) / AllocationUnit * AllocationUnit; - FileNode->Header.AllocationSize.QuadPart = AllocationSize; - FileNode->Header.FileSize.QuadPart = FileInfo->FileSize; + if (TruncateOnClose) + { + if ((UINT64)FileNode->Header.AllocationSize.QuadPart != AllocationSize || + (UINT64)FileNode->Header.FileSize.QuadPart != FileInfo->FileSize) + FileNode->TruncateOnClose = TRUE; + + FileNode->Header.AllocationSize.QuadPart = AllocationSize; + FileNode->Header.FileSize.QuadPart = FileInfo->FileSize; + } + else + { + FileNode->Header.AllocationSize.QuadPart = AllocationSize; + FileNode->Header.FileSize.QuadPart = FileInfo->FileSize; + } FileNode->FileInfoExpirationTime = FileNode->BasicInfoExpirationTime = FspExpirationTimeFromMillis(FsvolDeviceExtension->VolumeParams.FileInfoTimeout); @@ -1521,7 +1533,7 @@ BOOLEAN FspFileNodeTrySetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileOb if (FspFileNodeFileInfoChangeNumber(FileNode) != InfoChangeNumber) return FALSE; - FspFileNodeSetFileInfo(FileNode, CcFileObject, FileInfo); + FspFileNodeSetFileInfo(FileNode, CcFileObject, FileInfo, FALSE); return TRUE; } diff --git a/src/sys/fileinfo.c b/src/sys/fileinfo.c index 3482c62d..6ee7bf0e 100644 --- a/src/sys/fileinfo.c +++ b/src/sys/fileinfo.c @@ -901,8 +901,7 @@ static NTSTATUS FspFsvolSetAllocationInformation(PFILE_OBJECT FileObject, { FSP_FILE_NODE *FileNode = FileObject->FsContext; - FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.SetInformation.FileInfo); - FileNode->TruncateOnClose = TRUE; + FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.SetInformation.FileInfo, TRUE); /* mark the file object as modified */ SetFlag(FileObject->Flags, FO_FILE_MODIFIED); @@ -971,7 +970,7 @@ static NTSTATUS FspFsvolSetBasicInformation(PFILE_OBJECT FileObject, ClearFlag(FileObject->Flags, FO_TEMPORARY_FILE); } - FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.SetInformation.FileInfo); + FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.SetInformation.FileInfo, FALSE); if ((UINT32)-1 != Request->Req.SetInformation.Info.Basic.FileAttributes) NotifyFilter |= FILE_NOTIFY_CHANGE_ATTRIBUTES; @@ -1032,8 +1031,7 @@ static NTSTATUS FspFsvolSetEndOfFileInformation(PFILE_OBJECT FileObject, { FSP_FILE_NODE *FileNode = FileObject->FsContext; - FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.SetInformation.FileInfo); - FileNode->TruncateOnClose = TRUE; + FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.SetInformation.FileInfo, TRUE); /* mark the file object as modified -- FastFat does this only for Allocation though! */ SetFlag(FileObject->Flags, FO_FILE_MODIFIED); diff --git a/src/sys/write.c b/src/sys/write.c index 854ce62a..ef4d192e 100644 --- a/src/sys/write.c +++ b/src/sys/write.c @@ -470,16 +470,13 @@ NTSTATUS FspFsvolWriteComplete( UINT64 OriginalFileSize = FileNode->Header.FileSize.QuadPart; /* update file info */ - FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.Write.FileInfo); + FspFileNodeSetFileInfo(FileNode, FileObject, &Response->Rsp.Write.FileInfo, TRUE); - if (!PagingIo && OriginalFileSize != Response->Rsp.Write.FileInfo.FileSize) - { - FileNode->TruncateOnClose = TRUE; + if (OriginalFileSize != Response->Rsp.Write.FileInfo.FileSize) FspFileNodeNotifyChange(FileNode, FILE_NOTIFY_CHANGE_SIZE, FILE_ACTION_MODIFIED); - } /* update the current file offset if synchronous I/O (and not paging I/O) */ - if (!PagingIo && SynchronousIo) + if (SynchronousIo && !PagingIo) FileObject->CurrentByteOffset.QuadPart = WriteToEndOfFile ? Response->Rsp.Write.FileInfo.FileSize : WriteOffset.QuadPart + Response->IoStatus.Information;