2 * FFS File System Driver for Windows
8 * Lee Jae-Hong, http://www.pyrasis.com
19 extern PFFS_GLOBAL FFSGlobal
;
24 #pragma alloc_text(PAGE, FFSAcquireForLazyWrite)
25 #pragma alloc_text(PAGE, FFSReleaseFromLazyWrite)
26 #pragma alloc_text(PAGE, FFSAcquireForReadAhead)
27 #pragma alloc_text(PAGE, FFSReleaseFromReadAhead)
28 #pragma alloc_text(PAGE, FFSNoOpAcquire)
29 #pragma alloc_text(PAGE, FFSNoOpRelease)
33 __drv_mustHoldCriticalRegion
35 FFSAcquireForLazyWrite(
40 // On a readonly filesystem this function still has to exist but it
41 // doesn't need to do anything.
47 Fcb
= (PFFS_FCB
)Context
;
51 ASSERT((Fcb
->Identifier
.Type
== FFSFCB
) &&
52 (Fcb
->Identifier
.Size
== sizeof(FFS_FCB
)));
54 FFSPrint((DBG_INFO
, "FFSAcquireForLazyWrite: %s %s %s\n",
55 FFSGetCurrentProcessName(),
56 "ACQUIRE_FOR_LAZY_WRITE",
57 Fcb
->AnsiFileName
.Buffer
));
60 if (!IsFlagOn(Fcb
->Vcb
->Flags
, VCB_READ_ONLY
))
62 FFSPrint((DBG_INFO
, "FFSAcquireForLazyWrite: Inode=%xh %S\n",
63 Fcb
->FFSMcb
->Inode
, Fcb
->FFSMcb
->ShortName
.Buffer
));
65 if(!ExAcquireResourceSharedLite(
66 &Fcb
->PagingIoResource
, Wait
))
72 ASSERT(IoGetTopLevelIrp() == NULL
);
74 IoSetTopLevelIrp((PIRP
)FSRTL_CACHE_TOP_LEVEL_IRP
);
80 __drv_mustHoldCriticalRegion
82 FFSReleaseFromLazyWrite(
86 // On a readonly filesystem this function still has to exist but it
87 // doesn't need to do anything.
92 Fcb
= (PFFS_FCB
)Context
;
96 ASSERT((Fcb
->Identifier
.Type
== FFSFCB
) &&
97 (Fcb
->Identifier
.Size
== sizeof(FFS_FCB
)));
99 FFSPrint((DBG_INFO
, "FFSReleaseFromLazyWrite: %s %s %s\n",
100 FFSGetCurrentProcessName(),
101 "RELEASE_FROM_LAZY_WRITE",
102 Fcb
->AnsiFileName
.Buffer
));
104 if (!IsFlagOn(Fcb
->Vcb
->Flags
, VCB_READ_ONLY
))
106 FFSPrint((DBG_INFO
, "FFSReleaseFromLazyWrite: Inode=%xh %S\n",
107 Fcb
->FFSMcb
->Inode
, Fcb
->FFSMcb
->ShortName
.Buffer
));
109 ExReleaseResourceLite(&Fcb
->PagingIoResource
);
112 ASSERT(IoGetTopLevelIrp() == (PIRP
)FSRTL_CACHE_TOP_LEVEL_IRP
);
114 IoSetTopLevelIrp(NULL
);
119 __drv_mustHoldCriticalRegion
121 FFSAcquireForReadAhead(
129 Fcb
= (PFFS_FCB
)Context
;
133 ASSERT((Fcb
->Identifier
.Type
== FFSFCB
) &&
134 (Fcb
->Identifier
.Size
== sizeof(FFS_FCB
)));
136 FFSPrint((DBG_INFO
, "FFSAcquireForReadAhead: Inode=%xh %S\n",
137 Fcb
->FFSMcb
->Inode
, Fcb
->FFSMcb
->ShortName
.Buffer
));
139 if (!ExAcquireResourceSharedLite(
140 &Fcb
->MainResource
, Wait
))
143 ASSERT(IoGetTopLevelIrp() == NULL
);
145 IoSetTopLevelIrp((PIRP
)FSRTL_CACHE_TOP_LEVEL_IRP
);
151 __drv_mustHoldCriticalRegion
153 FFSReleaseFromReadAhead(
160 Fcb
= (PFFS_FCB
)Context
;
164 ASSERT((Fcb
->Identifier
.Type
== FFSFCB
) &&
165 (Fcb
->Identifier
.Size
== sizeof(FFS_FCB
)));
167 FFSPrint((DBG_INFO
, "FFSReleaseFromReadAhead: Inode=%xh %S\n",
168 Fcb
->FFSMcb
->Inode
, Fcb
->FFSMcb
->ShortName
.Buffer
));
170 IoSetTopLevelIrp(NULL
);
172 ExReleaseResourceLite(&Fcb
->MainResource
);
181 UNREFERENCED_PARAMETER(Fcb
);
182 UNREFERENCED_PARAMETER(Wait
);
185 // This is a kludge because Cc is really the top level. We it
186 // enters the file system, we will think it is a resursive call
187 // and complete the request with hard errors or verify. It will
188 // have to deal with them, somehow....
193 ASSERT(IoGetTopLevelIrp() == NULL
);
195 IoSetTopLevelIrp((PIRP
)FSRTL_CACHE_TOP_LEVEL_IRP
);
206 // Clear the kludge at this point.
211 ASSERT(IoGetTopLevelIrp() == (PIRP
)FSRTL_CACHE_TOP_LEVEL_IRP
);
213 IoSetTopLevelIrp(NULL
);
215 UNREFERENCED_PARAMETER(Fcb
);