mirror of
https://github.com/reactos/reactos.git
synced 2024-06-30 18:01:07 +00:00
- 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:
parent
572bbc6ea5
commit
01d5ad9279
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue