Author: tkreuzer
Date: Mon Oct  3 23:35:27 2011
New Revision: 53983

URL: http://svn.reactos.org/svn/reactos?rev=53983&view=rev
Log:
[FREELDR]
Implement directory buffer caching for FAT

Modified:
    trunk/reactos/boot/freeldr/freeldr/fs/fat.c

Modified: trunk/reactos/boot/freeldr/freeldr/fs/fat.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/fs/fat.c?rev=53983&r1=53982&r2=53983&view=diff
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/fs/fat.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/fs/fat.c [iso-8859-1] Mon Oct  3 
23:35:27 2011
@@ -370,9 +370,21 @@
        }
 }
 
+typedef struct _DIRECTORY_BUFFER
+{
+       LIST_ENTRY Link;
+       PVOID Volume;
+       ULONG DirectoryStartCluster;
+       ULONG DirectorySize;
+       UCHAR Data[];
+} DIRECTORY_BUFFER, *PDIRECTORY_BUFFER;
+
+LIST_ENTRY DirectoryBufferListHead = {&DirectoryBufferListHead, 
&DirectoryBufferListHead};
+
 PVOID FatBufferDirectory(PFAT_VOLUME_INFO Volume, ULONG DirectoryStartCluster, 
ULONG *DirectorySize, BOOLEAN RootDirectory)
 {
-       PVOID   DirectoryBuffer;
+       PDIRECTORY_BUFFER DirectoryBuffer;
+       PLIST_ENTRY Entry;
 
        TRACE("FatBufferDirectory() DirectoryStartCluster = %d RootDirectory = 
%s\n", DirectoryStartCluster, (RootDirectory ? "TRUE" : "FALSE"));
 
@@ -386,6 +398,23 @@
                RootDirectory = FALSE;
        }
 
+       /* Search the list for a match */
+       for (Entry = DirectoryBufferListHead.Flink;
+            Entry != &DirectoryBufferListHead;
+            Entry = Entry->Flink)
+       {
+               DirectoryBuffer = CONTAINING_RECORD(Entry, DIRECTORY_BUFFER, 
Link);
+
+               /* Check if it matches */
+               if ((DirectoryBuffer->Volume == Volume) &&
+                   (DirectoryBuffer->DirectoryStartCluster == 
DirectoryStartCluster))
+               {
+                       TRACE("Found cached buffer\n");
+                       *DirectorySize = DirectoryBuffer->DirectorySize;
+                       return DirectoryBuffer->Data;
+               }
+       }
+
        //
        // Calculate the size of the directory
        //
@@ -402,7 +431,7 @@
        // Attempt to allocate memory for directory buffer
        //
        TRACE("Trying to allocate (DirectorySize) %d bytes.\n", *DirectorySize);
-       DirectoryBuffer = MmHeapAlloc(*DirectorySize);
+       DirectoryBuffer = MmHeapAlloc(*DirectorySize + 
sizeof(DIRECTORY_BUFFER));
 
        if (DirectoryBuffer == NULL)
        {
@@ -414,7 +443,7 @@
        //
        if (RootDirectory)
        {
-               if (!FatReadVolumeSectors(Volume, Volume->RootDirSectorStart, 
Volume->RootDirSectors, DirectoryBuffer))
+               if (!FatReadVolumeSectors(Volume, Volume->RootDirSectorStart, 
Volume->RootDirSectors, DirectoryBuffer->Data))
                {
                        MmHeapFree(DirectoryBuffer);
                        return NULL;
@@ -422,14 +451,20 @@
        }
        else
        {
-               if (!FatReadClusterChain(Volume, DirectoryStartCluster, 
0xFFFFFFFF, DirectoryBuffer))
+               if (!FatReadClusterChain(Volume, DirectoryStartCluster, 
0xFFFFFFFF, DirectoryBuffer->Data))
                {
                        MmHeapFree(DirectoryBuffer);
                        return NULL;
                }
        }
 
-       return DirectoryBuffer;
+       /* Enqueue it in the list */
+       DirectoryBuffer->Volume = Volume;
+       DirectoryBuffer->DirectoryStartCluster = DirectoryStartCluster;
+       DirectoryBuffer->DirectorySize = *DirectorySize;
+       InsertTailList(&DirectoryBufferListHead, &DirectoryBuffer->Link);
+
+       return DirectoryBuffer->Data;
 }
 
 BOOLEAN FatSearchDirectoryBufferForFile(PFAT_VOLUME_INFO Volume, PVOID 
DirectoryBuffer, ULONG DirectorySize, PCHAR FileName, PFAT_FILE_INFO 
FatFileInfoPointer)
@@ -774,7 +809,6 @@
                {
                        if (!FatXSearchDirectoryBufferForFile(Volume, 
DirectoryBuffer, DirectorySize, PathPart, &FatFileInfo))
                        {
-                               MmHeapFree(DirectoryBuffer);
                                return ENOENT;
                        }
                }
@@ -782,12 +816,9 @@
                {
                        if (!FatSearchDirectoryBufferForFile(Volume, 
DirectoryBuffer, DirectorySize, PathPart, &FatFileInfo))
                        {
-                               MmHeapFree(DirectoryBuffer);
                                return ENOENT;
                        }
                }
-
-               MmHeapFree(DirectoryBuffer);
 
                //
                // If we have another sub-directory to go then


Reply via email to