2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: ntoskrnl/cc/fs.c
5 * PURPOSE: Implements cache managers functions useful for File Systems
7 * PROGRAMMERS: Alex Ionescu
10 /* INCLUDES ******************************************************************/
16 #ifndef VACB_MAPPING_GRANULARITY
17 #define VACB_MAPPING_GRANULARITY (256 * 1024)
20 /* GLOBALS *****************************************************************/
22 extern KGUARDED_MUTEX ViewLock
;
23 extern ULONG DirtyPageCount
;
25 NTSTATUS
CcRosInternalFreeVacb(PROS_VACB Vacb
);
27 /* FUNCTIONS *****************************************************************/
36 IN PDIRTY_PAGE_ROUTINE DirtyPageRoutine
,
42 CCTRACE(CC_API_DEBUG
, "LogHandle=%p DirtyPageRoutine=%p Context1=%p Context2=%p\n",
43 LogHandle
, DirtyPageRoutine
, Context1
, Context2
);
55 CcGetFileObjectFromBcb (
58 PINTERNAL_BCB iBcb
= (PINTERNAL_BCB
)Bcb
;
60 CCTRACE(CC_API_DEBUG
, "Bcb=%p\n", Bcb
);
62 return iBcb
->Vacb
->SharedCacheMap
->FileObject
;
70 CcGetLsnForFileObject (
71 IN PFILE_OBJECT FileObject
,
72 OUT PLARGE_INTEGER OldestLsn OPTIONAL
)
76 CCTRACE(CC_API_DEBUG
, "FileObject=%p\n", FileObject
);
88 CcInitializeCacheMap (
89 IN PFILE_OBJECT FileObject
,
90 IN PCC_FILE_SIZES FileSizes
,
92 IN PCACHE_MANAGER_CALLBACKS CallBacks
,
93 IN PVOID LazyWriterContext
)
100 CCTRACE(CC_API_DEBUG
, "FileObject=%p FileSizes=%p PinAccess=%d CallBacks=%p LazyWriterContext=%p\n",
101 FileObject
, FileSizes
, PinAccess
, CallBacks
, LazyWriterContext
);
103 /* Call old ROS cache init function */
104 Status
= CcRosInitializeFileCache(FileObject
,
108 if (!NT_SUCCESS(Status
))
109 ExRaiseStatus(Status
);
120 CCTRACE(CC_API_DEBUG
, "Vpb=%p\n", Vpb
);
131 CcPurgeCacheSection (
132 IN PSECTION_OBJECT_POINTERS SectionObjectPointer
,
133 IN PLARGE_INTEGER FileOffset OPTIONAL
,
135 IN BOOLEAN UninitializeCacheMaps
)
137 CCTRACE(CC_API_DEBUG
, "SectionObjectPointer=%p\n FileOffset=%p Length=%lu UninitializeCacheMaps=%d",
138 SectionObjectPointer
, FileOffset
, Length
, UninitializeCacheMaps
);
150 IN PFILE_OBJECT FileObject
,
151 IN PCC_FILE_SIZES FileSizes
)
154 PROS_SHARED_CACHE_MAP SharedCacheMap
;
155 PLIST_ENTRY current_entry
;
157 LIST_ENTRY FreeListHead
;
160 CCTRACE(CC_API_DEBUG
, "FileObject=%p FileSizes=%p\n",
161 FileObject
, FileSizes
);
163 DPRINT("CcSetFileSizes(FileObject 0x%p, FileSizes 0x%p)\n",
164 FileObject
, FileSizes
);
165 DPRINT("AllocationSize %I64d, FileSize %I64d, ValidDataLength %I64d\n",
166 FileSizes
->AllocationSize
.QuadPart
,
167 FileSizes
->FileSize
.QuadPart
,
168 FileSizes
->ValidDataLength
.QuadPart
);
170 SharedCacheMap
= FileObject
->SectionObjectPointer
->SharedCacheMap
;
173 * It is valid to call this function on file objects that weren't
174 * initialized for caching. In this case it's simple no-op.
176 if (SharedCacheMap
== NULL
)
179 if (FileSizes
->AllocationSize
.QuadPart
< SharedCacheMap
->SectionSize
.QuadPart
)
181 InitializeListHead(&FreeListHead
);
182 KeAcquireGuardedMutex(&ViewLock
);
183 KeAcquireSpinLock(&SharedCacheMap
->CacheMapLock
, &oldirql
);
185 current_entry
= SharedCacheMap
->CacheMapVacbListHead
.Flink
;
186 while (current_entry
!= &SharedCacheMap
->CacheMapVacbListHead
)
188 current
= CONTAINING_RECORD(current_entry
,
190 CacheMapVacbListEntry
);
191 current_entry
= current_entry
->Flink
;
192 if (current
->FileOffset
.QuadPart
>= FileSizes
->AllocationSize
.QuadPart
)
194 if ((current
->ReferenceCount
== 0) || ((current
->ReferenceCount
== 1) && current
->Dirty
))
196 RemoveEntryList(¤t
->CacheMapVacbListEntry
);
197 RemoveEntryList(¤t
->VacbLruListEntry
);
200 RemoveEntryList(¤t
->DirtyVacbListEntry
);
201 DirtyPageCount
-= VACB_MAPPING_GRANULARITY
/ PAGE_SIZE
;
203 InsertHeadList(&FreeListHead
, ¤t
->CacheMapVacbListEntry
);
207 DPRINT1("Someone has referenced a VACB behind the new size.\n");
208 KeBugCheck(CACHE_MANAGER
);
213 SharedCacheMap
->SectionSize
= FileSizes
->AllocationSize
;
214 SharedCacheMap
->FileSize
= FileSizes
->FileSize
;
215 KeReleaseSpinLock(&SharedCacheMap
->CacheMapLock
, oldirql
);
216 KeReleaseGuardedMutex(&ViewLock
);
218 current_entry
= FreeListHead
.Flink
;
219 while(current_entry
!= &FreeListHead
)
221 current
= CONTAINING_RECORD(current_entry
, ROS_VACB
, CacheMapVacbListEntry
);
222 current_entry
= current_entry
->Flink
;
223 Status
= CcRosInternalFreeVacb(current
);
224 if (!NT_SUCCESS(Status
))
226 DPRINT1("CcRosInternalFreeVacb failed, status = %x\n", Status
);
227 KeBugCheck(CACHE_MANAGER
);
233 KeAcquireSpinLock(&SharedCacheMap
->CacheMapLock
, &oldirql
);
234 SharedCacheMap
->SectionSize
= FileSizes
->AllocationSize
;
235 SharedCacheMap
->FileSize
= FileSizes
->FileSize
;
236 KeReleaseSpinLock(&SharedCacheMap
->CacheMapLock
, oldirql
);
245 CcSetLogHandleForFile (
246 IN PFILE_OBJECT FileObject
,
248 IN PFLUSH_TO_LSN FlushToLsnRoutine
)
250 CCTRACE(CC_API_DEBUG
, "FileObject=%p LogHandle=%p FlushToLsnRoutine=%p\n",
251 FileObject
, LogHandle
, FlushToLsnRoutine
);
261 CcUninitializeCacheMap (
262 IN PFILE_OBJECT FileObject
,
263 IN PLARGE_INTEGER TruncateSize OPTIONAL
,
264 IN PCACHE_UNINITIALIZE_EVENT UninitializeCompleteEvent OPTIONAL
)
268 CCTRACE(CC_API_DEBUG
, "FileObject=%p TruncateSize=%p UninitializeCompleteEvent=%p\n",
269 FileObject
, TruncateSize
, UninitializeCompleteEvent
);
271 Status
= CcRosReleaseFileCache(FileObject
);
272 if (UninitializeCompleteEvent
)
273 KeSetEvent(&UninitializeCompleteEvent
->Event
, IO_NO_INCREMENT
, FALSE
);
274 return NT_SUCCESS(Status
);
280 IN PFILE_OBJECT FileObject
,
281 IN PCC_FILE_SIZES FileSizes
)
283 PROS_SHARED_CACHE_MAP SharedCacheMap
;
285 SharedCacheMap
= FileObject
->SectionObjectPointer
->SharedCacheMap
;
290 FileSizes
->AllocationSize
= SharedCacheMap
->SectionSize
;
291 FileSizes
->FileSize
= FileSizes
->ValidDataLength
= SharedCacheMap
->FileSize
;