sys, dll: convert memory barriers to interlocked operations

This commit is contained in:
Bill Zissimopoulos
2022-01-19 10:55:46 +00:00
parent 362b9ceb7c
commit 29251dc2be
10 changed files with 55 additions and 64 deletions

View File

@ -753,8 +753,7 @@ static NTSTATUS FspFsvolNotifyChangeDirectory(
return STATUS_ACCESS_DENIED;
/* stop now if the directory is pending deletion */
DeletePending = 0 != FileNode->DeletePending;
MemoryBarrier();
DeletePending = FspFileNodeDeletePending(FileNode);
if (DeletePending)
return STATUS_DELETE_PENDING;

View File

@ -1521,6 +1521,16 @@ VOID FspFileNodeDereference(FSP_FILE_NODE *FileNode)
if (0 == RefCount)
FspFileNodeDelete(FileNode);
}
static inline
BOOLEAN FspFileNodeDeletePending(FSP_FILE_NODE *FileNode)
{
return 0 != FspInterlockedLoad32((INT32 *)&FileNode->DeletePending);
}
static inline
VOID FspFileNodeSetDeletePending(FSP_FILE_NODE *FileNode, BOOLEAN Delete)
{
FspInterlockedStore32((INT32 *)&FileNode->DeletePending, Delete);
}
VOID FspFileNodeAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags);
BOOLEAN FspFileNodeTryAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags, BOOLEAN Wait);
VOID FspFileNodeAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags);

View File

@ -618,8 +618,7 @@ NTSTATUS FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject,
*/
if (0 != FileNode->MainFileNode)
{
DeletePending = 0 != FileNode->MainFileNode->DeletePending;
MemoryBarrier();
DeletePending = FspFileNodeDeletePending(FileNode->MainFileNode);
if (DeletePending)
{
Result = STATUS_DELETE_PENDING;
@ -669,8 +668,7 @@ NTSTATUS FspFileNodeOpen(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject,
ASSERT(OpenedFileNode != FileNode);
ASSERT(OpenedFileNode->MainFileNode == FileNode->MainFileNode);
DeletePending = 0 != OpenedFileNode->DeletePending;
MemoryBarrier();
DeletePending = FspFileNodeDeletePending(OpenedFileNode);
if (DeletePending)
{
Result = STATUS_DELETE_PENDING;
@ -795,9 +793,8 @@ VOID FspFileNodeCleanup(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject, PULONG
FspFsvolDeviceLockContextTable(FsvolDeviceObject);
if (FileDesc->DeleteOnClose)
FileNode->DeletePending = TRUE;
DeletePending = 0 != FileNode->DeletePending;
MemoryBarrier();
FspFileNodeSetDeletePending(FileNode, TRUE);
DeletePending = FspFileNodeDeletePending(FileNode);
SetAllocationSize = !DeletePending && FileNode->TruncateOnClose;
@ -841,8 +838,7 @@ VOID FspFileNodeCleanupFlush(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject)
FspFsvolDeviceLockContextTable(FsvolDeviceObject);
DeletePending = 0 != FileNode->DeletePending;
MemoryBarrier();
DeletePending = FspFileNodeDeletePending(FileNode);
SingleHandle = 1 == FileNode->HandleCount;
@ -965,8 +961,7 @@ VOID FspFileNodeCleanupComplete(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject
{
SingleHandle = TRUE;
DeletePending = 0 != FileNode->DeletePending;
MemoryBarrier();
DeletePending = FspFileNodeDeletePending(FileNode);
if (DeletePending)
FileNode->Header.FileSize.QuadPart = 0;
@ -1179,7 +1174,7 @@ VOID FspFileNodeOverwriteStreams(FSP_FILE_NODE *FileNode)
DescendantFileNodeIndex++)
{
DescendantFileNode = DescendantFileNodes[DescendantFileNodeIndex];
DescendantFileNode->DeletePending = TRUE;
FspFileNodeSetDeletePending(DescendantFileNode, TRUE);
}
FspFsvolDeviceUnlockContextTable(FsvolDeviceObject);

View File

@ -177,8 +177,7 @@ static NTSTATUS FspFsvolQueryAllInformation(PFILE_OBJECT FileObject,
return FspFsvolQueryNameInformation(FileObject, PBuffer, BufferEnd);
}
DeletePending = 0 != FileNode->DeletePending;
MemoryBarrier();
DeletePending = FspFileNodeDeletePending(FileNode);
Info->BasicInformation.CreationTime.QuadPart = FileInfo->CreationTime;
Info->BasicInformation.LastAccessTime.QuadPart = FileInfo->LastAccessTime;
@ -422,8 +421,7 @@ static NTSTATUS FspFsvolQueryStandardInformation(PFILE_OBJECT FileObject,
return STATUS_SUCCESS;
}
DeletePending = 0 != FileNode->DeletePending;
MemoryBarrier();
DeletePending = FspFileNodeDeletePending(FileNode);
Info->AllocationSize.QuadPart = FileInfo->AllocationSize;
Info->EndOfFile.QuadPart = FileInfo->FileSize;
@ -1626,7 +1624,7 @@ static NTSTATUS FspFsvolSetDispositionInformationSuccess(
UINT32 DispositionFlags = Request->Req.SetInformation.Info.DispositionEx.Flags;
BOOLEAN Delete = BooleanFlagOn(DispositionFlags, FILE_DISPOSITION_DELETE);
FileNode->DeletePending = Delete;
FspFileNodeSetDeletePending(FileNode, Delete);
FileObject->DeletePending = Delete;
if (!Delete)

View File

@ -503,8 +503,7 @@ static NTSTATUS FspFsvolFileSystemControlOplock(
{
BOOLEAN DeletePending;
DeletePending = 0 != FileNode->DeletePending;
MemoryBarrier();
DeletePending = FspFileNodeDeletePending(FileNode);
if (DeletePending)
{
Result = STATUS_DELETE_PENDING;