From 279778265f747e759afa033fec7ddf02691e4f88 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Wed, 13 Apr 2016 12:15:56 -0700 Subject: [PATCH] sys: FspAcquireForModWrite: fix deadlock between the Lazy Writer and the Mod Writer. --- src/sys/callbacks.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/sys/callbacks.c b/src/sys/callbacks.c index 273db084..525d8c35 100644 --- a/src/sys/callbacks.c +++ b/src/sys/callbacks.c @@ -99,11 +99,20 @@ NTSTATUS FspAcquireForModWrite( FSP_ENTER(PAGED_CODE()); FSP_FILE_NODE *FileNode = FileObject->FsContext; + BOOLEAN Success; ASSERT((PIRP)FSRTL_MOD_WRITE_TOP_LEVEL_IRP == IoGetTopLevelIrp()); - FspFileNodeAcquireExclusive(FileNode, Full); - *ResourceToRelease = FileNode->Header.PagingIoResource; - /* ignored by us, but ModWriter expects it; any (non-NULL) resource will do */ + Success = FspFileNodeTryAcquireExclusiveF(FileNode, FspFileNodeAcquireFull, FALSE); + if (Success) + { + *ResourceToRelease = FileNode->Header.PagingIoResource; + Result = STATUS_SUCCESS; + } + else + { + *ResourceToRelease = 0; + Result = STATUS_CANT_WAIT; + } FSP_LEAVE("FileObject=%p", FileObject); }