2 * PROJECT: ReactOS FAT file system driver
3 * LICENSE: GNU GPLv3 as published by the Free Software Foundation
4 * FILE: drivers/filesystems/fastfat/lock.c
5 * PURPOSE: Lock support routines
6 * PROGRAMMERS: Aleksey Bragin (aleksey@reactos.org)
9 /* INCLUDES *****************************************************************/
14 /* FUNCTIONS ****************************************************************/
18 FatiLockControl(PFAT_IRP_CONTEXT IrpContext
, PIRP Irp
)
20 PIO_STACK_LOCATION IrpSp
;
21 TYPE_OF_OPEN TypeOfOpen
;
27 /* Get IRP stack location */
28 IrpSp
= IoGetCurrentIrpStackLocation(Irp
);
30 /* Determine type of open */
31 TypeOfOpen
= FatDecodeFileObject(IrpSp
->FileObject
, &Vcb
, &Fcb
, &Ccb
);
33 /* Only user file open is allowed */
34 if (TypeOfOpen
!= UserFileOpen
)
36 FatCompleteRequest(IrpContext
, Irp
, STATUS_INVALID_PARAMETER
);
37 return STATUS_INVALID_PARAMETER
;
40 /* Acquire shared FCB lock */
41 if (!FatAcquireSharedFcb(IrpContext
, Fcb
))
44 //Status = FatFsdPostRequest(IrpContext, Irp);
45 Status
= STATUS_NOT_IMPLEMENTED
;
49 /* Check oplock state */
50 Status
= FsRtlCheckOplock(&Fcb
->Fcb
.Oplock
,
56 if (Status
!= STATUS_SUCCESS
)
58 /* Release FCB lock */
59 FatReleaseFcb(IrpContext
, Fcb
);
64 /* Process the lock */
65 Status
= FsRtlProcessFileLock(&Fcb
->Fcb
.Lock
, Irp
, NULL
);
67 /* Update Fast I/O state */
68 Fcb
->Header
.IsFastIoPossible
= FatIsFastIoPossible(Fcb
);
70 /* Complete the request */
71 FatCompleteRequest(IrpContext
, NULL
, 0);
73 /* Release FCB lock */
74 FatReleaseFcb(IrpContext
, Fcb
);
81 FatLockControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
)
83 PFAT_IRP_CONTEXT IrpContext
;
87 DPRINT1("FatLockControl()\n");
89 /* Enter FsRtl critical region */
90 FsRtlEnterFileSystem();
92 /* Set Top Level IRP if not set */
93 TopLevel
= FatIsTopLevelIrp(Irp
);
95 /* Build an irp context */
96 IrpContext
= FatBuildIrpContext(Irp
, IoIsOperationSynchronous(Irp
));
98 /* Call internal function */
99 Status
= FatiLockControl(IrpContext
, Irp
);
101 /* Reset Top Level IRP */
102 if (TopLevel
) IoSetTopLevelIrp(NULL
);
104 /* Leave FsRtl critical region */
105 FsRtlExitFileSystem();
112 FatOplockComplete(IN PVOID Context
,
120 FatPrePostIrp(IN PVOID Context
,