mirror of
https://github.com/reactos/reactos.git
synced 2024-07-04 11:44:33 +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
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* 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
|
* 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 */
|
/* File is not cached */
|
||||||
WriteOffset.QuadPart = StartOffset->QuadPart;
|
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
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -117,6 +117,10 @@ CcSetDirtyPinnedData (IN PVOID Bcb,
|
||||||
IN PLARGE_INTEGER Lsn)
|
IN PLARGE_INTEGER Lsn)
|
||||||
{
|
{
|
||||||
PINTERNAL_BCB iBcb = Bcb;
|
PINTERNAL_BCB iBcb = Bcb;
|
||||||
|
#if 0
|
||||||
iBcb->Dirty = TRUE;
|
iBcb->Dirty = TRUE;
|
||||||
|
#else
|
||||||
|
WriteCacheSegment(iBcb->CacheSegment);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* 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
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: ntoskrnl/cc/view.c
|
* FILE: ntoskrnl/cc/view.c
|
||||||
|
@ -641,13 +641,35 @@ CcRosDeleteFileCache(PFILE_OBJECT FileObject, PBCB Bcb)
|
||||||
current_entry = current_entry->Flink;
|
current_entry = current_entry->Flink;
|
||||||
CcRosFreeCacheSegment(Bcb, current);
|
CcRosFreeCacheSegment(Bcb, current);
|
||||||
}
|
}
|
||||||
|
FileObject->SectionObjectPointers->SharedCacheMap = NULL;
|
||||||
ObDereferenceObject (Bcb->FileObject);
|
ObDereferenceObject (Bcb->FileObject);
|
||||||
ExFreePool(Bcb);
|
ExFreePool(Bcb);
|
||||||
|
|
||||||
return(STATUS_SUCCESS);
|
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
|
NTSTATUS STDCALL
|
||||||
CcRosReleaseFileCache(PFILE_OBJECT FileObject, PBCB Bcb)
|
CcRosReleaseFileCache(PFILE_OBJECT FileObject, PBCB Bcb)
|
||||||
/*
|
/*
|
||||||
|
@ -655,6 +677,21 @@ CcRosReleaseFileCache(PFILE_OBJECT FileObject, PBCB Bcb)
|
||||||
* has been closed.
|
* 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);
|
return(STATUS_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -666,27 +703,39 @@ CcRosInitializeFileCache(PFILE_OBJECT FileObject,
|
||||||
* FUNCTION: Initializes a BCB for a file object
|
* FUNCTION: Initializes a BCB for a file object
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
(*Bcb) = ExAllocatePoolWithTag(NonPagedPool, sizeof(BCB), TAG_BCB);
|
KIRQL oldIrql;
|
||||||
if ((*Bcb) == NULL)
|
if (*Bcb == NULL)
|
||||||
{
|
{
|
||||||
|
(*Bcb) = ExAllocatePoolWithTag(NonPagedPool, sizeof(BCB), TAG_BCB);
|
||||||
|
if ((*Bcb) == NULL)
|
||||||
|
{
|
||||||
return(STATUS_UNSUCCESSFUL);
|
return(STATUS_UNSUCCESSFUL);
|
||||||
}
|
}
|
||||||
|
|
||||||
ObReferenceObjectByPointer(FileObject,
|
ObReferenceObjectByPointer(FileObject,
|
||||||
FILE_ALL_ACCESS,
|
FILE_ALL_ACCESS,
|
||||||
NULL,
|
NULL,
|
||||||
KernelMode);
|
KernelMode);
|
||||||
(*Bcb)->FileObject = FileObject;
|
(*Bcb)->FileObject = FileObject;
|
||||||
(*Bcb)->CacheSegmentSize = CacheSegmentSize;
|
(*Bcb)->CacheSegmentSize = CacheSegmentSize;
|
||||||
if (FileObject->FsContext)
|
if (FileObject->FsContext)
|
||||||
{
|
{
|
||||||
(*Bcb)->AllocationSize =
|
(*Bcb)->AllocationSize =
|
||||||
((REACTOS_COMMON_FCB_HEADER*)FileObject->FsContext)->AllocationSize;
|
((REACTOS_COMMON_FCB_HEADER*)FileObject->FsContext)->AllocationSize;
|
||||||
(*Bcb)->FileSize =
|
(*Bcb)->FileSize =
|
||||||
((REACTOS_COMMON_FCB_HEADER*)FileObject->FsContext)->FileSize;
|
((REACTOS_COMMON_FCB_HEADER*)FileObject->FsContext)->FileSize;
|
||||||
}
|
}
|
||||||
KeInitializeSpinLock(&(*Bcb)->BcbLock);
|
KeInitializeSpinLock(&(*Bcb)->BcbLock);
|
||||||
InitializeListHead(&(*Bcb)->BcbSegmentListHead);
|
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);
|
return(STATUS_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#ifndef __INCLUDE_INTERNAL_CC_H
|
#ifndef __INCLUDE_INTERNAL_CC_H
|
||||||
#define __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>
|
#include <ddk/ntifs.h>
|
||||||
|
|
||||||
typedef struct _BCB
|
typedef struct _BCB
|
||||||
|
@ -11,6 +11,7 @@ typedef struct _BCB
|
||||||
LARGE_INTEGER AllocationSize;
|
LARGE_INTEGER AllocationSize;
|
||||||
LARGE_INTEGER FileSize;
|
LARGE_INTEGER FileSize;
|
||||||
KSPIN_LOCK BcbLock;
|
KSPIN_LOCK BcbLock;
|
||||||
|
ULONG RefCount;
|
||||||
} BCB;
|
} BCB;
|
||||||
|
|
||||||
typedef struct _CACHE_SEGMENT
|
typedef struct _CACHE_SEGMENT
|
||||||
|
@ -82,4 +83,7 @@ CcRosMarkDirtyCacheSegment(PBCB Bcb, ULONG FileOffset);
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
CcRosFlushDirtyPages(ULONG Target, PULONG Count);
|
CcRosFlushDirtyPages(ULONG Target, PULONG Count);
|
||||||
|
|
||||||
|
VOID CcRosDereferenceCache(PFILE_OBJECT FileObject);
|
||||||
|
VOID CcRosReferenceCache(PFILE_OBJECT FileObject);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue