From 5776256730e2e362b79cbf710ae003f371f16fee Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Sat, 8 Mar 2008 10:35:32 +0000 Subject: [PATCH] - Pass cache manager callbacks structure at every CcInitializeCacheMap() call, it's mandatory. svn path=/trunk/; revision=32607 --- reactos/drivers/filesystems/cdfs/cdfs.c | 34 +++++++++++++++++++++++- reactos/drivers/filesystems/cdfs/cdfs.h | 11 ++++++-- reactos/drivers/filesystems/cdfs/fcb.c | 8 +++--- reactos/drivers/filesystems/cdfs/fsctl.c | 4 +-- reactos/drivers/filesystems/cdfs/rw.c | 4 +-- 5 files changed, 50 insertions(+), 11 deletions(-) diff --git a/reactos/drivers/filesystems/cdfs/cdfs.c b/reactos/drivers/filesystems/cdfs/cdfs.c index d7b44ccead0..a0c98ba2e27 100644 --- a/reactos/drivers/filesystems/cdfs/cdfs.c +++ b/reactos/drivers/filesystems/cdfs/cdfs.c @@ -33,7 +33,7 @@ #define NDEBUG #include -/* FUNCTIONS ****************************************************************/ +/* GLOBALS ******************************************************************/ PCDFS_GLOBAL_DATA CdfsGlobalData; @@ -98,9 +98,41 @@ DriverEntry(PDRIVER_OBJECT DriverObject, DriverObject->DriverUnload = NULL; + /* Cache manager */ + CdfsGlobalData->CacheMgrCallbacks.AcquireForLazyWrite = CdfsAcquireForLazyWrite; + CdfsGlobalData->CacheMgrCallbacks.ReleaseFromLazyWrite = CdfsReleaseFromLazyWrite; + CdfsGlobalData->CacheMgrCallbacks.AcquireForReadAhead = CdfsAcquireForLazyWrite; + CdfsGlobalData->CacheMgrCallbacks.ReleaseFromReadAhead = CdfsReleaseFromLazyWrite; + IoRegisterFileSystem(DeviceObject); DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; return(STATUS_SUCCESS); } + +BOOLEAN NTAPI +CdfsAcquireForLazyWrite(IN PVOID Context, + IN BOOLEAN Wait) +{ + PFCB Fcb = (PFCB)Context; + ASSERT(Fcb); + DPRINT("CdfsAcquireForLazyWrite(): Fcb %p\n", Fcb); + + if (!ExAcquireResourceExclusiveLite(&(Fcb->MainResource), Wait)) + { + DPRINT("CdfsAcquireForLazyWrite(): ExReleaseResourceLite failed.\n"); + return FALSE; + } + return TRUE; +} + +VOID NTAPI +CdfsReleaseFromLazyWrite(IN PVOID Context) +{ + PFCB Fcb = (PFCB)Context; + ASSERT(Fcb); + DPRINT("CdfsReleaseFromLazyWrite(): Fcb %p\n", Fcb); + + ExReleaseResourceLite(&(Fcb->MainResource)); +} diff --git a/reactos/drivers/filesystems/cdfs/cdfs.h b/reactos/drivers/filesystems/cdfs/cdfs.h index 84bd40f2b13..a2a3e460da4 100644 --- a/reactos/drivers/filesystems/cdfs/cdfs.h +++ b/reactos/drivers/filesystems/cdfs/cdfs.h @@ -178,6 +178,7 @@ typedef struct _FCB { FSRTL_COMMON_FCB_HEADER RFCB; SECTION_OBJECT_POINTERS SectionObjectPointers; + ERESOURCE MainResource; ERESOURCE PagingIoResource; PFILE_OBJECT FileObject; @@ -189,8 +190,6 @@ typedef struct _FCB WCHAR PathName[MAX_PATH]; /* path+filename 260 max */ WCHAR ShortNameBuffer[13]; - ERESOURCE MainResource; - LIST_ENTRY FcbListEntry; struct _FCB* ParentFcb; @@ -233,6 +232,7 @@ typedef struct PDRIVER_OBJECT DriverObject; PDEVICE_OBJECT DeviceObject; ULONG Flags; + CACHE_MANAGER_CALLBACKS CacheMgrCallbacks; } CDFS_GLOBAL_DATA, *PCDFS_GLOBAL_DATA; extern PCDFS_GLOBAL_DATA CdfsGlobalData; @@ -418,4 +418,11 @@ NTSTATUS STDCALL DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath); +BOOLEAN NTAPI +CdfsAcquireForLazyWrite(IN PVOID Context, + IN BOOLEAN Wait); + +VOID NTAPI +CdfsReleaseFromLazyWrite(IN PVOID Context); + #endif //CDFS_H diff --git a/reactos/drivers/filesystems/cdfs/fcb.c b/reactos/drivers/filesystems/cdfs/fcb.c index 5436c0dfe59..dbaa5c6ce58 100644 --- a/reactos/drivers/filesystems/cdfs/fcb.c +++ b/reactos/drivers/filesystems/cdfs/fcb.c @@ -245,8 +245,8 @@ CdfsFCBInitializeCache(PVCB Vcb, CcInitializeCacheMap(FileObject, (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize), FALSE, - NULL, - NULL); + &(CdfsGlobalData->CacheMgrCallbacks), + Fcb); ObDereferenceObject(FileObject); Fcb->Flags |= FCB_CACHE_INITIALIZED; @@ -430,8 +430,8 @@ CdfsAttachFCBToFileObject(PDEVICE_EXTENSION Vcb, CcInitializeCacheMap(FileObject, (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize), FALSE, - NULL, - NULL); + &(CdfsGlobalData->CacheMgrCallbacks), + Fcb); Fcb->Flags |= FCB_CACHE_INITIALIZED; } diff --git a/reactos/drivers/filesystems/cdfs/fsctl.c b/reactos/drivers/filesystems/cdfs/fsctl.c index edc404d7cf5..63f9209466b 100644 --- a/reactos/drivers/filesystems/cdfs/fsctl.c +++ b/reactos/drivers/filesystems/cdfs/fsctl.c @@ -402,8 +402,8 @@ CdfsMountVolume(PDEVICE_OBJECT DeviceObject, CcInitializeCacheMap(DeviceExt->StreamFileObject, (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize), TRUE, - NULL, - NULL); + &(CdfsGlobalData->CacheMgrCallbacks), + Fcb); ExInitializeResourceLite(&DeviceExt->VcbResource); ExInitializeResourceLite(&DeviceExt->DirResource); diff --git a/reactos/drivers/filesystems/cdfs/rw.c b/reactos/drivers/filesystems/cdfs/rw.c index c71f84eecd8..86dc3e2a256 100644 --- a/reactos/drivers/filesystems/cdfs/rw.c +++ b/reactos/drivers/filesystems/cdfs/rw.c @@ -85,8 +85,8 @@ CdfsReadFile(PDEVICE_EXTENSION DeviceExt, CcInitializeCacheMap(FileObject, (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize), FALSE, - NULL, - NULL); + &(CdfsGlobalData->CacheMgrCallbacks), + Fcb); } FileOffset.QuadPart = (LONGLONG)ReadOffset;