- Pass cache manager callbacks structure at every CcInitializeCacheMap() call, it...
authorAleksey Bragin <aleksey@reactos.org>
Sat, 8 Mar 2008 10:35:32 +0000 (10:35 +0000)
committerAleksey Bragin <aleksey@reactos.org>
Sat, 8 Mar 2008 10:35:32 +0000 (10:35 +0000)
svn path=/trunk/; revision=32607

reactos/drivers/filesystems/cdfs/cdfs.c
reactos/drivers/filesystems/cdfs/cdfs.h
reactos/drivers/filesystems/cdfs/fcb.c
reactos/drivers/filesystems/cdfs/fsctl.c
reactos/drivers/filesystems/cdfs/rw.c

index d7b44cc..a0c98ba 100644 (file)
@@ -33,7 +33,7 @@
 #define NDEBUG
 #include <debug.h>
 
-/* 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));
+}
index 84bd40f..a2a3e46 100644 (file)
@@ -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
index 5436c0d..dbaa5c6 100644 (file)
@@ -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;
     }
 
index edc404d..63f9209 100644 (file)
@@ -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);
index c71f84e..86dc3e2 100644 (file)
@@ -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;