From 69935525dae95349b427342598dfcfa3fb3e9f9f Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Fri, 11 Nov 2016 17:58:57 -0800 Subject: [PATCH] sys: create: oplocks WIP --- src/sys/create.c | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/src/sys/create.c b/src/sys/create.c index 4fd86e0c..795170a8 100644 --- a/src/sys/create.c +++ b/src/sys/create.c @@ -35,14 +35,14 @@ static VOID FspFsvolCreatePostClose(FSP_FILE_DESC *FileDesc); static FSP_IOP_REQUEST_FINI FspFsvolCreateRequestFini; static FSP_IOP_REQUEST_FINI FspFsvolCreateTryOpenRequestFini; static FSP_IOP_REQUEST_FINI FspFsvolCreateOverwriteRequestFini; -static NTSTATUS FspFsvolCreateSharingViolationCheckOplock( +static NTSTATUS FspFsvolCreateSharingViolationOplock( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp, BOOLEAN CanWait); -static BOOLEAN FspFsvolCreateCheckOplock(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response, +static BOOLEAN FspFsvolCreateOpenOrOverwiteOplock(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response, PNTSTATUS PResult); -static VOID FspFsvolCreateCheckOplockPrepare( +static VOID FspFsvolCreateOpenOrOverwiteOplockPrepare( PVOID Context, PIRP Irp); -static VOID FspFsvolCreateCheckOplockComplete( +static VOID FspFsvolCreateOpenOrOverwiteOplockComplete( PVOID Context, PIRP Irp); FSP_DRIVER_DISPATCH FspCreate; @@ -58,10 +58,10 @@ FSP_DRIVER_DISPATCH FspCreate; #pragma alloc_text(PAGE, FspFsvolCreateRequestFini) #pragma alloc_text(PAGE, FspFsvolCreateTryOpenRequestFini) #pragma alloc_text(PAGE, FspFsvolCreateOverwriteRequestFini) -#pragma alloc_text(PAGE, FspFsvolCreateSharingViolationCheckOplock) -#pragma alloc_text(PAGE, FspFsvolCreateCheckOplock) -#pragma alloc_text(PAGE, FspFsvolCreateCheckOplockPrepare) -#pragma alloc_text(PAGE, FspFsvolCreateCheckOplockComplete) +#pragma alloc_text(PAGE, FspFsvolCreateSharingViolationOplock) +#pragma alloc_text(PAGE, FspFsvolCreateOpenOrOverwiteOplock) +#pragma alloc_text(PAGE, FspFsvolCreateOpenOrOverwiteOplockPrepare) +#pragma alloc_text(PAGE, FspFsvolCreateOpenOrOverwiteOplockComplete) #pragma alloc_text(PAGE, FspCreate) #endif @@ -588,7 +588,7 @@ NTSTATUS FspFsvolCreatePrepare( Result = STATUS_SUCCESS; Success = DEBUGTEST(90) && FspFileNodeTryAcquireExclusive(FileNode, Full) && - FspFsvolCreateCheckOplock(Irp, 0, &Result); + FspFsvolCreateOpenOrOverwiteOplock(Irp, 0, &Result); if (!Success) { if (!NT_SUCCESS(Result) || STATUS_PENDING == Result) @@ -846,7 +846,7 @@ NTSTATUS FspFsvolCreateComplete( FspIopRequestContext(Request, FspIopRequestExtraContext) = FileNode; Irp->IoStatus.Information = 0; - Result = FspFsvolCreateSharingViolationCheckOplock( + Result = FspFsvolCreateSharingViolationOplock( FsvolDeviceObject, Irp, IrpSp, FALSE); FSP_RETURN(); @@ -1020,7 +1020,7 @@ static NTSTATUS FspFsvolCreateTryOpen(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Re Result = STATUS_SUCCESS; Success = DEBUGTEST(90) && FspFileNodeTryAcquireExclusive(FileNode, Main) && - FspFsvolCreateCheckOplock(Irp, Response, &Result); + FspFsvolCreateOpenOrOverwiteOplock(Irp, Response, &Result); if (!Success) { if (!NT_SUCCESS(Result) || STATUS_PENDING == Result) @@ -1198,7 +1198,7 @@ static VOID FspFsvolCreateOverwriteRequestFini(FSP_FSCTL_TRANSACT_REQ *Request, FspFsvolDeviceFileRenameReleaseOwner(FsvolDeviceObject, Request); } -static NTSTATUS FspFsvolCreateSharingViolationCheckOplock( +static NTSTATUS FspFsvolCreateSharingViolationOplock( PDEVICE_OBJECT FsvolDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp, BOOLEAN CanWait) { @@ -1240,7 +1240,7 @@ static NTSTATUS FspFsvolCreateSharingViolationCheckOplock( FspFileNodeTryAcquireSharedF(FileNode, FspFileNodeAcquireMain, CanWait); if (!Success) return FspWqRepostIrpWorkItem(Irp, - FspFsvolCreateSharingViolationCheckOplock, FspFsvolCreateRequestFini); + FspFsvolCreateSharingViolationOplock, FspFsvolCreateRequestFini); if (!CanWait) { @@ -1256,7 +1256,7 @@ static NTSTATUS FspFsvolCreateSharingViolationCheckOplock( if (!Success) return FspWqRepostIrpWorkItem(Irp, - FspFsvolCreateSharingViolationCheckOplock, FspFsvolCreateRequestFini); + FspFsvolCreateSharingViolationOplock, FspFsvolCreateRequestFini); return STATUS_SHARING_VIOLATION; } @@ -1312,7 +1312,7 @@ static NTSTATUS FspFsvolCreateSharingViolationCheckOplock( } } -static BOOLEAN FspFsvolCreateCheckOplock(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response, +static BOOLEAN FspFsvolCreateOpenOrOverwiteOplock(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response, PNTSTATUS PResult) { PAGED_CODE(); @@ -1351,7 +1351,9 @@ static BOOLEAN FspFsvolCreateCheckOplock(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP if (CheckOplock) { Result = FspCheckOplock(FspFileNodeAddrOfOplock(FileNode), Irp, - (PVOID)Response, FspFsvolCreateCheckOplockComplete, FspFsvolCreateCheckOplockPrepare); + (PVOID)Response, + FspFsvolCreateOpenOrOverwiteOplockComplete, + FspFsvolCreateOpenOrOverwiteOplockPrepare); if (STATUS_PENDING == Result) { *PResult = Result; @@ -1360,7 +1362,10 @@ static BOOLEAN FspFsvolCreateCheckOplock(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP } if (OpenRequiringOplock && STATUS_SUCCESS == Result) + { Result = FspOplockFsctrlCreate(FspFileNodeAddrOfOplock(FileNode), Irp, OplockCount); + ASSERT(STATUS_PENDING != Result); + } if (STATUS_SUCCESS != Result && STATUS_OPLOCK_BREAK_IN_PROGRESS != Result) @@ -1373,7 +1378,7 @@ static BOOLEAN FspFsvolCreateCheckOplock(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP return TRUE; } -static VOID FspFsvolCreateCheckOplockPrepare( +static VOID FspFsvolCreateOpenOrOverwiteOplockPrepare( PVOID Context, PIRP Irp) { PAGED_CODE(); @@ -1382,7 +1387,7 @@ static VOID FspFsvolCreateCheckOplockPrepare( FspIopSetIrpResponse(Irp, Context); } -static VOID FspFsvolCreateCheckOplockComplete( +static VOID FspFsvolCreateOpenOrOverwiteOplockComplete( PVOID Context, PIRP Irp) { PAGED_CODE();