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
Cleanup and Bugfixes
[tpg/acess2.git]
/
Kernel
/
vfs
/
fs
/
fat.c
diff --git
a/Kernel/vfs/fs/fat.c
b/Kernel/vfs/fs/fat.c
index
e03df09
..
fab8965
100644
(file)
--- a/
Kernel/vfs/fs/fat.c
+++ b/
Kernel/vfs/fs/fat.c
@@
-1,31
+1,19
@@
/*
\r
/*
\r
- * Acess2
\r
+ * Acess
2
\r
* FAT12/16/32 Driver Version (Incl LFN)
\r
*/
\r
* FAT12/16/32 Driver Version (Incl LFN)
\r
*/
\r
-//INCLUDES
\r
-#include <common.h>
\r
-#include <modules.h>
\r
-#include <vfs.h>
\r
-#include "fs_fat.h"
\r
-
\r
#define DEBUG 0
\r
#define VERBOSE 1
\r
\r
#define DEBUG 0
\r
#define VERBOSE 1
\r
\r
-#if DEBUG
\r
-# define DEBUGS(v...) Log(v)
\r
-#else
\r
-# define DEBUGS(v...)
\r
-# undef ENTER
\r
-# undef LOG
\r
-# undef LEAVE
\r
-# define ENTER(...)
\r
-# define LOG(...)
\r
-# define LEAVE(...)
\r
-#endif
\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
#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
+
\r
// === TYPES ===
\r
#if USE_LFN
\r
typedef struct s_lfncache {
\r
// === TYPES ===
\r
#if USE_LFN
\r
typedef struct s_lfncache {
\r
@@
-38,7
+26,7
@@
typedef struct s_lfncache {
\r
// === PROTOTYPES ===
\r
int FAT_Install(char **Arguments);
\r
\r
// === PROTOTYPES ===
\r
int FAT_Install(char **Arguments);
\r
-tVFS_Node *FAT_InitDevice(char *device, char *options);
\r
+tVFS_Node *FAT_InitDevice(char *device, char *
*
options);
\r
void FAT_Unmount(tVFS_Node *Node);
\r
Uint64 FAT_Read(tVFS_Node *node, Uint64 offset, Uint64 length, void *buffer);
\r
Uint64 FAT_Write(tVFS_Node *node, Uint64 offset, Uint64 length, void *buffer);
\r
void FAT_Unmount(tVFS_Node *Node);
\r
Uint64 FAT_Read(tVFS_Node *node, Uint64 offset, Uint64 length, void *buffer);
\r
Uint64 FAT_Write(tVFS_Node *node, Uint64 offset, Uint64 length, void *buffer);
\r
@@
-49,12
+37,9
@@
tVFS_Node *FAT_FindDir(tVFS_Node *dirNode, char *file);
void FAT_CloseFile(tVFS_Node *node);
\r
\r
// === SEMI-GLOBALS ===
\r
void FAT_CloseFile(tVFS_Node *node);
\r
\r
// === SEMI-GLOBALS ===
\r
-MODULE_DEFINE(0, 0x5
B /*v0.90*/, FAT32, FAT_Install
, NULL);
\r
+MODULE_DEFINE(0, 0x5
1 /*v0.80*/, FAT32, FAT_Install, NULL
, NULL);
\r
tFAT_VolInfo gFAT_Disks[8];
\r
int giFAT_PartCount = 0;
\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
@@
-74,10
+59,10
@@
int FAT_Install(char **Arguments)
}
\r
\r
/**
\r
}
\r
\r
/**
\r
- * \fn tVFS_Node *FAT_InitDevice(char *Device, char *options)
\r
+ * \fn tVFS_Node *FAT_InitDevice(char *Device, char *
*
options)
\r
* \brief Reads the boot sector of a disk and prepares the structures for it
\r
*/
\r
* \brief Reads the boot sector of a disk and prepares the structures for it
\r
*/
\r
-tVFS_Node *FAT_InitDevice(char *Device, char *options)
\r
+tVFS_Node *FAT_InitDevice(char *Device, char *
*
options)
\r
{
\r
fat_bootsect *bs;
\r
int i;
\r
{
\r
fat_bootsect *bs;
\r
int i;
\r
@@
-172,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
@@
-189,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
@@
-200,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
@@
-210,22
+195,19
@@
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
}
\r
}
\r
-
DEBUGS(" FAT_InitDisk: FAT Fully Cached\n
");
\r
+
LOG("FAT Fully Cached
");
\r
}
\r
#endif /*CACHE_FAT*/
\r
\r
//Initalise inode cache for FAT
\r
}
\r
#endif /*CACHE_FAT*/
\r
\r
//Initalise inode cache for FAT
\r
- gFAT_Disks[giFAT_PartCount].inodeHandle = Inode_GetHandle();
\r
-
\r
- #if DEBUG
\r
- Log(" FAT_InitDisk: Inode Cache handle is %i\n", gFAT_Disks[giFAT_PartCount].inodeHandle);
\r
- #endif
\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
@@
-265,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
@@
-292,9
+277,7
@@
static Uint32 FAT_int_GetFatValue(int handle, Uint32 cluster)
*/
\r
static void FAT_int_ReadCluster(int Handle, Uint32 Cluster, int Length, void *Buffer)
\r
{
\r
*/
\r
static void FAT_int_ReadCluster(int Handle, Uint32 Cluster, int Length, void *Buffer)
\r
{
\r
- #if DEBUG
\r
ENTER("iHandle xCluster iLength pBuffer", Handle, Cluster, Length, Buffer);
\r
ENTER("iHandle xCluster iLength pBuffer", Handle, Cluster, Length, Buffer);
\r
- #endif
\r
VFS_ReadAt(
\r
gFAT_Disks[Handle].fileHandle,
\r
(gFAT_Disks[Handle].firstDataSect + (Cluster-2)*gFAT_Disks[Handle].bootsect.spc )
\r
VFS_ReadAt(
\r
gFAT_Disks[Handle].fileHandle,
\r
(gFAT_Disks[Handle].firstDataSect + (Cluster-2)*gFAT_Disks[Handle].bootsect.spc )
\r
@@
-302,9
+285,7
@@
static void FAT_int_ReadCluster(int Handle, Uint32 Cluster, int Length, void *Bu
Length,
\r
Buffer
\r
);
\r
Length,
\r
Buffer
\r
);
\r
- #if DEBUG
\r
LEAVE('-');
\r
LEAVE('-');
\r
- #endif
\r
}
\r
\r
/**
\r
}
\r
\r
/**
\r
@@
-343,12
+324,16
@@
Uint64 FAT_Read(tVFS_Node *node, Uint64 offset, Uint64 length, void *buffer)
}
\r
\r
// Sanity Check offset
\r
}
\r
\r
// Sanity Check offset
\r
- if(offset > node->Size){
\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
- if(length + offset > node->Size) {
\r
- length = offset - node->Size;
\r
+ if(offset + length > node->Size) {
\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
\r
// Single Cluster including offset
\r
}
\r
\r
// Single Cluster including offset
\r
@@
-365,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
@@
-391,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
@@
-405,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
@@
-636,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
@@
-869,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