2002-09-07 15:13:13 +00:00
|
|
|
/* $Id: pin.c,v 1.6 2002/09/07 15:12:47 chorns Exp $
|
2001-10-10 21:49:15 +00:00
|
|
|
*
|
|
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
|
|
* PROJECT: ReactOS kernel
|
|
|
|
* FILE: ntoskrnl/cc/pin.c
|
|
|
|
* PURPOSE: Implements cache managers pinning interface
|
|
|
|
* PROGRAMMER: Hartmut Birr
|
|
|
|
* UPDATE HISTORY:
|
|
|
|
* Created 05.10.2001
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* INCLUDES ******************************************************************/
|
|
|
|
|
2002-09-07 15:13:13 +00:00
|
|
|
#include <ntoskrnl.h>
|
2001-10-10 21:49:15 +00:00
|
|
|
|
|
|
|
#define NDEBUG
|
|
|
|
#include <internal/debug.h>
|
|
|
|
|
2002-09-07 15:13:13 +00:00
|
|
|
|
2001-10-10 21:49:15 +00:00
|
|
|
/* GLOBALS *******************************************************************/
|
|
|
|
|
|
|
|
#define ROUND_DOWN(N, S) ((N) - ((N) % (S)))
|
|
|
|
|
|
|
|
/* FUNCTIONS *****************************************************************/
|
|
|
|
|
|
|
|
typedef struct _INTERNAL_BCB
|
|
|
|
{
|
|
|
|
PUBLIC_BCB PFCB;
|
2002-09-07 15:13:13 +00:00
|
|
|
PROS_CACHE_SEGMENT CacheSegment;
|
2002-08-14 20:58:39 +00:00
|
|
|
BOOLEAN Dirty;
|
2002-07-17 21:04:57 +00:00
|
|
|
} INTERNAL_BCB, *PINTERNAL_BCB;
|
2001-10-10 21:49:15 +00:00
|
|
|
|
|
|
|
BOOLEAN STDCALL
|
2002-07-17 21:04:57 +00:00
|
|
|
CcMapData (IN PFILE_OBJECT FileObject,
|
|
|
|
IN PLARGE_INTEGER FileOffset,
|
|
|
|
IN ULONG Length,
|
|
|
|
IN BOOLEAN Wait,
|
|
|
|
OUT PVOID *pBcb,
|
|
|
|
OUT PVOID *pBuffer)
|
2001-10-10 21:49:15 +00:00
|
|
|
{
|
2002-07-17 21:04:57 +00:00
|
|
|
ULONG ReadOffset;
|
|
|
|
BOOLEAN Valid;
|
2002-09-07 15:13:13 +00:00
|
|
|
PROS_BCB Bcb;
|
|
|
|
PROS_CACHE_SEGMENT CacheSeg;
|
2002-07-17 21:04:57 +00:00
|
|
|
NTSTATUS Status;
|
|
|
|
PINTERNAL_BCB iBcb;
|
|
|
|
ULONG ROffset;
|
|
|
|
|
|
|
|
DPRINT("CcMapData(FileObject %x, FileOffset %d, Length %d, Wait %d,"
|
|
|
|
" pBcb %x, pBuffer %x)\n", FileObject, (ULONG)FileOffset->QuadPart,
|
|
|
|
Length, Wait, pBcb, pBuffer);
|
|
|
|
|
|
|
|
ReadOffset = FileOffset->QuadPart;
|
|
|
|
Bcb = ((REACTOS_COMMON_FCB_HEADER*)FileObject->FsContext)->Bcb;
|
|
|
|
|
|
|
|
DPRINT("AllocationSize %d, FileSize %d\n",
|
2001-10-10 21:49:15 +00:00
|
|
|
(ULONG)Bcb->AllocationSize.QuadPart,
|
|
|
|
(ULONG)Bcb->FileSize.QuadPart);
|
2002-07-17 21:04:57 +00:00
|
|
|
|
|
|
|
if (ReadOffset % Bcb->CacheSegmentSize + Length > Bcb->CacheSegmentSize)
|
|
|
|
{
|
|
|
|
return(FALSE);
|
|
|
|
}
|
|
|
|
ROffset = ROUND_DOWN (ReadOffset, Bcb->CacheSegmentSize);
|
|
|
|
Status = CcRosRequestCacheSegment(Bcb,
|
|
|
|
ROffset,
|
|
|
|
pBuffer,
|
|
|
|
&Valid,
|
|
|
|
&CacheSeg);
|
|
|
|
if (!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
return(FALSE);
|
|
|
|
}
|
|
|
|
if (!Valid)
|
|
|
|
{
|
2001-10-10 21:49:15 +00:00
|
|
|
if (!Wait)
|
2002-07-17 21:04:57 +00:00
|
|
|
{
|
2001-12-29 14:32:22 +00:00
|
|
|
CcRosReleaseCacheSegment(Bcb, CacheSeg, FALSE, FALSE, FALSE);
|
2002-07-17 21:04:57 +00:00
|
|
|
return(FALSE);
|
|
|
|
}
|
2001-10-10 21:49:15 +00:00
|
|
|
if (!NT_SUCCESS(ReadCacheSegment(CacheSeg)))
|
2002-07-17 21:04:57 +00:00
|
|
|
{
|
|
|
|
return(FALSE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
*pBuffer += ReadOffset % Bcb->CacheSegmentSize;
|
|
|
|
iBcb = ExAllocatePool (NonPagedPool, sizeof(INTERNAL_BCB));
|
|
|
|
if (iBcb == NULL)
|
|
|
|
{
|
|
|
|
CcRosReleaseCacheSegment(Bcb, CacheSeg, TRUE, FALSE, FALSE);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
iBcb->CacheSegment = CacheSeg;
|
2002-08-14 20:58:39 +00:00
|
|
|
iBcb->Dirty = FALSE;
|
2002-07-17 21:04:57 +00:00
|
|
|
iBcb->PFCB.MappedLength = Length;
|
|
|
|
iBcb->PFCB.MappedFileOffset.QuadPart = FileOffset->QuadPart;
|
|
|
|
*pBcb = (PVOID)iBcb;
|
|
|
|
return(TRUE);
|
2001-10-10 21:49:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
VOID STDCALL
|
2002-07-17 21:04:57 +00:00
|
|
|
CcUnpinData (IN PVOID Bcb)
|
2001-10-10 21:49:15 +00:00
|
|
|
{
|
2002-07-17 21:04:57 +00:00
|
|
|
PINTERNAL_BCB iBcb = Bcb;
|
|
|
|
CcRosReleaseCacheSegment(iBcb->CacheSegment->Bcb, iBcb->CacheSegment, TRUE,
|
2002-08-14 20:58:39 +00:00
|
|
|
iBcb->Dirty, FALSE);
|
2002-07-17 21:04:57 +00:00
|
|
|
ExFreePool(iBcb);
|
2001-10-10 21:49:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
VOID STDCALL
|
2002-07-17 21:04:57 +00:00
|
|
|
CcSetDirtyPinnedData (IN PVOID Bcb,
|
|
|
|
IN PLARGE_INTEGER Lsn)
|
2001-10-10 21:49:15 +00:00
|
|
|
{
|
|
|
|
PINTERNAL_BCB iBcb = Bcb;
|
2002-08-17 15:14:26 +00:00
|
|
|
#if 0
|
2002-08-14 20:58:39 +00:00
|
|
|
iBcb->Dirty = TRUE;
|
2002-08-17 15:14:26 +00:00
|
|
|
#else
|
|
|
|
WriteCacheSegment(iBcb->CacheSegment);
|
|
|
|
#endif
|
2001-10-10 21:49:15 +00:00
|
|
|
}
|
|
|
|
|