sys: FSP_FILE_DESC::DidSetMetadata

This commit is contained in:
Bill Zissimopoulos 2016-12-23 16:26:16 -08:00
parent 69f6f661ba
commit ff3436718c
7 changed files with 30 additions and 23 deletions

View File

@ -114,7 +114,7 @@ static NTSTATUS FspFsvolCleanup(
Request->Req.Cleanup.SetArchiveBit = FileModified && !FileDesc->DidSetFileAttributes;
Request->Req.Cleanup.SetLastAccessTime = !FileDesc->DidSetLastAccessTime;
Request->Req.Cleanup.SetLastWriteTime = FileModified && !FileDesc->DidSetLastWriteTime;
Request->Req.Cleanup.SetChangeTime = (FileModified || FileDesc->DidSetBasicInfo) &&
Request->Req.Cleanup.SetChangeTime = (FileModified || FileDesc->DidSetMetadata) &&
!FileDesc->DidSetChangeTime;
FspFileNodeAcquireExclusive(FileNode, Pgio);
@ -137,7 +137,7 @@ static NTSTATUS FspFsvolCleanup(
return FSP_STATUS_IOQ_POST_BEST_EFFORT;
else
{
if (FileDesc->DidSetBasicInfo)
if (FileDesc->DidSetMetadata)
/* invalidate the parent dir info */
FspFileNodeInvalidateParentDirInfo(FileNode);

View File

@ -1199,7 +1199,7 @@ typedef struct
UINT64 UserContext2;
UINT32
CaseSensitive:1, HasTraversePrivilege:1, DeleteOnClose:1,
DidSetBasicInfo:1,
DidSetMetadata:1,
DidSetFileAttributes:1,
DidSetCreationTime:1, DidSetLastAccessTime:1, DidSetLastWriteTime:1, DidSetChangeTime:1,
DirectoryHasSuchFile:1;

View File

@ -996,7 +996,7 @@ static NTSTATUS FspFsvolSetBasicInformation(PFILE_OBJECT FileObject,
if (0 != Request->Req.SetInformation.Info.Basic.ChangeTime)
FileDesc->DidSetChangeTime = TRUE;
FileDesc->DidSetBasicInfo = TRUE;
FileDesc->DidSetMetadata = TRUE;
FspFileNodeNotifyChange(FileNode, NotifyFilter, FILE_ACTION_MODIFIED);
}

View File

@ -149,7 +149,21 @@ NTSTATUS FspFsvolFlushBuffersComplete(
else if (!NT_SUCCESS(FlushResult))
Result = FlushResult;
else
{
PFILE_OBJECT FileObject = IrpSp->FileObject;
FSP_FILE_NODE *FileNode = FileObject->FsContext;
/*
* A flush request on the volume (or the root directory according to FastFat)
* is a request to flush the whole volume.
*/
if (!FspFileNodeIsValid(FileNode) || FileNode->IsRootDirectory)
;
else
SetFlag(FileObject->Flags, FO_FILE_MODIFIED);
Result = STATUS_SUCCESS;
}
FSP_LEAVE_IOC("FileObject=%p",
IrpSp->FileObject);

View File

@ -279,7 +279,14 @@ static NTSTATUS FspFsvolFileSystemControlReparsePointComplete(
PAGED_CODE();
if (IsWrite)
{
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
FSP_FILE_DESC *FileDesc = IrpSp->FileObject->FsContext2;
FileDesc->DidSetMetadata = TRUE;
return STATUS_SUCCESS;
}
NTSTATUS Result;
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);

View File

@ -254,8 +254,11 @@ NTSTATUS FspFsvolSetSecurityComplete(
PFILE_OBJECT FileObject = IrpSp->FileObject;
FSP_FILE_NODE *FileNode = FileObject->FsContext;
FSP_FILE_DESC *FileDesc = FileObject->FsContext2;
FSP_FSCTL_TRANSACT_REQ *Request = FspIrpRequest(Irp);
ASSERT(FileNode == FileDesc->FileNode);
/* if the security descriptor that we got back is valid */
if (0 < Response->Rsp.SetSecurity.SecurityDescriptor.Size &&
Response->Buffer + Response->Rsp.SetSecurity.SecurityDescriptor.Size <=
@ -273,6 +276,8 @@ NTSTATUS FspFsvolSetSecurityComplete(
FspFileNodeSetSecurity(FileNode, 0, 0);
}
FileDesc->DidSetMetadata = TRUE;
FspIopRequestContext(Request, RequestFileNode) = 0;
FspFileNodeReleaseOwner(FileNode, Full, Request);

View File

@ -1091,17 +1091,8 @@ static NTSTATUS Write(FSP_FILE_SYSTEM *FileSystem,
NTSTATUS Flush(FSP_FILE_SYSTEM *FileSystem,
PVOID FileNode0)
{
MEMFS_FILE_NODE *FileNode = (MEMFS_FILE_NODE *)FileNode0;
/* nothing to flush, since we do not cache anything */
if (0 != FileNode)
{
FileNode->FileInfo.LastAccessTime =
FileNode->FileInfo.LastWriteTime =
FileNode->FileInfo.ChangeTime = MemfsGetSystemTime();
}
return STATUS_SUCCESS;
}
@ -1203,10 +1194,6 @@ static NTSTATUS SetFileSize(FSP_FILE_SYSTEM *FileSystem,
if (!NT_SUCCESS(Result))
return Result;
FileNode->FileInfo.LastAccessTime =
FileNode->FileInfo.LastWriteTime =
FileNode->FileInfo.ChangeTime = MemfsGetSystemTime();
MemfsFileNodeGetFileInfo(FileNode, FileInfo);
return STATUS_SUCCESS;
@ -1359,8 +1346,6 @@ static NTSTATUS SetSecurity(FSP_FILE_SYSTEM *FileSystem,
FileNode->FileSecuritySize = FileSecuritySize;
FileNode->FileSecurity = FileSecurity;
FileNode->FileInfo.ChangeTime = MemfsGetSystemTime();
return STATUS_SUCCESS;
}
@ -1565,8 +1550,6 @@ static NTSTATUS SetReparsePoint(FSP_FILE_SYSTEM *FileSystem,
FileNode->ReparseData = ReparseData;
memcpy(FileNode->ReparseData, Buffer, Size);
FileNode->FileInfo.ChangeTime = MemfsGetSystemTime();
return STATUS_SUCCESS;
}
@ -1600,8 +1583,6 @@ static NTSTATUS DeleteReparsePoint(FSP_FILE_SYSTEM *FileSystem,
FileNode->ReparseDataSize = 0;
FileNode->ReparseData = 0;
FileNode->FileInfo.ChangeTime = MemfsGetSystemTime();
return STATUS_SUCCESS;
}
#endif