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

View File

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

View File

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

View File

@ -149,7 +149,21 @@ NTSTATUS FspFsvolFlushBuffersComplete(
else if (!NT_SUCCESS(FlushResult)) else if (!NT_SUCCESS(FlushResult))
Result = FlushResult; Result = FlushResult;
else 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; Result = STATUS_SUCCESS;
}
FSP_LEAVE_IOC("FileObject=%p", FSP_LEAVE_IOC("FileObject=%p",
IrpSp->FileObject); IrpSp->FileObject);

View File

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

View File

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

View File

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