sys: oplock testing

This commit is contained in:
Bill Zissimopoulos 2016-11-15 17:05:05 -08:00
parent f17168f2fa
commit 4294182c1a

View File

@ -1113,6 +1113,7 @@ static VOID FspFsvolCreateRequestFini(FSP_FSCTL_TRANSACT_REQ *Request, PVOID Con
if (0 != ExtraFileNode) if (0 != ExtraFileNode)
{ {
ASSERT(FspFileNodeIsValid(ExtraFileNode));
FspFileNodeClose(ExtraFileNode, 0, TRUE); FspFileNodeClose(ExtraFileNode, 0, TRUE);
FspFileNodeDereference(ExtraFileNode); FspFileNodeDereference(ExtraFileNode);
} }
@ -1165,8 +1166,11 @@ static VOID FspFsvolCreateTryOpenRequestFini(FSP_FSCTL_TRANSACT_REQ *Request, PV
ASSERT(0 != FileObject); ASSERT(0 != FileObject);
if (OplockIrp) if (OplockIrp)
{
ASSERT(IO_TYPE_IRP == OplockIrp->Type);
FspCheckOplockEx(FspFileNodeAddrOfOplock(FileDesc->FileNode), OplockIrp, FspCheckOplockEx(FspFileNodeAddrOfOplock(FileDesc->FileNode), OplockIrp,
OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK, 0, 0, 0); OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK, 0, 0, 0);
}
FspFsvolCreatePostClose(FileDesc); FspFsvolCreatePostClose(FileDesc);
FspFileNodeClose(FileDesc->FileNode, FileObject, TRUE); FspFileNodeClose(FileDesc->FileNode, FileObject, TRUE);
@ -1198,8 +1202,11 @@ static VOID FspFsvolCreateOverwriteRequestFini(FSP_FSCTL_TRANSACT_REQ *Request,
FspFileNodeReleaseOwner(FileDesc->FileNode, Full, Request); FspFileNodeReleaseOwner(FileDesc->FileNode, Full, Request);
if (OplockIrp) if (OplockIrp)
{
ASSERT(IO_TYPE_IRP == OplockIrp->Type);
FspCheckOplockEx(FspFileNodeAddrOfOplock(FileDesc->FileNode), OplockIrp, FspCheckOplockEx(FspFileNodeAddrOfOplock(FileDesc->FileNode), OplockIrp,
OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK, 0, 0, 0); OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK, 0, 0, 0);
}
FspFileNodeClose(FileDesc->FileNode, FileObject, TRUE); FspFileNodeClose(FileDesc->FileNode, FileObject, TRUE);
FspFileNodeDereference(FileDesc->FileNode); FspFileNodeDereference(FileDesc->FileNode);
@ -1260,9 +1267,10 @@ static NTSTATUS FspFsvolCreateSharingViolationOplock(
* If there is no batch or CACHE_HANDLE_LEVEL oplock we are done; * If there is no batch or CACHE_HANDLE_LEVEL oplock we are done;
* else retry in a worker thread to break the oplocks. * else retry in a worker thread to break the oplocks.
*/ */
Success = !FsRtlCurrentBatchOplock(FspFileNodeAddrOfOplock(ExtraFileNode)) && Success = DEBUGTEST(90) &&
(!FsRtlCurrentBatchOplock(FspFileNodeAddrOfOplock(ExtraFileNode)) &&
(FlagOn(IrpSp->Parameters.Create.Options, FILE_COMPLETE_IF_OPLOCKED) || (FlagOn(IrpSp->Parameters.Create.Options, FILE_COMPLETE_IF_OPLOCKED) ||
!FsRtlCurrentOplockH(FspFileNodeAddrOfOplock(ExtraFileNode))); !FsRtlCurrentOplockH(FspFileNodeAddrOfOplock(ExtraFileNode))));
FspFileNodeRelease(ExtraFileNode, Main); FspFileNodeRelease(ExtraFileNode, Main);