From 8ef10e5992d85be1df537e0099534817a7a3c1fc Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Mon, 4 Apr 2016 16:13:04 -0700 Subject: [PATCH] sys: IRP_MJ_FLUSH_BUFFERS: fix deadlock when flushing volume --- src/sys/flush.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/sys/flush.c b/src/sys/flush.c index 407110c4..90255991 100644 --- a/src/sys/flush.c +++ b/src/sys/flush.c @@ -37,6 +37,7 @@ static NTSTATUS FspFsvolFlushBuffers( FSP_FILE_DESC *FileDesc = FileObject->FsContext2; FSP_FILE_NODE **FileNodes; ULONG FileNodeCount, Index; + PIRP TopLevelIrp; IO_STATUS_BLOCK IoStatus; FSP_FSCTL_TRANSACT_REQ *Request; @@ -50,6 +51,10 @@ static NTSTATUS FspFsvolFlushBuffers( if (!NT_SUCCESS(Result)) return Result; + /* reset the top-level IRP to avoid deadlock on the FileNodes' resources */ + TopLevelIrp = IoGetTopLevelIrp(); + IoSetTopLevelIrp(0); + /* * Enumerate in reverse order so that files are flushed before containing directories. * This would be useful if we ever started flushing directories, but since we do not @@ -65,6 +70,8 @@ static NTSTATUS FspFsvolFlushBuffers( FlushResult = Result; } + IoSetTopLevelIrp(TopLevelIrp); + FspFileNodeDeleteList(FileNodes, FileNodeCount); Result = FspIopCreateRequest(Irp, 0, 0, &Request);