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
,
51 CcGetFileObjectFromBcb (
54 PINTERNAL_BCB iBcb
= (PINTERNAL_BCB
)Bcb
;
55 return iBcb
->Vacb
->SharedCacheMap
->FileObject
;
63 CcGetLsnForFileObject (
64 IN PFILE_OBJECT FileObject
,
65 OUT PLARGE_INTEGER OldestLsn OPTIONAL
)
78 CcInitializeCacheMap (
79 IN PFILE_OBJECT FileObject
,
80 IN PCC_FILE_SIZES FileSizes
,
82 IN PCACHE_MANAGER_CALLBACKS CallBacks
,
83 IN PVOID LazyWriterContext
)
88 /* Call old ROS cache init function */
89 CcRosInitializeFileCache(FileObject
,
112 CcPurgeCacheSection (
113 IN PSECTION_OBJECT_POINTERS SectionObjectPointer
,
114 IN PLARGE_INTEGER FileOffset OPTIONAL
,
116 IN BOOLEAN UninitializeCacheMaps
)
128 IN PFILE_OBJECT FileObject
,
129 IN PCC_FILE_SIZES FileSizes
)
132 PROS_SHARED_CACHE_MAP SharedCacheMap
;
133 PLIST_ENTRY current_entry
;
135 LIST_ENTRY FreeListHead
;
138 DPRINT("CcSetFileSizes(FileObject 0x%p, FileSizes 0x%p)\n",
139 FileObject
, FileSizes
);
140 DPRINT("AllocationSize %I64d, FileSize %I64d, ValidDataLength %I64d\n",
141 FileSizes
->AllocationSize
.QuadPart
,
142 FileSizes
->FileSize
.QuadPart
,
143 FileSizes
->ValidDataLength
.QuadPart
);
145 SharedCacheMap
= FileObject
->SectionObjectPointer
->SharedCacheMap
;
148 * It is valid to call this function on file objects that weren't
149 * initialized for caching. In this case it's simple no-op.
151 if (SharedCacheMap
== NULL
)
154 if (FileSizes
->AllocationSize
.QuadPart
< SharedCacheMap
->SectionSize
.QuadPart
)
156 InitializeListHead(&FreeListHead
);
157 KeAcquireGuardedMutex(&ViewLock
);
158 KeAcquireSpinLock(&SharedCacheMap
->CacheMapLock
, &oldirql
);
160 current_entry
= SharedCacheMap
->CacheMapVacbListHead
.Flink
;
161 while (current_entry
!= &SharedCacheMap
->CacheMapVacbListHead
)
163 current
= CONTAINING_RECORD(current_entry
,
165 CacheMapVacbListEntry
);
166 current_entry
= current_entry
->Flink
;
167 if (current
->FileOffset
.QuadPart
>= FileSizes
->AllocationSize
.QuadPart
)
169 if ((current
->ReferenceCount
== 0) || ((current
->ReferenceCount
== 1) && current
->Dirty
))
171 RemoveEntryList(¤t
->CacheMapVacbListEntry
);
172 RemoveEntryList(¤t
->VacbLruListEntry
);
175 RemoveEntryList(¤t
->DirtyVacbListEntry
);
176 DirtyPageCount
-= VACB_MAPPING_GRANULARITY
/ PAGE_SIZE
;
178 InsertHeadList(&FreeListHead
, ¤t
->CacheMapVacbListEntry
);
182 DPRINT1("Someone has referenced a VACB behind the new size.\n");
183 KeBugCheck(CACHE_MANAGER
);
188 SharedCacheMap
->SectionSize
= FileSizes
->AllocationSize
;
189 SharedCacheMap
->FileSize
= FileSizes
->FileSize
;
190 KeReleaseSpinLock(&SharedCacheMap
->CacheMapLock
, oldirql
);
191 KeReleaseGuardedMutex(&ViewLock
);
193 current_entry
= FreeListHead
.Flink
;
194 while(current_entry
!= &FreeListHead
)
196 current
= CONTAINING_RECORD(current_entry
, ROS_VACB
, CacheMapVacbListEntry
);
197 current_entry
= current_entry
->Flink
;
198 Status
= CcRosInternalFreeVacb(current
);
199 if (!NT_SUCCESS(Status
))
201 DPRINT1("CcRosInternalFreeVacb failed, status = %x\n", Status
);
202 KeBugCheck(CACHE_MANAGER
);
208 KeAcquireSpinLock(&SharedCacheMap
->CacheMapLock
, &oldirql
);
209 SharedCacheMap
->SectionSize
= FileSizes
->AllocationSize
;
210 SharedCacheMap
->FileSize
= FileSizes
->FileSize
;
211 KeReleaseSpinLock(&SharedCacheMap
->CacheMapLock
, oldirql
);
220 CcSetLogHandleForFile (
221 IN PFILE_OBJECT FileObject
,
223 IN PFLUSH_TO_LSN FlushToLsnRoutine
)
233 CcUninitializeCacheMap (
234 IN PFILE_OBJECT FileObject
,
235 IN PLARGE_INTEGER TruncateSize OPTIONAL
,
236 IN PCACHE_UNINITIALIZE_EVENT UninitializeCompleteEvent OPTIONAL
)
240 Status
= CcRosReleaseFileCache(FileObject
);
241 if (UninitializeCompleteEvent
)
242 KeSetEvent(&UninitializeCompleteEvent
->Event
, IO_NO_INCREMENT
, FALSE
);
243 return NT_SUCCESS(Status
);
249 IN PFILE_OBJECT FileObject
,
250 IN PCC_FILE_SIZES FileSizes
)
252 PROS_SHARED_CACHE_MAP SharedCacheMap
;
254 SharedCacheMap
= FileObject
->SectionObjectPointer
->SharedCacheMap
;
259 FileSizes
->AllocationSize
= SharedCacheMap
->SectionSize
;
260 FileSizes
->FileSize
= FileSizes
->ValidDataLength
= SharedCacheMap
->FileSize
;