From b18df6bba821d4c779e773e08987caf32657750f Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Sun, 8 Dec 2019 14:27:02 -0800 Subject: [PATCH] sys: release rename lock when doing oplock breaks --- src/sys/file.c | 9 ++++++--- src/sys/fileinfo.c | 12 ++++++------ 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/sys/file.c b/src/sys/file.c index 80e0116a..1f3ee459 100644 --- a/src/sys/file.c +++ b/src/sys/file.c @@ -1337,8 +1337,9 @@ NTSTATUS FspFileNodeRenameCheck(PDEVICE_OBJECT FsvolDeviceObject, PIRP OplockIrp !MmFlushImageSection(&DescendantFileNode->NonPaged->SectionObjectPointers, MmFlushForDelete))) { - /* release the FileNode in case of failure! */ + /* release the FileNode and rename lock in case of failure! */ FspFileNodeReleaseF(FileNode, AcquireFlags); + FspFsvolDeviceFileRenameRelease(FsvolDeviceObject); Result = STATUS_ACCESS_DENIED; goto exit; @@ -1441,8 +1442,9 @@ NTSTATUS FspFileNodeRenameCheck(PDEVICE_OBJECT FsvolDeviceObject, PIRP OplockIrp if (STATUS_OPLOCK_BREAK_IN_PROGRESS == Result || !NT_SUCCESS(Result)) { - /* release the FileNode so that we can safely wait without deadlocks */ + /* release the FileNode and rename lock so that we can safely wait without deadlocks */ FspFileNodeReleaseF(FileNode, AcquireFlags); + FspFsvolDeviceFileRenameRelease(FsvolDeviceObject); /* wait for oplock breaks to finish */ for ( @@ -1488,8 +1490,9 @@ NTSTATUS FspFileNodeRenameCheck(PDEVICE_OBJECT FsvolDeviceObject, PIRP OplockIrp if (DescendantFileNode != FileNode && 0 < DescendantFileNode->HandleCount) { - /* release the FileNode in case of failure! */ + /* release the FileNode and rename lock in case of failure! */ FspFileNodeReleaseF(FileNode, AcquireFlags); + FspFsvolDeviceFileRenameRelease(FsvolDeviceObject); Result = STATUS_ACCESS_DENIED; break; diff --git a/src/sys/fileinfo.c b/src/sys/fileinfo.c index 84147918..494685ab 100644 --- a/src/sys/fileinfo.c +++ b/src/sys/fileinfo.c @@ -1576,8 +1576,8 @@ static NTSTATUS FspFsvolSetRenameInformation( ASSERT(TargetFileNode->IsDirectory); } - FspFsvolDeviceFileRenameAcquireExclusive(FsvolDeviceObject); retry: + FspFsvolDeviceFileRenameAcquireExclusive(FsvolDeviceObject); FspFileNodeAcquireExclusive(FileNode, Full); if (0 == Request) @@ -1651,13 +1651,13 @@ retry: Result = FspFileNodeRenameCheck(FsvolDeviceObject, Irp, FileNode, FspFileNodeAcquireFull, &FileNode->FileName, TRUE); - /* FspFileNodeRenameCheck releases FileNode with STATUS_OPLOCK_BREAK_IN_PROGRESS or failure */ + /* FspFileNodeRenameCheck releases FileNode and rename lock on failure */ if (STATUS_OPLOCK_BREAK_IN_PROGRESS == Result) goto retry; if (!NT_SUCCESS(Result)) { Result = STATUS_ACCESS_DENIED; - goto rename_unlock_exit; + goto exit; } if (0 != FspFileNameCompare(&FileNode->FileName, &NewFileName, !FileDesc->CaseSensitive, 0)) @@ -1665,13 +1665,13 @@ retry: Result = FspFileNodeRenameCheck(FsvolDeviceObject, Irp, FileNode, FspFileNodeAcquireFull, &NewFileName, FALSE); - /* FspFileNodeRenameCheck releases FileNode with STATUS_OPLOCK_BREAK_IN_PROGRESS or failure */ + /* FspFileNodeRenameCheck releases FileNode and rename lock on failure */ if (STATUS_OPLOCK_BREAK_IN_PROGRESS == Result) goto retry; if (!NT_SUCCESS(Result)) { Result = STATUS_ACCESS_DENIED; - goto rename_unlock_exit; + goto exit; } } else @@ -1713,9 +1713,9 @@ retry: unlock_exit: FspFileNodeRelease(FileNode, Full); -rename_unlock_exit: FspFsvolDeviceFileRenameRelease(FsvolDeviceObject); +exit: return Result; }