From 7518a6e418df917272cdc4e55190f9593879f6ec Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Sat, 12 Nov 2016 13:12:35 -0800 Subject: [PATCH] sys: read, write: oplocks --- src/sys/read.c | 21 +++++++++++++++++++++ src/sys/write.c | 21 +++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/src/sys/read.c b/src/sys/read.c index e9248652..6dce513c 100644 --- a/src/sys/read.c +++ b/src/sys/read.c @@ -116,6 +116,15 @@ static NTSTATUS FspFsvolReadCached( if (!Success) return FspWqRepostIrpWorkItem(Irp, FspFsvolReadCached, 0); + /* perform oplock check */ + Result = FspCheckOplock(FspFileNodeAddrOfOplock(FileNode), Irp, + (PVOID)(UINT_PTR)FspFsvolReadCached, FspWqOplockComplete, FspWqOplockPrepare); + if (STATUS_PENDING == Result) + { + FspFileNodeRelease(FileNode, Main); + return Result; + } + /* check the file locks */ if (!FsRtlCheckLockForReadAccess(&FileNode->FileLock, Irp)) { @@ -236,6 +245,18 @@ static NTSTATUS FspFsvolReadNonCached( if (!Success) return FspWqRepostIrpWorkItem(Irp, FspFsvolReadNonCached, 0); + /* perform oplock check */ + if (!PagingIo) + { + Result = FspCheckOplock(FspFileNodeAddrOfOplock(FileNode), Irp, + (PVOID)(UINT_PTR)FspFsvolReadNonCached, FspWqOplockComplete, FspWqOplockPrepare); + if (STATUS_PENDING == Result) + { + FspFileNodeRelease(FileNode, Full); + return Result; + } + } + /* check the file locks */ if (!PagingIo && !FsRtlCheckLockForReadAccess(&FileNode->FileLock, Irp)) { diff --git a/src/sys/write.c b/src/sys/write.c index ea2a5a7e..b66b132b 100644 --- a/src/sys/write.c +++ b/src/sys/write.c @@ -140,6 +140,15 @@ static NTSTATUS FspFsvolWriteCached( if (!Success) return FspWqRepostIrpWorkItem(Irp, FspFsvolWriteCached, 0); + /* perform oplock check */ + Result = FspCheckOplock(FspFileNodeAddrOfOplock(FileNode), Irp, + (PVOID)(UINT_PTR)FspFsvolWriteCached, FspWqOplockComplete, FspWqOplockPrepare); + if (STATUS_PENDING == Result) + { + FspFileNodeRelease(FileNode, Main); + return Result; + } + /* check the file locks */ if (!FsRtlCheckLockForWriteAccess(&FileNode->FileLock, Irp)) { @@ -306,6 +315,18 @@ static NTSTATUS FspFsvolWriteNonCached( if (!Success) return FspWqRepostIrpWorkItem(Irp, FspFsvolWriteNonCached, 0); + /* perform oplock check */ + if (!PagingIo) + { + Result = FspCheckOplock(FspFileNodeAddrOfOplock(FileNode), Irp, + (PVOID)(UINT_PTR)FspFsvolWriteNonCached, FspWqOplockComplete, FspWqOplockPrepare); + if (STATUS_PENDING == Result) + { + FspFileNodeRelease(FileNode, Full); + return Result; + } + } + /* check the file locks */ if (!PagingIo && !FsRtlCheckLockForWriteAccess(&FileNode->FileLock, Irp)) {