Cleanup and Bugfixes
[tpg/acess2.git] / Kernel / vfs / fs / fat.c
index d70fae0..fab8965 100644 (file)
@@ -3,15 +3,16 @@
  * FAT12/16/32 Driver Version (Incl LFN)\r
  */\r
 #define DEBUG  0\r
+#define VERBOSE        1\r
+\r
+#define CACHE_FAT      1       //!< Caches the FAT in memory\r
+#define USE_LFN                1       //!< Enables the use of Long File Names\r
+\r
 #include <common.h>\r
 #include <modules.h>\r
 #include <vfs.h>\r
 #include "fs_fat.h"\r
 \r
-#define VERBOSE        1\r
-\r
-#define CACHE_FAT      1       //!< Caches the FAT in memory\r
-#define USE_LFN                1       //!< Enables the use of Long File Names\r
 \r
 // === TYPES ===\r
 #if USE_LFN\r
@@ -36,12 +37,9 @@ tVFS_Node    *FAT_FindDir(tVFS_Node *dirNode, char *file);
 void   FAT_CloseFile(tVFS_Node *node);\r
 \r
 // === SEMI-GLOBALS ===\r
-MODULE_DEFINE(0, 0x51 /*v0.80*/, FAT32, FAT_Install, NULL);\r
+MODULE_DEFINE(0, 0x51 /*v0.80*/, FAT32, FAT_Install, NULL, NULL);\r
 tFAT_VolInfo   gFAT_Disks[8];\r
  int   giFAT_PartCount = 0;\r
-#if CACHE_FAT\r
-Uint32 *fat_cache[8];\r
-#endif\r
 #if USE_LFN\r
 t_lfncache     *fat_lfncache;\r
 #endif\r
@@ -159,8 +157,8 @@ tVFS_Node *FAT_InitDevice(char *Device, char **options)
        #if CACHE_FAT\r
        {\r
        Uint32  Ofs;\r
-       fat_cache[ giFAT_PartCount ] = (Uint32*)malloc(sizeof(Uint32)*CountofClusters);\r
-       if(fat_cache[giFAT_PartCount] == NULL) {\r
+       diskInfo->FATCache = (Uint32*)malloc(sizeof(Uint32)*CountofClusters);\r
+       if(diskInfo->FATCache == NULL) {\r
                Warning("FAT_InitDisk - Heap Exhausted\n");\r
                return NULL;\r
        }\r
@@ -176,8 +174,8 @@ tVFS_Node *FAT_InitDevice(char *Device, char **options)
                                Ofs += 3*512;\r
                        }\r
                        val = *((int*)(buf+j*3));\r
-                       fat_cache[giFAT_PartCount][i*2] = val & 0xFFF;\r
-                       fat_cache[giFAT_PartCount][i*2+1] = (val>>12) & 0xFFF;\r
+                       diskInfo->FATCache[i*2] = val & 0xFFF;\r
+                       diskInfo->FATCache[i*2+1] = (val>>12) & 0xFFF;\r
                }\r
        }\r
        if(diskInfo->type == FAT16) {\r
@@ -187,7 +185,7 @@ tVFS_Node *FAT_InitDevice(char *Device, char **options)
                                VFS_ReadAt(diskInfo->fileHandle, Ofs, 512, buf);\r
                                Ofs += 512;\r
                        }\r
-                       fat_cache[giFAT_PartCount][i] = buf[i&255];\r
+                       diskInfo->FATCache[i] = buf[i&255];\r
                }\r
        }\r
        if(diskInfo->type == FAT32) {\r
@@ -197,7 +195,7 @@ tVFS_Node *FAT_InitDevice(char *Device, char **options)
                                VFS_ReadAt(diskInfo->fileHandle, Ofs, 512, buf);\r
                                Ofs += 512;\r
                        }\r
-                       fat_cache[giFAT_PartCount][i] = buf[i&127];\r
+                       diskInfo->FATCache[i] = buf[i&127];\r
                }\r
        }\r
        LOG("FAT Fully Cached");\r
@@ -205,11 +203,11 @@ tVFS_Node *FAT_InitDevice(char *Device, char **options)
        #endif /*CACHE_FAT*/\r
        \r
        //Initalise inode cache for FAT\r
-       gFAT_Disks[giFAT_PartCount].inodeHandle = Inode_GetHandle();\r
-       LOG("Inode Cache handle is %i", gFAT_Disks[giFAT_PartCount].inodeHandle);\r
+       diskInfo->inodeHandle = Inode_GetHandle();\r
+       LOG("Inode Cache handle is %i", diskInfo->inodeHandle);\r
        \r
        // == VFS Interface\r
-       node = &gFAT_Disks[giFAT_PartCount].rootNode;\r
+       node = &diskInfo->rootNode;\r
        node->Inode = diskInfo->rootOffset;\r
        node->Size = bs->files_in_root; // Unknown - To be set on readdir\r
        node->ImplInt = giFAT_PartCount;\r
@@ -249,23 +247,26 @@ void FAT_Unmount(tVFS_Node *Node)
 }\r
 \r
 /**\r
- * \fn static Uint32 FAT_int_GetFatValue(int handle, Uint32 cluster)\r
+ * \fn static Uint32 FAT_int_GetFatValue(tFAT_VolInfo *Disk, Uint32 cluster)\r
  * \brief Fetches a value from the FAT\r
  */\r
