sys: create: oplocks WIP

This commit is contained in:
Bill Zissimopoulos 2016-11-11 17:58:57 -08:00
parent 6ba6e16851
commit 69935525da

View File

@ -35,14 +35,14 @@ static VOID FspFsvolCreatePostClose(FSP_FILE_DESC *FileDesc);
static FSP_IOP_REQUEST_FINI FspFsvolCreateRequestFini; static FSP_IOP_REQUEST_FINI FspFsvolCreateRequestFini;
static FSP_IOP_REQUEST_FINI FspFsvolCreateTryOpenRequestFini; static FSP_IOP_REQUEST_FINI FspFsvolCreateTryOpenRequestFini;
static FSP_IOP_REQUEST_FINI FspFsvolCreateOverwriteRequestFini; static FSP_IOP_REQUEST_FINI FspFsvolCreateOverwriteRequestFini;
static NTSTATUS FspFsvolCreateSharingViolationCheckOplock( static NTSTATUS FspFsvolCreateSharingViolationOplock(
PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp, PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp,
BOOLEAN CanWait); 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); PNTSTATUS PResult);
static VOID FspFsvolCreateCheckOplockPrepare( static VOID FspFsvolCreateOpenOrOverwiteOplockPrepare(
PVOID Context, PIRP Irp); PVOID Context, PIRP Irp);
static VOID FspFsvolCreateCheckOplockComplete( static VOID FspFsvolCreateOpenOrOverwiteOplockComplete(
PVOID Context, PIRP Irp); PVOID Context, PIRP Irp);
FSP_DRIVER_DISPATCH FspCreate; FSP_DRIVER_DISPATCH FspCreate;
@ -58,10 +58,10 @@ FSP_DRIVER_DISPATCH FspCreate;
#pragma alloc_text(PAGE, FspFsvolCreateRequestFini) #pragma alloc_text(PAGE, FspFsvolCreateRequestFini)
#pragma alloc_text(PAGE, FspFsvolCreateTryOpenRequestFini) #pragma alloc_text(PAGE, FspFsvolCreateTryOpenRequestFini)
#pragma alloc_text(PAGE, FspFsvolCreateOverwriteRequestFini) #pragma alloc_text(PAGE, FspFsvolCreateOverwriteRequestFini)
#pragma alloc_text(PAGE, FspFsvolCreateSharingViolationCheckOplock) #pragma alloc_text(PAGE, FspFsvolCreateSharingViolationOplock)
#pragma alloc_text(PAGE, FspFsvolCreateCheckOplock) #pragma alloc_text(PAGE, FspFsvolCreateOpenOrOverwiteOplock)
#pragma alloc_text(PAGE, FspFsvolCreateCheckOplockPrepare) #pragma alloc_text(PAGE, FspFsvolCreateOpenOrOverwiteOplockPrepare)
#pragma alloc_text(PAGE, FspFsvolCreateCheckOplockComplete) #pragma alloc_text(PAGE, FspFsvolCreateOpenOrOverwiteOplockComplete)
#pragma alloc_text(PAGE, FspCreate) #pragma alloc_text(PAGE, FspCreate)
#endif #endif
@ -588,7 +588,7 @@ NTSTATUS FspFsvolCreatePrepare(
Result = STATUS_SUCCESS; Result = STATUS_SUCCESS;
Success = DEBUGTEST(90) && Success = DEBUGTEST(90) &&
FspFileNodeTryAcquireExclusive(FileNode, Full) && FspFileNodeTryAcquireExclusive(FileNode, Full) &&
FspFsvolCreateCheckOplock(Irp, 0, &Result); FspFsvolCreateOpenOrOverwiteOplock(Irp, 0, &Result);
if (!Success) if (!Success)
{ {
if (!NT_SUCCESS(Result) || STATUS_PENDING == Result) if (!NT_SUCCESS(Result) || STATUS_PENDING == Result)
@ -846,7 +846,7 @@ NTSTATUS FspFsvolCreateComplete(
FspIopRequestContext(Request, FspIopRequestExtraContext) = FileNode; FspIopRequestContext(Request, FspIopRequestExtraContext) = FileNode;
Irp->IoStatus.Information = 0; Irp->IoStatus.Information = 0;
Result = FspFsvolCreateSharingViolationCheckOplock( Result = FspFsvolCreateSharingViolationOplock(
FsvolDeviceObject, Irp, IrpSp, FALSE); FsvolDeviceObject, Irp, IrpSp, FALSE);
FSP_RETURN(); FSP_RETURN();
@ -1020,7 +1020,7 @@ static NTSTATUS FspFsvolCreateTryOpen(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Re
Result = STATUS_SUCCESS; Result = STATUS_SUCCESS;
Success = DEBUGTEST(90) && Success = DEBUGTEST(90) &&
FspFileNodeTryAcquireExclusive(FileNode, Main) && FspFileNodeTryAcquireExclusive(FileNode, Main) &&
FspFsvolCreateCheckOplock(Irp, Response, &Result); FspFsvolCreateOpenOrOverwiteOplock(Irp, Response, &Result);
if (!Success) if (!Success)
{ {
if (!NT_SUCCESS(Result) || STATUS_PENDING == Result) if (!NT_SUCCESS(Result) || STATUS_PENDING == Result)
@ -1198,7 +1198,7 @@ static VOID FspFsvolCreateOverwriteRequestFini(FSP_FSCTL_TRANSACT_REQ *Request,
FspFsvolDeviceFileRenameReleaseOwner(FsvolDeviceObject, Request); FspFsvolDeviceFileRenameReleaseOwner(FsvolDeviceObject, Request);
} }
static NTSTATUS FspFsvolCreateSharingViolationCheckOplock( static NTSTATUS FspFsvolCreateSharingViolationOplock(
PDEVICE_OBJECT FsvolDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp, PDEVICE_OBJECT FsvolDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp,
BOOLEAN CanWait) BOOLEAN CanWait)
{ {
@ -1240,7 +1240,7 @@ static NTSTATUS FspFsvolCreateSharingViolationCheckOplock(
FspFileNodeTryAcquireSharedF(FileNode, FspFileNodeAcquireMain, CanWait); FspFileNodeTryAcquireSharedF(FileNode, FspFileNodeAcquireMain, CanWait);
if (!Success) if (!Success)
return FspWqRepostIrpWorkItem(Irp, return FspWqRepostIrpWorkItem(Irp,
FspFsvolCreateSharingViolationCheckOplock, FspFsvolCreateRequestFini); FspFsvolCreateSharingViolationOplock, FspFsvolCreateRequestFini);
if (!CanWait) if (!CanWait)
{ {
@ -1256,7 +1256,7 @@ static NTSTATUS FspFsvolCreateSharingViolationCheckOplock(
if (!Success) if (!Success)
return FspWqRepostIrpWorkItem(Irp, return FspWqRepostIrpWorkItem(Irp,
FspFsvolCreateSharingViolationCheckOplock, FspFsvolCreateRequestFini); FspFsvolCreateSharingViolationOplock, FspFsvolCreateRequestFini);
return STATUS_SHARING_VIOLATION; 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) PNTSTATUS PResult)
{ {
PAGED_CODE(); PAGED_CODE();
@ -1351,7 +1351,9 @@ static BOOLEAN FspFsvolCreateCheckOplock(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP
if (CheckOplock) if (CheckOplock)
{ {
Result = FspCheckOplock(FspFileNodeAddrOfOplock(FileNode), Irp, Result = FspCheckOplock(FspFileNodeAddrOfOplock(FileNode), Irp,
(PVOID)Response, FspFsvolCreateCheckOplockComplete, FspFsvolCreateCheckOplockPrepare); (PVOID)Response,
FspFsvolCreateOpenOrOverwiteOplockComplete,
FspFsvolCreateOpenOrOverwiteOplockPrepare);
if (STATUS_PENDING == Result) if (STATUS_PENDING == Result)
{ {
*PResult = Result; *PResult = Result;
@ -1360,7 +1362,10 @@ static BOOLEAN FspFsvolCreateCheckOplock(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP
} }
if (OpenRequiringOplock && STATUS_SUCCESS == Result) if (OpenRequiringOplock && STATUS_SUCCESS == Result)
{
Result = FspOplockFsctrlCreate(FspFileNodeAddrOfOplock(FileNode), Irp, OplockCount); Result = FspOplockFsctrlCreate(FspFileNodeAddrOfOplock(FileNode), Irp, OplockCount);
ASSERT(STATUS_PENDING != Result);
}
if (STATUS_SUCCESS != Result && if (STATUS_SUCCESS != Result &&
STATUS_OPLOCK_BREAK_IN_PROGRESS != Result) STATUS_OPLOCK_BREAK_IN_PROGRESS != Result)
@ -1373,7 +1378,7 @@ static BOOLEAN FspFsvolCreateCheckOplock(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP
return TRUE; return TRUE;
} }
static VOID FspFsvolCreateCheckOplockPrepare( static VOID FspFsvolCreateOpenOrOverwiteOplockPrepare(
PVOID Context, PIRP Irp) PVOID Context, PIRP Irp)
{ {
PAGED_CODE(); PAGED_CODE();
@ -1382,7 +1387,7 @@ static VOID FspFsvolCreateCheckOplockPrepare(
FspIopSetIrpResponse(Irp, Context); FspIopSetIrpResponse(Irp, Context);
} }
static VOID FspFsvolCreateCheckOplockComplete( static VOID FspFsvolCreateOpenOrOverwiteOplockComplete(
PVOID Context, PIRP Irp) PVOID Context, PIRP Irp)
{ {
PAGED_CODE(); PAGED_CODE();