3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/cc/pin.c
6 * PURPOSE: Implements cache managers pinning interface
8 * PROGRAMMERS: Hartmut Birr
11 /* INCLUDES ******************************************************************/
15 #include <internal/debug.h>
17 /* GLOBALS *******************************************************************/
19 extern NPAGED_LOOKASIDE_LIST iBcbLookasideList
;
21 /* FUNCTIONS *****************************************************************/
27 CcMapData (IN PFILE_OBJECT FileObject
,
28 IN PLARGE_INTEGER FileOffset
,
37 PCACHE_SEGMENT CacheSeg
;
42 DPRINT("CcMapData(FileObject 0x%p, FileOffset %I64x, Length %d, Wait %d,"
43 " pBcb 0x%p, pBuffer 0x%p)\n", FileObject
, FileOffset
->QuadPart
,
44 Length
, Wait
, pBcb
, pBuffer
);
46 ReadOffset
= (ULONG
)FileOffset
->QuadPart
;
47 Bcb
= FileObject
->SectionObjectPointer
->SharedCacheMap
;
50 DPRINT("AllocationSize %I64x, FileSize %I64x\n",
51 Bcb
->AllocationSize
.QuadPart
,
52 Bcb
->FileSize
.QuadPart
);
54 if (ReadOffset
% Bcb
->CacheSegmentSize
+ Length
> Bcb
->CacheSegmentSize
)
58 ROffset
= ROUND_DOWN (ReadOffset
, Bcb
->CacheSegmentSize
);
59 Status
= CcRosRequestCacheSegment(Bcb
,
64 if (!NT_SUCCESS(Status
))
72 CcRosReleaseCacheSegment(Bcb
, CacheSeg
, FALSE
, FALSE
, FALSE
);
75 if (!NT_SUCCESS(ReadCacheSegment(CacheSeg
)))
77 CcRosReleaseCacheSegment(Bcb
, CacheSeg
, FALSE
, FALSE
, FALSE
);
82 *pBuffer
= (PVOID
)((ULONG_PTR
)(*pBuffer
) + (ReadOffset
% Bcb
->CacheSegmentSize
));
83 iBcb
= ExAllocateFromNPagedLookasideList(&iBcbLookasideList
);
86 CcRosReleaseCacheSegment(Bcb
, CacheSeg
, TRUE
, FALSE
, FALSE
);
89 memset(iBcb
, 0, sizeof(INTERNAL_BCB
));
90 iBcb
->PFCB
.NodeTypeCode
= 0xDE45; /* Undocumented (CAPTIVE_PUBLIC_BCB_NODETYPECODE) */
91 iBcb
->PFCB
.NodeByteSize
= sizeof(PUBLIC_BCB
);
92 iBcb
->PFCB
.MappedLength
= Length
;
93 iBcb
->PFCB
.MappedFileOffset
= *FileOffset
;
94 iBcb
->CacheSegment
= CacheSeg
;
107 IN PFILE_OBJECT FileObject
,
108 IN PLARGE_INTEGER FileOffset
,
114 /* no-op for current implementation. */
124 IN PFILE_OBJECT FileObject
,
125 IN PLARGE_INTEGER FileOffset
,
132 if (CcMapData(FileObject
, FileOffset
, Length
, Flags
, Bcb
, Buffer
))
134 if (CcPinMappedData(FileObject
, FileOffset
, Length
, Flags
, Bcb
))
148 IN PFILE_OBJECT FileObject
,
149 IN PLARGE_INTEGER FileOffset
,
158 * FIXME: This is function is similar to CcPinRead, but doesn't
159 * read the data if they're not present. Instead it should just
160 * prepare the cache segments and zero them out if Zero == TRUE.
162 * For now calling CcPinRead is better than returning error or
163 * just having UNIMPLEMENTED here.
165 return CcPinRead(FileObject
, FileOffset
, Length
, Flags
, Bcb
, Buffer
);
172 CcSetDirtyPinnedData (IN PVOID Bcb
,
173 IN PLARGE_INTEGER Lsn
)
175 PINTERNAL_BCB iBcb
= Bcb
;
184 CcUnpinData (IN PVOID Bcb
)
186 PINTERNAL_BCB iBcb
= Bcb
;
187 CcRosReleaseCacheSegment(iBcb
->CacheSegment
->Bcb
, iBcb
->CacheSegment
, TRUE
,
189 if (--iBcb
->RefCount
== 0)
191 ExFreeToNPagedLookasideList(&iBcbLookasideList
, iBcb
);
200 CcUnpinDataForThread (
202 IN ERESOURCE_THREAD ResourceThreadId
217 PINTERNAL_BCB iBcb
= Bcb
;
228 IN BOOLEAN WriteThrough
,
229 IN PIO_STATUS_BLOCK IoStatus
232 PINTERNAL_BCB iBcb
= Bcb
;
234 if (--iBcb
->RefCount
== 0)
236 IoStatus
->Information
= 0;
239 ExEnterCriticalRegionAndAcquireFastMutexUnsafe(&iBcb
->CacheSegment
->Lock
);
240 if (iBcb
->CacheSegment
->Dirty
)
242 IoStatus
->Status
= CcRosFlushCacheSegment(iBcb
->CacheSegment
);
246 IoStatus
->Status
= STATUS_SUCCESS
;
248 ExReleaseFastMutexUnsafeAndLeaveCriticalRegion(&iBcb
->CacheSegment
->Lock
);
252 IoStatus
->Status
= STATUS_SUCCESS
;
255 ExFreeToNPagedLookasideList(&iBcbLookasideList
, iBcb
);