return i;
}
-/*
- * @unimplemented
- */
-VOID
-STDCALL
-CcRepinBcb (
- IN PVOID Bcb
- )
-{
- UNIMPLEMENTED;
-}
-
/*
* @unimplemented
*/
{
UNIMPLEMENTED;
}
-
-/*
- * @unimplemented
- */
-VOID
-STDCALL
-CcUnpinRepinnedBcb (
- IN PVOID Bcb,
- IN BOOLEAN WriteThrough,
- IN PIO_STATUS_BLOCK IoStatus
- )
-{
- UNIMPLEMENTED;
-}
-/* $Id: copy.c,v 1.30 2004/08/15 16:38:59 chorns Exp $
+/* $Id: copy.c,v 1.31 2004/08/25 15:08:28 navaraf Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
static PFN_TYPE CcZeroPage = 0;
#define MAX_ZERO_LENGTH (256 * 1024)
-#define MAX_RW_LENGTH (64 * 1024)
+#define MAX_RW_LENGTH (256 * 1024)
#if defined(__GNUC__)
void * alloca(size_t size);
*/
current2 = current;
current_size = 0;
- while (current2 != NULL && !current2->Valid)
+ while (current2 != NULL && !current2->Valid && current_size < MAX_RW_LENGTH)
{
current2 = current2->NextInChain;
current_size += Bcb->CacheSegmentSize;
MmInitializeMdl(Mdl, NULL, current_size);
Mdl->MdlFlags |= (MDL_PAGES_LOCKED | MDL_IO_PAGE_READ);
current2 = current;
+ current_size = 0;
MdlPages = (PPFN_TYPE)(Mdl + 1);
- while (current2 != NULL && !current2->Valid)
+ while (current2 != NULL && !current2->Valid && current_size < MAX_RW_LENGTH)
{
PVOID address = current2->BaseAddress;
for (i = 0; i < (Bcb->CacheSegmentSize / PAGE_SIZE); i++, address += PAGE_SIZE)
*MdlPages++ = MmGetPfnForProcess(NULL, address);
}
current2 = current2->NextInChain;
+ current_size += Bcb->CacheSegmentSize;
}
/*
KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
Status = Iosb.Status;
}
- MmUnmapLockedPages(Mdl->MappedSystemVa, Mdl);
+ if (Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA)
+ {
+ MmUnmapLockedPages(Mdl->MappedSystemVa, Mdl);
+ }
if (!NT_SUCCESS(Status) && Status != STATUS_END_OF_FILE)
{
while (current != NULL)
}
return(Status);
}
- while (current != NULL && !current->Valid)
+ current_size = 0;
+ while (current != NULL && !current->Valid && current_size < MAX_RW_LENGTH)
{
previous = current;
current = current->NextInChain;
#endif
Length = Length - TempLength;
CcRosReleaseCacheSegment(Bcb, previous, TRUE, FALSE, FALSE);
+ current_size += Bcb->CacheSegmentSize;
}
}
}
#define NDEBUG
#include <internal/debug.h>
+#ifndef VACB_MAPPING_GRANULARITY
+#define VACB_MAPPING_GRANULARITY (256 * 1024)
+#endif
+
/* GLOBALS *****************************************************************/
extern FAST_MUTEX ViewLock;
}
/*
- * @unimplemented
+ * @implemented
*/
PFILE_OBJECT
STDCALL
IN PVOID Bcb
)
{
- UNIMPLEMENTED;
- return 0;
+ PINTERNAL_BCB iBcb = (PINTERNAL_BCB)Bcb;
+ return iBcb->CacheSegment->Bcb->FileObject;
}
/*
IN PVOID LazyWriterContext
)
{
- UNIMPLEMENTED;
+ CcRosInitializeFileCache(FileObject, VACB_MAPPING_GRANULARITY);
}
/*
(ULONG)FileSizes->ValidDataLength.QuadPart);
Bcb = FileObject->SectionObjectPointer->SharedCacheMap;
- assert(Bcb);
+
+ /*
+ * It is valid to call this function on file objects that weren't
+ * initialized for caching. In this case it's simple no-op.
+ */
+ if (Bcb == NULL)
+ return;
if (FileSizes->AllocationSize.QuadPart < Bcb->AllocationSize.QuadPart)
{
IN PCACHE_UNINITIALIZE_EVENT UninitializeCompleteEvent OPTIONAL
)
{
+#if 0
UNIMPLEMENTED;
return FALSE;
+#else
+ return CcRosReleaseFileCache(FileObject);
+#endif
}
-/* $Id: pin.c,v 1.16 2004/08/15 16:39:00 chorns Exp $
+/* $Id: pin.c,v 1.17 2004/08/25 15:08:29 navaraf Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
return FALSE;
}
memset(iBcb, 0, sizeof(INTERNAL_BCB));
+ iBcb->PFCB.NodeTypeCode = 0xDE45; /* Undocumented (CAPTIVE_PUBLIC_BCB_NODETYPECODE) */
+ iBcb->PFCB.NodeByteSize = sizeof(PUBLIC_BCB);
+ iBcb->PFCB.MappedLength = Length;
+ iBcb->PFCB.MappedFileOffset = *FileOffset;
iBcb->CacheSegment = CacheSeg;
iBcb->Dirty = FALSE;
- iBcb->PFCB.MappedLength = Length;
- iBcb->PFCB.MappedFileOffset.QuadPart = FileOffset->QuadPart;
+ iBcb->RefCount = 1;
*pBcb = (PVOID)iBcb;
return(TRUE);
}
OUT PVOID * Bcb
)
{
- UNIMPLEMENTED;
- return FALSE;
+ /* no-op for current implementation. */
+ return TRUE;
}
/*
OUT PVOID * Buffer
)
{
- UNIMPLEMENTED;
- return FALSE;
+ if (CcMapData(FileObject, FileOffset, Length, Wait, Bcb, Buffer))
+ {
+ if (CcPinMappedData(FileObject, FileOffset, Length, Wait, Bcb))
+ return TRUE;
+ else
+ CcUnpinData(Bcb);
+ }
+ return FALSE;
}
/*
OUT PVOID * Buffer
)
{
- UNIMPLEMENTED;
- return FALSE;
+ /*
+ * FIXME: This is function is similar to CcPinRead, but doesn't
+ * read the data if they're not present. Instead it should just
+ * prepare the cache segments and zero them out if Zero == TRUE.
+ *
+ * For now calling CcPinRead is better than returning error or
+ * just having UNIMPLEMENTED here.
+ */
+ return CcPinRead(FileObject, FileOffset, Length, Wait, Bcb, Buffer);
}
/*
{
PINTERNAL_BCB iBcb = Bcb;
CcRosReleaseCacheSegment(iBcb->CacheSegment->Bcb, iBcb->CacheSegment, TRUE,
- iBcb->Dirty, FALSE);
- ExFreeToNPagedLookasideList(&iBcbLookasideList, iBcb);
+ iBcb->Dirty, FALSE);
+ if (--iBcb->RefCount == 0)
+ {
+ ExFreeToNPagedLookasideList(&iBcbLookasideList, iBcb);
+ }
}
/*
{
UNIMPLEMENTED;
}
+
+/*
+ * @implemented
+ */
+VOID
+STDCALL
+CcRepinBcb (
+ IN PVOID Bcb
+ )
+{
+ PINTERNAL_BCB iBcb = Bcb;
+ iBcb->RefCount++;
+}
+
+/*
+ * @unimplemented
+ */
+VOID
+STDCALL
+CcUnpinRepinnedBcb (
+ IN PVOID Bcb,
+ IN BOOLEAN WriteThrough,
+ IN PIO_STATUS_BLOCK IoStatus
+ )
+{
+ PINTERNAL_BCB iBcb = Bcb;
+
+ if (--iBcb->RefCount == 0)
+ {
+ IoStatus->Information = 0;
+ if (WriteThrough)
+ {
+ ExAcquireFastMutex(&iBcb->CacheSegment->Lock);
+ if (iBcb->CacheSegment->Dirty)
+ {
+ IoStatus->Status = CcRosFlushCacheSegment(iBcb->CacheSegment);
+ }
+ else
+ {
+ IoStatus->Status = STATUS_SUCCESS;
+ }
+ ExReleaseFastMutex(&iBcb->CacheSegment->Lock);
+ }
+ else
+ {
+ IoStatus->Status = STATUS_SUCCESS;
+ }
+
+ ExFreeToNPagedLookasideList(&iBcbLookasideList, iBcb);
+ }
+}
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-/* $Id: view.c,v 1.76 2004/08/15 16:39:00 chorns Exp $
+/* $Id: view.c,v 1.77 2004/08/25 15:08:29 navaraf Exp $
*
* PROJECT: ReactOS kernel
* FILE: ntoskrnl/cc/view.c
/* FUNCTIONS *****************************************************************/
-NTSTATUS STATIC
+NTSTATUS
CcRosFlushCacheSegment(PCACHE_SEGMENT CacheSegment)
{
NTSTATUS Status;
#define SAM_REG_FILE L"\\SystemRoot\\System32\\Config\\SAM"
#define SEC_REG_FILE L"\\SystemRoot\\System32\\Config\\SECURITY"
-#define REG_SYSTEM_FILE_NAME L"\\SYSTEM"
-#define REG_SOFTWARE_FILE_NAME L"\\SOFTWARE"
-#define REG_DEFAULT_USER_FILE_NAME L"\\DEFAULT"
-#define REG_SAM_FILE_NAME L"\\SAM"
-#define REG_SEC_FILE_NAME L"\\SECURITY"
+#define REG_SYSTEM_FILE_NAME L"\\system"
+#define REG_SOFTWARE_FILE_NAME L"\\software"
+#define REG_DEFAULT_USER_FILE_NAME L"\\default"
+#define REG_SAM_FILE_NAME L"\\sam"
+#define REG_SEC_FILE_NAME L"\\security"
#define REG_BLOCK_SIZE 4096
#define REG_HBIN_DATA_OFFSET 32
#ifndef __INCLUDE_INTERNAL_CC_H
#define __INCLUDE_INTERNAL_CC_H
-/* $Id: cc.h,v 1.20 2004/08/01 21:57:34 navaraf Exp $ */
+/* $Id: cc.h,v 1.21 2004/08/25 15:08:29 navaraf Exp $ */
#include <ddk/ntifs.h>
#include <reactos/bugcodes.h>
PUBLIC_BCB PFCB;
PCACHE_SEGMENT CacheSegment;
BOOLEAN Dirty;
+ CSHORT RefCount; /* (At offset 0x34 on WinNT4) */
} INTERNAL_BCB, *PINTERNAL_BCB;
VOID STDCALL
CcMdlReadCompleteDev (IN PMDL MdlChain,
IN PDEVICE_OBJECT DeviceObject);
+NTSTATUS
+CcRosFlushCacheSegment(PCACHE_SEGMENT CacheSegment);
+
NTSTATUS
CcRosGetCacheSegment(PBCB Bcb,
ULONG FileOffset,