-static Uint32 FAT_int_GetFatValue(int handle, Uint32 cluster)\r
+static Uint32 FAT_int_GetFatValue(tFAT_VolInfo *Disk, Uint32 cluster)\r
 {\r
-       Uint32  val;\r
+       Uint32  val = 0;\r
+       #if !CACHE_FAT\r
+       Uint32  ofs = Disk->bootsect.resvSectCount*512;\r
+       #endif\r
        ENTER("iHandle xCluster", handle, cluster);\r
        #if CACHE_FAT\r
-       val = fat_cache[handle][cluster];\r
+       val = Disk->FATCache[cluster];\r
        #else\r
-       if(gFAT_Disks[handle].type == FAT12) {\r
-               VFS_ReadAt(gFAT_Disks[handle].fileHandle, 512+(cluster&~1)*3, 3, &val);\r
+       if(Disk->type == FAT12) {\r
+               VFS_ReadAt(Disk->fileHandle, ofs+(cluster>>1)*3, 3, &val);\r
                val = (cluster&1 ? val&0xFFF : val>>12);\r
-       } else if(gFAT_Disks[handle].type == FAT16) {\r
-               VFS_ReadAt(gFAT_Disks[handle].fileHandle, 512+cluster*2, 2, &val);\r
+       } else if(Disk->type == FAT16) {\r
+               VFS_ReadAt(Disk->fileHandle, ofs+cluster*2, 2, &val);\r
        } else {\r
-               VFS_ReadAt(gFAT_Disks[handle].fileHandle, 512+cluster*4, 4, &val);\r
+               VFS_ReadAt(Disk->fileHandle, ofs+cluster*4, 4, &val);\r
        }\r
        #endif /*CACHE_FAT*/\r
        LEAVE('x', val);\r
@@ -324,12 +325,13 @@ Uint64 FAT_Read(tVFS_Node *node, Uint64 offset, Uint64 length, void *buffer)
        \r
        // Sanity Check offset\r
        if(offset > node->Size) {\r
-               //Log("FAT_Read: Reading past EOF (%i > %i)", offset, node->Size);\r
+               //LOG("Reading past EOF (%i > %i)", offset, node->Size);\r
+               LEAVE('i', 0);\r
                return 0;\r
        }\r
        // Clamp Size\r
        if(offset + length > node->Size) {\r
-               //Log("FAT_Read: Reading past EOF (%lli + %lli > %lli), clamped to %lli",\r
+               //LOG("Reading past EOF (%lli + %lli > %lli), clamped to %lli",\r
                //      offset, length, node->Size, node->Size - offset);\r
                length = node->Size - offset;\r
        }\r
@@ -348,7 +350,7 @@ Uint64 FAT_Read(tVFS_Node *node, Uint64 offset, Uint64 length, void *buffer)
        \r
        //Skip previous clusters\r
        for(i=preSkip;i--;)     {\r
-               cluster = FAT_int_GetFatValue(handle, cluster);\r
+               cluster = FAT_int_GetFatValue(disk, cluster);\r
                if(cluster == eocMarker) {\r
                        Warning("FAT_Read - Offset is past end of cluster chain mark");\r
                }\r
@@ -374,7 +376,7 @@ Uint64 FAT_Read(tVFS_Node *node, Uint64 offset, Uint64 length, void *buffer)
                return length;\r
        }\r
        \r
-       cluster = FAT_int_GetFatValue(handle, cluster);\r
+       cluster = FAT_int_GetFatValue(disk, cluster);\r
        \r
        #if DEBUG\r
        LOG("pos=%i\n", pos);\r
@@ -388,7 +390,7 @@ Uint64 FAT_Read(tVFS_Node *node, Uint64 offset, Uint64 length, void *buffer)
                FAT_int_ReadCluster(handle, cluster, bpc, tmpBuf);\r
                memcpy((void*)(buffer+pos), tmpBuf, bpc);\r
                pos += bpc;\r
-               cluster = FAT_int_GetFatValue(handle, cluster);\r
+               cluster = FAT_int_GetFatValue(disk, cluster);\r
                if(cluster == eocMarker) {\r
                        Warning("FAT_Read - Read past End of Cluster Chain");\r
                        free(tmpBuf);\r
@@ -619,15 +621,17 @@ char *FAT_ReadDir(tVFS_Node *dirNode, int dirpos)
        {\r
                //Skip previous clusters\r
                for(a=preSkip;a--;)     {\r
-                       cluster = FAT_int_GetFatValue(dirNode->ImplInt, cluster);\r
+                       cluster = FAT_int_GetFatValue(disk, cluster);\r
                }\r
        }\r
        \r
        // Check for end of cluster chain\r
        if((disk->type == FAT12 && cluster == EOC_FAT12)\r
        || (disk->type == FAT16 && cluster == EOC_FAT16)\r
-       || (disk->type == FAT32 && cluster == EOC_FAT32))\r
+       || (disk->type == FAT32 && cluster == EOC_FAT32)) {\r
+               LEAVE('n');\r
                return NULL;\r
+       }\r
        \r
        // Bounds Checking (Used to spot heap overflows)\r
        if(cluster > disk->clusterCount + 2)\r
@@ -852,7 +856,7 @@ tVFS_Node *FAT_FindDir(tVFS_Node *node, char *name)
                {\r
                        if( dirCluster == disk->rootOffset && disk->type != FAT32 )\r
                                continue;\r
-                       dirCluster = FAT_int_GetFatValue(node->ImplInt, dirCluster);\r
+                       dirCluster = FAT_int_GetFatValue(disk, dirCluster);\r
                        diskOffset = (disk->firstDataSect+(dirCluster-2)*disk->bootsect.spc)*512;\r
                }\r
        }\r

UCC git Repository :: git.ucc.asn.au