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 ******************************************************************/
14 #include <ddk/ntddk.h>
15 #include <ddk/ntifs.h>
16 #include <internal/mm.h>
17 #include <internal/cc.h>
18 #include <internal/pool.h>
19 #include <internal/io.h>
20 #include <ntos/minmax.h>
23 #include <internal/debug.h>
25 /* GLOBALS *******************************************************************/
27 #define ROUND_DOWN(N, S) ((N) - ((N) % (S)))
29 /* FUNCTIONS *****************************************************************/
31 typedef struct _INTERNAL_BCB
34 PCACHE_SEGMENT CacheSegment;
36 } INTERNAL_BCB, *PINTERNAL_BCB;
39 CcMapData (IN PFILE_OBJECT FileObject,
40 IN PLARGE_INTEGER FileOffset,
49 PCACHE_SEGMENT CacheSeg;
54 DPRINT("CcMapData(FileObject %x, FileOffset %d, Length %d, Wait %d,"
55 " pBcb %x, pBuffer %x)\n", FileObject, (ULONG)FileOffset->QuadPart,
56 Length, Wait, pBcb, pBuffer);
58 /* FIXME: 4GB limit! */
59 ReadOffset = FileOffset->QuadPart;
60 Bcb = ((REACTOS_COMMON_FCB_HEADER*)FileObject->FsContext)->Bcb;
62 DPRINT("AllocationSize %d, FileSize %d\n",
63 (ULONG)Bcb->AllocationSize.QuadPart,
64 (ULONG)Bcb->FileSize.QuadPart);
66 if (ReadOffset % Bcb->CacheSegmentSize + Length > Bcb->CacheSegmentSize)
70 ROffset = ROUND_DOWN (ReadOffset, Bcb->CacheSegmentSize);
71 Status = CcRosRequestCacheSegment(Bcb,
76 if (!NT_SUCCESS(Status))
84 CcRosReleaseCacheSegment(Bcb, CacheSeg, FALSE, FALSE, FALSE);
87 if (!NT_SUCCESS(ReadCacheSegment(CacheSeg)))
89 CcRosReleaseCacheSegment(Bcb, CacheSeg, FALSE, FALSE, FALSE);
93 *pBuffer += ReadOffset % Bcb->CacheSegmentSize;
94 iBcb = ExAllocatePool (NonPagedPool, sizeof(INTERNAL_BCB));
97 CcRosReleaseCacheSegment(Bcb, CacheSeg, TRUE, FALSE, FALSE);
100 iBcb->CacheSegment = CacheSeg;
102 iBcb->PFCB.MappedLength = Length;
103 iBcb->PFCB.MappedFileOffset.QuadPart = FileOffset->QuadPart;
111 CcUnpinData (IN PVOID Bcb)
113 PINTERNAL_BCB iBcb = Bcb;
114 CcRosReleaseCacheSegment(iBcb->CacheSegment->Bcb, iBcb->CacheSegment, TRUE,
120 CcSetDirtyPinnedData (IN PVOID Bcb,
121 IN PLARGE_INTEGER Lsn)
123 PINTERNAL_BCB iBcb = Bcb;
127 WriteCacheSegment(iBcb->CacheSegment);
131 #endif /* LIBCAPTIVE */