1 /* $Id: pin.c,v 1.16 2004/08/15 16:39:00 chorns Exp $
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
7 * PROGRAMMER: Hartmut Birr
12 /* INCLUDES ******************************************************************/
16 #include <internal/debug.h>
18 /* GLOBALS *******************************************************************/
20 #define ROUND_DOWN(N, S) ((N) - ((N) % (S)))
22 extern NPAGED_LOOKASIDE_LIST iBcbLookasideList
;
24 /* FUNCTIONS *****************************************************************/
30 CcMapData (IN PFILE_OBJECT FileObject
,
31 IN PLARGE_INTEGER FileOffset
,
40 PCACHE_SEGMENT CacheSeg
;
45 DPRINT("CcMapData(FileObject %x, FileOffset %d, Length %d, Wait %d,"
46 " pBcb %x, pBuffer %x)\n", FileObject
, (ULONG
)FileOffset
->QuadPart
,
47 Length
, Wait
, pBcb
, pBuffer
);
49 ReadOffset
= (ULONG
)FileOffset
->QuadPart
;
50 Bcb
= FileObject
->SectionObjectPointer
->SharedCacheMap
;
53 DPRINT("AllocationSize %d, FileSize %d\n",
54 (ULONG
)Bcb
->AllocationSize
.QuadPart
,
55 (ULONG
)Bcb
->FileSize
.QuadPart
);
57 if (ReadOffset
% Bcb
->CacheSegmentSize
+ Length
> Bcb
->CacheSegmentSize
)
61 ROffset
= ROUND_DOWN (ReadOffset
, Bcb
->CacheSegmentSize
);
62 Status
= CcRosRequestCacheSegment(Bcb
,
67 if (!NT_SUCCESS(Status
))
75 CcRosReleaseCacheSegment(Bcb
, CacheSeg
, FALSE
, FALSE
, FALSE
);
78 if (!NT_SUCCESS(ReadCacheSegment(CacheSeg
)))
80 CcRosReleaseCacheSegment(Bcb
, CacheSeg
, FALSE
, FALSE
, FALSE
);
85 *pBuffer
+= ReadOffset
% Bcb
->CacheSegmentSize
;
88 char* pTemp
= *pBuffer
;
89 pTemp
+= ReadOffset
% Bcb
->CacheSegmentSize
;
93 iBcb
= ExAllocateFromNPagedLookasideList(&iBcbLookasideList
);
96 CcRosReleaseCacheSegment(Bcb
, CacheSeg
, TRUE
, FALSE
, FALSE
);
99 memset(iBcb
, 0, sizeof(INTERNAL_BCB
));
100 iBcb
->CacheSegment
= CacheSeg
;
102 iBcb
->PFCB
.MappedLength
= Length
;
103 iBcb
->PFCB
.MappedFileOffset
.QuadPart
= FileOffset
->QuadPart
;
114 IN PFILE_OBJECT FileObject
,
115 IN PLARGE_INTEGER FileOffset
,
131 IN PFILE_OBJECT FileObject
,
132 IN PLARGE_INTEGER FileOffset
,
149 IN PFILE_OBJECT FileObject
,
150 IN PLARGE_INTEGER FileOffset
,
166 CcSetDirtyPinnedData (IN PVOID Bcb
,
167 IN PLARGE_INTEGER Lsn
)
169 PINTERNAL_BCB iBcb
= Bcb
;
178 CcUnpinData (IN PVOID Bcb
)
180 PINTERNAL_BCB iBcb
= Bcb
;
181 CcRosReleaseCacheSegment(iBcb
->CacheSegment
->Bcb
, iBcb
->CacheSegment
, TRUE
,
183 ExFreeToNPagedLookasideList(&iBcbLookasideList
, iBcb
);
191 CcUnpinDataForThread (
193 IN ERESOURCE_THREAD ResourceThreadId