Reactos
1/*
2 * COPYRIGHT: See COPYRIGHT.TXT
3 * PROJECT: Ext2 File System Driver for WinNT/2K/XP
4 * FILE: cmcb.c
5 * PROGRAMMER: Matt Wu <mattwu@163.com>
6 * HOMEPAGE: http://www.ext2fsd.com
7 * UPDATE HISTORY:
8 */
9
10/* INCLUDES *****************************************************************/
11
12#include "ext2fs.h"
13
14/* GLOBALS ***************************************************************/
15
16extern PEXT2_GLOBAL Ext2Global;
17
18/* DEFINITIONS *************************************************************/
19
20#define CMCB_DEBUG_LEVEL DL_NVR
21
22#ifdef __REACTOS__
23BOOLEAN NTAPI
24#else
25BOOLEAN
26#endif
27Ext2AcquireForLazyWrite (
28 IN PVOID Context,
29 IN BOOLEAN Wait)
30{
31 //
32 // On a readonly filesystem this function still has to exist but it
33 // doesn't need to do anything.
34
35 PEXT2_FCB Fcb;
36
37 Fcb = (PEXT2_FCB) Context;
38 ASSERT(Fcb != NULL);
39 ASSERT((Fcb->Identifier.Type == EXT2FCB) &&
40 (Fcb->Identifier.Size == sizeof(EXT2_FCB)));
41#if EXT2_DEBUG
42 DEBUG(CMCB_DEBUG_LEVEL, ("Ext2AcquireForLazyWrite: %s %s Fcb=%p\n",
43 Ext2GetCurrentProcessName(), "ACQUIRE_FOR_LAZY_WRITE", Fcb));
44#endif
45 if (!ExAcquireResourceExclusiveLite(Fcb->Header.Resource, Wait)) {
46 return FALSE;
47 }
48
49 ASSERT(Fcb->LazyWriterThread == NULL);
50 Fcb->LazyWriterThread = PsGetCurrentThread();
51
52 ASSERT(IoGetTopLevelIrp() == NULL);
53 IoSetTopLevelIrp((PIRP)FSRTL_CACHE_TOP_LEVEL_IRP);
54
55 return TRUE;
56}
57
58#ifdef __REACTOS__
59VOID NTAPI
60#else
61VOID
62#endif
63Ext2ReleaseFromLazyWrite (IN PVOID Context)
64{
65 //
66 // On a readonly filesystem this function still has to exist but it
67 // doesn't need to do anything.
68 PEXT2_FCB Fcb = (PEXT2_FCB) Context;
69
70 ASSERT(Fcb != NULL);
71
72 ASSERT((Fcb->Identifier.Type == EXT2FCB) &&
73 (Fcb->Identifier.Size == sizeof(EXT2_FCB)));
74#if EXT2_DEBUG
75 DEBUG(CMCB_DEBUG_LEVEL, ( "Ext2ReleaseFromLazyWrite: %s %s Fcb=%p\n",
76 Ext2GetCurrentProcessName(), "RELEASE_FROM_LAZY_WRITE", Fcb));
77#endif
78 ASSERT(Fcb->LazyWriterThread == PsGetCurrentThread());
79 Fcb->LazyWriterThread = NULL;
80
81 ExReleaseResourceLite(Fcb->Header.Resource);
82
83 ASSERT(IoGetTopLevelIrp() == (PIRP)FSRTL_CACHE_TOP_LEVEL_IRP);
84 IoSetTopLevelIrp( NULL );
85}
86
87#ifdef __REACTOS__
88BOOLEAN NTAPI
89#else
90BOOLEAN
91#endif
92Ext2AcquireForReadAhead (IN PVOID Context,
93 IN BOOLEAN Wait)
94{
95 PEXT2_FCB Fcb = (PEXT2_FCB) Context;
96
97 ASSERT(Fcb != NULL);
98 ASSERT((Fcb->Identifier.Type == EXT2FCB) &&
99 (Fcb->Identifier.Size == sizeof(EXT2_FCB)));
100
101 DEBUG(CMCB_DEBUG_LEVEL, ("Ext2AcquireForReadAhead: i=%xh Fcb=%p\n",
102 Fcb->Mcb->Inode.i_ino, Fcb));
103
104 if (!ExAcquireResourceSharedLite(Fcb->Header.Resource, Wait))
105 return FALSE;
106 ASSERT(IoGetTopLevelIrp() == NULL);
107 IoSetTopLevelIrp((PIRP)FSRTL_CACHE_TOP_LEVEL_IRP);
108
109 return TRUE;
110}
111
112#ifdef __REACTOS__
113VOID NTAPI
114#else
115VOID
116#endif
117Ext2ReleaseFromReadAhead (IN PVOID Context)
118{
119 PEXT2_FCB Fcb = (PEXT2_FCB) Context;
120
121 ASSERT(Fcb != NULL);
122
123 ASSERT((Fcb->Identifier.Type == EXT2FCB) &&
124 (Fcb->Identifier.Size == sizeof(EXT2_FCB)));
125
126 DEBUG(CMCB_DEBUG_LEVEL, ("Ext2ReleaseFromReadAhead: i=%xh Fcb=%p\n",
127 Fcb->Mcb->Inode.i_ino, Fcb));
128
129 IoSetTopLevelIrp(NULL);
130 ExReleaseResourceLite(Fcb->Header.Resource);
131}
132
133#ifdef __REACTOS__
134BOOLEAN NTAPI
135#else
136BOOLEAN
137#endif
138Ext2NoOpAcquire (
139 IN PVOID Fcb,
140 IN BOOLEAN Wait
141)
142{
143 ASSERT(IoGetTopLevelIrp() == NULL);
144 IoSetTopLevelIrp((PIRP)FSRTL_CACHE_TOP_LEVEL_IRP);
145 return TRUE;
146}
147
148#ifdef __REACTOS__
149VOID NTAPI
150#else
151VOID
152#endif
153Ext2NoOpRelease (
154 IN PVOID Fcb
155)
156{
157 ASSERT(IoGetTopLevelIrp() == (PIRP)FSRTL_CACHE_TOP_LEVEL_IRP);
158 IoSetTopLevelIrp( NULL );
159
160 return;
161}
162