From 01d5ad9279a6e62b6d6576ffa39724891aa801e8 Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Sat, 17 Aug 2002 15:14:26 +0000 Subject: [PATCH] - Disabled write caching for meta data (FAT, directories) in CcSetDirtyPinedData. There is no working shutdown function for writing back each modified cache segment. A reboot or crash can damage the disk. - Added CcRosReferenceCache and CcRosDereferenceCache. - Check at each call to CcRosInitializeFileCache if the cache was initialized for the file stream by a previous call to this function. - Check at each call to CcRosReleaseFileCache if this is possible to delete the caching for the file stream. svn path=/trunk/; revision=3338 --- reactos/ntoskrnl/cc/copy.c | 4 +- reactos/ntoskrnl/cc/pin.c | 6 +- reactos/ntoskrnl/cc/view.c | 95 +++++++++++++++++++------- reactos/ntoskrnl/include/internal/cc.h | 6 +- 4 files changed, 84 insertions(+), 27 deletions(-) diff --git a/reactos/ntoskrnl/cc/copy.c b/reactos/ntoskrnl/cc/copy.c index 0d12200a0d6..ba70e46330d 100644 --- a/reactos/ntoskrnl/cc/copy.c +++ b/reactos/ntoskrnl/cc/copy.c @@ -1,4 +1,4 @@ -/* $Id: copy.c,v 1.8 2002/08/08 17:54:13 dwelch Exp $ +/* $Id: copy.c,v 1.9 2002/08/17 15:14:26 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -454,7 +454,7 @@ CcZeroData (IN PFILE_OBJECT FileObject, /* * FIXME: NT uses the shared cache map field for cached/non cached detection */ - if (((PREACTOS_COMMON_FCB_HEADER)FileObject->FsContext)->Bcb == NULL) + if (FileObject->SectionObjectPointers->SharedCacheMap == NULL) { /* File is not cached */ WriteOffset.QuadPart = StartOffset->QuadPart; diff --git a/reactos/ntoskrnl/cc/pin.c b/reactos/ntoskrnl/cc/pin.c index 285743e148e..c342dc0397a 100644 --- a/reactos/ntoskrnl/cc/pin.c +++ b/reactos/ntoskrnl/cc/pin.c @@ -1,4 +1,4 @@ -/* $Id: pin.c,v 1.4 2002/08/14 20:58:32 dwelch Exp $ +/* $Id: pin.c,v 1.5 2002/08/17 15:14:26 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -117,6 +117,10 @@ CcSetDirtyPinnedData (IN PVOID Bcb, IN PLARGE_INTEGER Lsn) { PINTERNAL_BCB iBcb = Bcb; +#if 0 iBcb->Dirty = TRUE; +#else + WriteCacheSegment(iBcb->CacheSegment); +#endif } diff --git a/reactos/ntoskrnl/cc/view.c b/reactos/ntoskrnl/cc/view.c index c6d97665e30..8e6765691b5 100644 --- a/reactos/ntoskrnl/cc/view.c +++ b/reactos/ntoskrnl/cc/view.c @@ -16,7 +16,7 @@ * 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.46 2002/08/14 20:58:32 dwelch Exp $ +/* $Id: view.c,v 1.47 2002/08/17 15:14:26 hbirr Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/cc/view.c @@ -641,13 +641,35 @@ CcRosDeleteFileCache(PFILE_OBJECT FileObject, PBCB Bcb) current_entry = current_entry->Flink; CcRosFreeCacheSegment(Bcb, current); } - + FileObject->SectionObjectPointers->SharedCacheMap = NULL; ObDereferenceObject (Bcb->FileObject); ExFreePool(Bcb); return(STATUS_SUCCESS); } +VOID CcRosReferenceCache(PFILE_OBJECT FileObject) +{ + KIRQL oldIrql; + PBCB Bcb = (PBCB)FileObject->SectionObjectPointers->SharedCacheMap; + KeAcquireSpinLock(&Bcb->BcbLock, &oldIrql); + Bcb->RefCount++; + KeReleaseSpinLock(&Bcb->BcbLock, oldIrql); +} + +VOID CcRosDereferenceCache(PFILE_OBJECT FileObject) +{ + KIRQL oldIrql; + PBCB Bcb = (PBCB)FileObject->SectionObjectPointers->SharedCacheMap; + KeAcquireSpinLock(&Bcb->BcbLock, &oldIrql); + Bcb->RefCount--; + KeReleaseSpinLock(&Bcb->BcbLock, oldIrql); + if (Bcb->RefCount == 0) + { + CcRosDeleteFileCache(FileObject, Bcb); + } +} + NTSTATUS STDCALL CcRosReleaseFileCache(PFILE_OBJECT FileObject, PBCB Bcb) /* @@ -655,6 +677,21 @@ CcRosReleaseFileCache(PFILE_OBJECT FileObject, PBCB Bcb) * has been closed. */ { + KIRQL oldIrql; + if (FileObject->SectionObjectPointers->SharedCacheMap != NULL) + { + KeAcquireSpinLock(&Bcb->BcbLock, &oldIrql); + if (FileObject->PrivateCacheMap != NULL) + { + FileObject->PrivateCacheMap = NULL; + Bcb->RefCount--; + } + KeReleaseSpinLock(&Bcb->BcbLock, oldIrql); + if (Bcb->RefCount == 0) + { + CcRosDeleteFileCache(FileObject, Bcb); + } + } return(STATUS_SUCCESS); } @@ -665,29 +702,41 @@ CcRosInitializeFileCache(PFILE_OBJECT FileObject, /* * FUNCTION: Initializes a BCB for a file object */ -{ - (*Bcb) = ExAllocatePoolWithTag(NonPagedPool, sizeof(BCB), TAG_BCB); - if ((*Bcb) == NULL) - { +{ + KIRQL oldIrql; + if (*Bcb == NULL) + { + (*Bcb) = ExAllocatePoolWithTag(NonPagedPool, sizeof(BCB), TAG_BCB); + if ((*Bcb) == NULL) + { return(STATUS_UNSUCCESSFUL); - } - - ObReferenceObjectByPointer(FileObject, - FILE_ALL_ACCESS, - NULL, - KernelMode); - (*Bcb)->FileObject = FileObject; - (*Bcb)->CacheSegmentSize = CacheSegmentSize; - if (FileObject->FsContext) - { - (*Bcb)->AllocationSize = - ((REACTOS_COMMON_FCB_HEADER*)FileObject->FsContext)->AllocationSize; - (*Bcb)->FileSize = - ((REACTOS_COMMON_FCB_HEADER*)FileObject->FsContext)->FileSize; - } - KeInitializeSpinLock(&(*Bcb)->BcbLock); - InitializeListHead(&(*Bcb)->BcbSegmentListHead); + } + ObReferenceObjectByPointer(FileObject, + FILE_ALL_ACCESS, + NULL, + KernelMode); + (*Bcb)->FileObject = FileObject; + (*Bcb)->CacheSegmentSize = CacheSegmentSize; + if (FileObject->FsContext) + { + (*Bcb)->AllocationSize = + ((REACTOS_COMMON_FCB_HEADER*)FileObject->FsContext)->AllocationSize; + (*Bcb)->FileSize = + ((REACTOS_COMMON_FCB_HEADER*)FileObject->FsContext)->FileSize; + } + KeInitializeSpinLock(&(*Bcb)->BcbLock); + InitializeListHead(&(*Bcb)->BcbSegmentListHead); + FileObject->SectionObjectPointers->SharedCacheMap = *Bcb; + } + KeAcquireSpinLock(&(*Bcb)->BcbLock, &oldIrql); + if (FileObject->PrivateCacheMap == NULL) + { + FileObject->PrivateCacheMap = *Bcb; + (*Bcb)->RefCount++; + } + KeReleaseSpinLock(&(*Bcb)->BcbLock, oldIrql); + return(STATUS_SUCCESS); } diff --git a/reactos/ntoskrnl/include/internal/cc.h b/reactos/ntoskrnl/include/internal/cc.h index 2c63d9c4a28..5c03d1ac949 100644 --- a/reactos/ntoskrnl/include/internal/cc.h +++ b/reactos/ntoskrnl/include/internal/cc.h @@ -1,6 +1,6 @@ #ifndef __INCLUDE_INTERNAL_CC_H #define __INCLUDE_INTERNAL_CC_H -/* $Id: cc.h,v 1.13 2002/08/14 20:58:34 dwelch Exp $ */ +/* $Id: cc.h,v 1.14 2002/08/17 15:14:26 hbirr Exp $ */ #include typedef struct _BCB @@ -11,6 +11,7 @@ typedef struct _BCB LARGE_INTEGER AllocationSize; LARGE_INTEGER FileSize; KSPIN_LOCK BcbLock; + ULONG RefCount; } BCB; typedef struct _CACHE_SEGMENT @@ -82,4 +83,7 @@ CcRosMarkDirtyCacheSegment(PBCB Bcb, ULONG FileOffset); NTSTATUS CcRosFlushDirtyPages(ULONG Target, PULONG Count); +VOID CcRosDereferenceCache(PFILE_OBJECT FileObject); +VOID CcRosReferenceCache(PFILE_OBJECT FileObject); + #endif