git.ucc.asn.au
/
tpg
/
acess2.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Implemented Dependency resolving for compile-time modules and Updated the README
[tpg/acess2.git]
/
Kernel
/
vfs
/
fs
/
fat.c
diff --git
a/Kernel/vfs/fs/fat.c
b/Kernel/vfs/fs/fat.c
index
5712da9
..
fab8965
100644
(file)
--- a/
Kernel/vfs/fs/fat.c
+++ b/
Kernel/vfs/fs/fat.c
@@
-3,15
+3,16
@@
* FAT12/16/32 Driver Version (Incl LFN)
\r
*/
\r
#define DEBUG 0
\r
* 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
#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
\r
// === TYPES ===
\r
#if USE_LFN
\r
@@
-39,9
+40,6
@@
void FAT_CloseFile(tVFS_Node *node);
MODULE_DEFINE(0, 0x51 /*v0.80*/, FAT32, FAT_Install, NULL, NULL);
\r
tFAT_VolInfo gFAT_Disks[8];
\r
int giFAT_PartCount = 0;
\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
#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
#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
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
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
}
\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
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
}
\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
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
}
\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
#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
\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
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
}
\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
* \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
{
\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
ENTER("iHandle xCluster", handle, cluster);
\r
#if CACHE_FAT
\r
- val =
fat_cache[handle]
[cluster];
\r
+ val =
Disk->FATCache
[cluster];
\r
#else
\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
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
} 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
}
\r
#endif /*CACHE_FAT*/
\r
LEAVE('x', val);
\r
@@
-325,6
+326,7
@@
Uint64 FAT_Read(tVFS_Node *node, Uint64 offset, Uint64 length, void *buffer)
// Sanity Check offset
\r
if(offset > node->Size) {
\r
//LOG("Reading past EOF (%i > %i)", offset, node->Size);
\r
// Sanity Check offset
\r
if(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
return 0;
\r
}
\r
// Clamp Size
\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
\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
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
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
\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
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
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
{
\r
//Skip previous clusters
\r
for(a=preSkip;a--;) {
\r
- cluster = FAT_int_GetFatValue(di
rNode->ImplInt
, cluster);
\r
+ cluster = FAT_int_GetFatValue(di
sk
, 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
}
\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
return NULL;
\r
+ }
\r
\r
// Bounds Checking (Used to spot heap overflows)
\r
if(cluster > disk->clusterCount + 2)
\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
{
\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
diskOffset = (disk->firstDataSect+(dirCluster-2)*disk->bootsect.spc)*512;
\r
}
\r
}
\r
UCC
git Repository :: git.ucc.asn.au