sys: FspFsvolCreateSharingViolationOplock: fix problem with missed FspFsvolCreatePostClose

This commit is contained in:
Bill Zissimopoulos 2017-02-03 18:08:11 -08:00
parent 6e70500afc
commit bfc41127d0

View File

@ -878,7 +878,6 @@ NTSTATUS FspFsvolCreateComplete(
Result = FspFsvolCreateSharingViolationOplock( Result = FspFsvolCreateSharingViolationOplock(
FsvolDeviceObject, Irp, IrpSp, FALSE); FsvolDeviceObject, Irp, IrpSp, FALSE);
if (STATUS_PENDING == Result)
FSP_RETURN(); FSP_RETURN();
} }
else else
@ -1317,6 +1316,7 @@ static NTSTATUS FspFsvolCreateSharingViolationOplock(
FSP_FSCTL_TRANSACT_REQ *Request = FspIrpRequest(Irp); FSP_FSCTL_TRANSACT_REQ *Request = FspIrpRequest(Irp);
FSP_FSCTL_TRANSACT_RSP *Response; FSP_FSCTL_TRANSACT_RSP *Response;
FSP_FILE_DESC *FileDesc = FspIopRequestContext(Request, RequestFileDesc);
FSP_FILE_NODE *ExtraFileNode = FspIopRequestContext(Request, FspIopRequestExtraContext); FSP_FILE_NODE *ExtraFileNode = FspIopRequestContext(Request, FspIopRequestExtraContext);
ULONG SharingViolationReason = (ULONG)Irp->IoStatus.Information; ULONG SharingViolationReason = (ULONG)Irp->IoStatus.Information;
NTSTATUS Result; NTSTATUS Result;
@ -1353,6 +1353,12 @@ static NTSTATUS FspFsvolCreateSharingViolationOplock(
return FspWqRepostIrpWorkItem(Irp, return FspWqRepostIrpWorkItem(Irp,
FspFsvolCreateSharingViolationOplock, FspFsvolCreateRequestFini); FspFsvolCreateSharingViolationOplock, FspFsvolCreateRequestFini);
FspFileNodeClose(ExtraFileNode, 0, TRUE);
FspFileNodeDereference(ExtraFileNode);
FspIopRequestContext(Request, FspIopRequestExtraContext) = 0;
FspFsvolCreatePostClose(FileDesc);
Irp->IoStatus.Information = 0; Irp->IoStatus.Information = 0;
return STATUS_SHARING_VIOLATION; return STATUS_SHARING_VIOLATION;
} }
@ -1371,7 +1377,6 @@ static NTSTATUS FspFsvolCreateSharingViolationOplock(
* stream. * stream.
*/ */
FSP_FILE_DESC *FileDesc = FspIopRequestContext(Request, RequestFileDesc);
FSP_FILE_NODE *FileNode = FileDesc->FileNode; FSP_FILE_NODE *FileNode = FileDesc->FileNode;
/* break Batch oplocks on the main file and this stream */ /* break Batch oplocks on the main file and this stream */
@ -1427,14 +1432,14 @@ static NTSTATUS FspFsvolCreateSharingViolationOplock(
Response = FspIopIrpResponse(Irp); Response = FspIopIrpResponse(Irp);
if (STATUS_SUCCESS == Result)
{
FspFileNodeClose(ExtraFileNode, 0, TRUE); FspFileNodeClose(ExtraFileNode, 0, TRUE);
FspFileNodeDereference(ExtraFileNode); FspFileNodeDereference(ExtraFileNode);
FspIopRequestContext(Request, FspIopRequestExtraContext) = 0; FspIopRequestContext(Request, FspIopRequestExtraContext) = 0;
}
else if (STATUS_SUCCESS != Result)
{ {
FspFsvolCreatePostClose(FileDesc);
Response->IoStatus.Status = (UINT32)Result; Response->IoStatus.Status = (UINT32)Result;
Response->IoStatus.Information = (UINT32)Irp->IoStatus.Information; Response->IoStatus.Information = (UINT32)Irp->IoStatus.Information;
} }