From f05ebd9d201ec0b9c9e228190934f6917fe0d5a0 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Thu, 10 Nov 2016 18:14:17 -0800 Subject: [PATCH] sys: FspFsvolCreateSharingViolationWork --- src/sys/create.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/sys/create.c b/src/sys/create.c index d366f8fe..6297a64b 100644 --- a/src/sys/create.c +++ b/src/sys/create.c @@ -1063,13 +1063,16 @@ static NTSTATUS FspFsvolCreateSharingViolationWork( } } - Result = FspOplockBreakH(FspFileNodeAddrOfOplock(FileNode), Irp, 0, - &Event, FspFsvolCreateSharingViolationOplockComplete, 0); - if (STATUS_PENDING == Result) + if (!FlagOn(IrpSp->Parameters.Create.Options, FILE_COMPLETE_IF_OPLOCKED)) { - KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, 0); - if (STATUS_SUCCESS == Irp->IoStatus.Status) - StatusSharingViolation = FALSE; + Result = FspOplockBreakH(FspFileNodeAddrOfOplock(FileNode), Irp, 0, + &Event, FspFsvolCreateSharingViolationOplockComplete, 0); + if (STATUS_PENDING == Result) + { + KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, 0); + if (STATUS_SUCCESS == Irp->IoStatus.Status) + StatusSharingViolation = FALSE; + } } exit: @@ -1081,13 +1084,14 @@ exit: if (StatusSharingViolation) { - Response->IoStatus.Status = (UINT32)STATUS_SHARING_VIOLATION; - Response->IoStatus.Information = OpbatchBreakUnderway ? FILE_OPBATCH_BREAK_UNDERWAY : 0; + Irp->IoStatus.Information = OpbatchBreakUnderway ? FILE_OPBATCH_BREAK_UNDERWAY : 0; + return STATUS_SHARING_VIOLATION; + } + else + { + FspIopRetryCompleteIrp(Irp, Response, &Result); + return Result; } - - FspIopRetryCompleteIrp(Irp, Response, &Result); - - return Result; } static VOID FspFsvolCreateSharingViolationOplockComplete(