- 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
This commit is contained in:
Hartmut Birr 2002-08-17 15:14:26 +00:00
parent 572bbc6ea5
commit 01d5ad9279
4 changed files with 84 additions and 27 deletions

View file

@ -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;

View file

@ -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
}

View file

@ -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);
}

View file

@ -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 <ddk/ntifs.h>
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