mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-23 00:43:00 -05:00
sys: create: oplocks WIP
This commit is contained in:
parent
69935525da
commit
dc684acd41
@ -1156,11 +1156,16 @@ static VOID FspFsvolCreateTryOpenRequestFini(FSP_FSCTL_TRANSACT_REQ *Request, PV
|
|||||||
PDEVICE_OBJECT FsvolDeviceObject = Context[RequestDeviceObject];
|
PDEVICE_OBJECT FsvolDeviceObject = Context[RequestDeviceObject];
|
||||||
FSP_FILE_DESC *FileDesc = Context[RequestFileDesc];
|
FSP_FILE_DESC *FileDesc = Context[RequestFileDesc];
|
||||||
PFILE_OBJECT FileObject = Context[RequestFileObject];
|
PFILE_OBJECT FileObject = Context[RequestFileObject];
|
||||||
|
PIRP OplockIrp = FspIopRequestContext(Request, FspIopRequestExtraContext);
|
||||||
|
|
||||||
if (0 != FileDesc)
|
if (0 != FileDesc)
|
||||||
{
|
{
|
||||||
ASSERT(0 != FileObject);
|
ASSERT(0 != FileObject);
|
||||||
|
|
||||||
|
if (OplockIrp)
|
||||||
|
FspCheckOplockEx(FspFileNodeAddrOfOplock(FileDesc->FileNode), OplockIrp,
|
||||||
|
OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK, 0, 0, 0);
|
||||||
|
|
||||||
FspFsvolCreatePostClose(FileDesc);
|
FspFsvolCreatePostClose(FileDesc);
|
||||||
FspFileNodeClose(FileDesc->FileNode, FileObject, TRUE);
|
FspFileNodeClose(FileDesc->FileNode, FileObject, TRUE);
|
||||||
FspFileNodeDereference(FileDesc->FileNode);
|
FspFileNodeDereference(FileDesc->FileNode);
|
||||||
@ -1179,6 +1184,7 @@ static VOID FspFsvolCreateOverwriteRequestFini(FSP_FSCTL_TRANSACT_REQ *Request,
|
|||||||
FSP_FILE_DESC *FileDesc = Context[RequestFileDesc];
|
FSP_FILE_DESC *FileDesc = Context[RequestFileDesc];
|
||||||
PFILE_OBJECT FileObject = Context[RequestFileObject];
|
PFILE_OBJECT FileObject = Context[RequestFileObject];
|
||||||
ULONG State = (ULONG)(UINT_PTR)Context[RequestState];
|
ULONG State = (ULONG)(UINT_PTR)Context[RequestState];
|
||||||
|
PIRP OplockIrp = FspIopRequestContext(Request, FspIopRequestExtraContext);
|
||||||
|
|
||||||
if (0 != FileDesc)
|
if (0 != FileDesc)
|
||||||
{
|
{
|
||||||
@ -1189,6 +1195,10 @@ static VOID FspFsvolCreateOverwriteRequestFini(FSP_FSCTL_TRANSACT_REQ *Request,
|
|||||||
else if (RequestProcessing == State)
|
else if (RequestProcessing == State)
|
||||||
FspFileNodeReleaseOwner(FileDesc->FileNode, Full, Request);
|
FspFileNodeReleaseOwner(FileDesc->FileNode, Full, Request);
|
||||||
|
|
||||||
|
if (OplockIrp)
|
||||||
|
FspCheckOplockEx(FspFileNodeAddrOfOplock(FileDesc->FileNode), OplockIrp,
|
||||||
|
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);
|
||||||
FspFileDescDelete(FileDesc);
|
FspFileDescDelete(FileDesc);
|
||||||
@ -1299,7 +1309,13 @@ static NTSTATUS FspFsvolCreateSharingViolationOplock(
|
|||||||
|
|
||||||
Response = FspIopIrpResponse(Irp);
|
Response = FspIopIrpResponse(Irp);
|
||||||
|
|
||||||
if (!NT_SUCCESS(Result))
|
if (NT_SUCCESS(Result))
|
||||||
|
{
|
||||||
|
FspFileNodeClose(FileNode, 0, TRUE);
|
||||||
|
FspFileNodeDereference(FileNode);
|
||||||
|
FspIopRequestContext(Request, FspIopRequestExtraContext) = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
Response->IoStatus.Status = (UINT32)Result;
|
Response->IoStatus.Status = (UINT32)Result;
|
||||||
Response->IoStatus.Information =
|
Response->IoStatus.Information =
|
||||||
@ -1365,6 +1381,9 @@ static BOOLEAN FspFsvolCreateOpenOrOverwiteOplock(PIRP Irp, const FSP_FSCTL_TRAN
|
|||||||
{
|
{
|
||||||
Result = FspOplockFsctrlCreate(FspFileNodeAddrOfOplock(FileNode), Irp, OplockCount);
|
Result = FspOplockFsctrlCreate(FspFileNodeAddrOfOplock(FileNode), Irp, OplockCount);
|
||||||
ASSERT(STATUS_PENDING != Result);
|
ASSERT(STATUS_PENDING != Result);
|
||||||
|
|
||||||
|
if (STATUS_SUCCESS == Result)
|
||||||
|
FspIopRequestContext(FspIrpRequest(Irp), FspIopRequestExtraContext) = Irp;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (STATUS_SUCCESS != Result &&
|
if (STATUS_SUCCESS != Result &&
|
||||||
|
Loading…
x
Reference in New Issue
Block a user