Various Changes
[tpg/acess2.git] / Kernel / vfs / fs / ext2.c
index 78c115e..06189f8 100644 (file)
@@ -7,15 +7,17 @@
  * \brief Second Extended Filesystem Driver\r
  * \todo Implement file read support\r
  */\r
+#define DEBUG  1\r
 #include <common.h>\r
 #include <vfs.h>\r
+#include <modules.h>\r
 #include "fs_ext2.h"\r
 \r
 // === STRUCTURES ===\r
 typedef struct {\r
         int    FD;\r
         int    CacheID;\r
-       vfs_node        RootNode;\r
+       tVFS_Node       RootNode;\r
        \r
        tExt2_SuperBlock        SuperBlock;\r
         int    BlockSize;\r
@@ -25,35 +27,40 @@ typedef struct {
 } tExt2_Disk;\r
 \r
 // === PROTOTYPES ===\r
-//Interface Functions\r
+ int   Ext2_Install(char **Arguments);\r
+// Interface Functions\r
 tVFS_Node      *Ext2_InitDevice(char *Device, char **Options);\r
-void           Ext2_UnMount(tVFS_Node *Node);\r
+void           Ext2_Unmount(tVFS_Node *Node);\r
 Uint64         Ext2_Read(tVFS_Node *node, Uint64 offset, Uint64 length, void *buffer);\r
 Uint64         Ext2_Write(tVFS_Node *node, Uint64 offset, Uint64 length, void *buffer);\r
+void           Ext2_CloseFile(tVFS_Node *Node);\r
 char           *Ext2_ReadDir(tVFS_Node *Node, int Pos);\r
 tVFS_Node      *Ext2_FindDir(tVFS_Node *Node, char *FileName);\r
-tVFS_Node      *Ext2_MkNod(tVFS_Node *Node, char *Name, Uint Flags);\r
- int           Ext2_int_GetInode(vfs_node *Node, tExt2_Inode *Inode);\r
-tVFS_Node      *Ext2_int_CreateNode(tExt2_Disk *Disk, Uint InodeId, char *Name, Uint64 VfsInode);\r
+ int           Ext2_MkNod(tVFS_Node *Node, char *Name, Uint Flags);\r
+// Internal Helpers\r
+ int           Ext2_int_GetInode(tVFS_Node *Node, tExt2_Inode *Inode);\r
+tVFS_Node      *Ext2_int_CreateNode(tExt2_Disk *Disk, Uint InodeId, char *Name);\r
  int           Ext2_int_ReadInode(tExt2_Disk *Disk, Uint InodeId, tExt2_Inode *Inode);\r
 Uint64         Ext2_int_GetBlockAddr(tExt2_Disk *Disk, Uint32 *Blocks, int BlockNum);\r
 \r
 // === SEMI-GLOBALS ===\r
+MODULE_DEFINE(0, 0x5B /*v0.90*/, EXT2, Ext2_Install, NULL);\r
 tExt2_Disk     gExt2_disks[6];\r
  int   giExt2_count = 0;\r
-tVFS_Driver    gExt2_FSInfo = {NULL,\r
-       "ext2", 0, Ext2_InitDevice, Ext2_UnMount, NULL\r
+tVFS_Driver    gExt2_FSInfo = {\r
+       "ext2", 0, Ext2_InitDevice, Ext2_Unmount, NULL\r
        };\r
 \r
 // === CODE ===\r
 \r
 /**\r
- * \fn void Ext2_Install()\r
+ * \fn int Ext2_Install(char **Arguments)\r
  * \brief Install the Ext2 Filesystem Driver\r
  */\r
-void Ext2_Install()\r
+int Ext2_Install(char **Arguments)\r
 {\r
        VFS_AddDriver( &gExt2_FSInfo );\r
+       return 1;\r
 }\r
 \r
 /**\r
@@ -74,7 +81,7 @@ tVFS_Node *Ext2_InitDevice(char *Device, char **Options)
        // Open Disk\r
        fd = VFS_Open(Device, VFS_OPENFLAG_READ|VFS_OPENFLAG_WRITE);            //Open Device\r
        if(fd == -1) {\r
-               Warning"[EXT2] Unable to open '%s'\n", Device);\r
+               Warning("[EXT2] Unable to open '%s'\n", Device);\r
                return NULL;\r
        }\r
        \r
@@ -83,7 +90,7 @@ tVFS_Node *Ext2_InitDevice(char *Device, char **Options)
        \r
        // Sanity Check Magic value\r
        if(sb.s_magic != 0xEF53) {\r
-               WarningEx("EXT2", "Volume '%s' is not an EXT2 volume\n", Device);\r
+               Warning("[EXT2 ] Volume '%s' is not an EXT2 volume\n", Device);\r
                VFS_Close(fd);\r
                return NULL;\r
        }\r
@@ -94,7 +101,7 @@ tVFS_Node *Ext2_InitDevice(char *Device, char **Options)
        \r
        // Allocate Disk Information\r
        disk = malloc(sizeof(tExt2_Disk) + sizeof(tExt2_Group)*groupCount);\r
-       disk->fd = fd;\r
+       disk->FD = fd;\r
        memcpy(&disk->SuperBlock, &sb, 1024);\r
        disk->GroupCount = groupCount;\r
        \r
@@ -106,7 +113,7 @@ tVFS_Node *Ext2_InitDevice(char *Device, char **Options)
        disk->BlockSize = 1024 << sb.s_log_block_size;\r
        \r
        // Read Group Information\r
-       VFS_ReadAt(disk->fd,\r
+       VFS_ReadAt(disk->FD,\r
                sb.s_first_data_block * disk->BlockSize + 1024,\r
                sizeof(tExt2_Group)*groupCount,\r
                disk->Groups);\r
@@ -126,7 +133,7 @@ tVFS_Node *Ext2_InitDevice(char *Device, char **Options)
        Ext2_int_ReadInode(disk, 2, &inode);\r
        \r
        // Create Root Node\r
-       memset(&disk->RootNode, 0, sizeof(vfs_node));\r
+       memset(&disk->RootNode, 0, sizeof(tVFS_Node));\r
        disk->RootNode.Inode = 2;       // Root inode ID\r
        disk->RootNode.ImplPtr = disk;  // Save disk pointer\r
        disk->RootNode.Size = -1;       // Fill in later (on readdir)\r
@@ -158,7 +165,7 @@ void Ext2_Unmount(tVFS_Node *Node)
 {\r
        tExt2_Disk      *disk = Node->ImplPtr;\r
        \r
-       VFS_Close( disk->fd );\r
+       VFS_Close( disk->FD );\r
        Inode_ClearCache( disk->CacheID );\r
        memset(disk, 0, sizeof(tExt2_Disk)+disk->GroupCount*sizeof(tExt2_Group));\r
        free(disk);\r
@@ -186,13 +193,13 @@ Uint64 Ext2_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
        // Read only block\r
        if(Length <= disk->BlockSize - Offset)\r
        {\r
-               VFS_ReadAt( disk->fd, base+Offset, Length, Buffer);\r
+               VFS_ReadAt( disk->FD, base+Offset, Length, Buffer);\r
                return Length;\r
        }\r
        \r
        // Read first block\r
        remLen = Length;\r
-       VFS_ReadAt( disk->fd, base + Offset, disk->BlockSize - Offset, Buffer);\r
+       VFS_ReadAt( disk->FD, base + Offset, disk->BlockSize - Offset, Buffer);\r
        remLen -= disk->BlockSize - Offset;\r
        Buffer += disk->BlockSize - Offset;\r
        block ++;\r
@@ -201,7 +208,7 @@ Uint64 Ext2_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
        while(remLen > disk->BlockSize)\r
        {\r
                base = Ext2_int_GetBlockAddr(disk, inode.i_block, block);\r
-               VFS_ReadAt( disk->fd, base, disk->BlockSize, Buffer);\r
+               VFS_ReadAt( disk->FD, base, disk->BlockSize, Buffer);\r
                Buffer += disk->BlockSize;\r
                remLen -= disk->BlockSize;\r
                block ++;\r
@@ -209,7 +216,7 @@ Uint64 Ext2_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
        \r
        // Read last block\r
        base = Ext2_int_GetBlockAddr(disk, inode.i_block, block);\r
-       VFS_ReadAt( disk->fd, base, remLen, Buffer);\r
+       VFS_ReadAt( disk->FD, base, remLen, Buffer);\r
        \r
        return Length;\r
 }\r
@@ -247,13 +254,13 @@ Uint64 Ext2_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
                \r
                // Write only block (if only one)\r
                if(Offset + retLen <= disk->BlockSize) {\r
-                       VFS_WriteAt(disk->fd, base+Offset, retLen, Buffer);\r
+                       VFS_WriteAt(disk->FD, base+Offset, retLen, Buffer);\r
                        if(bNewBlocks)  return Length;\r
                        goto addBlocks; // Ugh! A goto, but it seems unavoidable\r
                }\r
                \r
                // Write First Block\r
-               VFS_WriteAt(disk->fd, base+Offset, disk->BlockSize-Offset, Buffer);\r
+               VFS_WriteAt(disk->FD, base+Offset, disk->BlockSize-Offset, Buffer);\r
                Buffer += disk->BlockSize-Offset;\r
                retLen -= disk->BlockSize-Offset;\r
                block ++;\r
@@ -262,7 +269,7 @@ Uint64 Ext2_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
                while(retLen > disk->BlockSize)\r
                {\r
                        base = Ext2_int_GetBlockAddr(disk, inode.i_block, block);\r
-                       VFS_WriteAt(disk->fd, base, disk->BlockSize, Buffer);\r
+                       VFS_WriteAt(disk->FD, base, disk->BlockSize, Buffer);\r
                        Buffer += disk->BlockSize;\r
                        retLen -= disk->BlockSize;\r
                        block ++;\r
@@ -270,26 +277,26 @@ Uint64 Ext2_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
                \r
                // Write last block\r
                base = Ext2_int_GetBlockAddr(disk, inode.i_block, block);\r
-               VFS_WriteAt(disk->fd, base, retLen, Buffer);\r
+               VFS_WriteAt(disk->FD, base, retLen, Buffer);\r
                if(bNewBlocks)  return Length;  // Writing in only allocated space\r
        }\r
        \r
 addBlocks:\r
        ///\todo Implement block allocation\r
-       WarningEx("EXT2", "File extending is not yet supported");\r
+       Warning("[EXT2] File extending is not yet supported");\r
        \r
        return 0;\r
 }\r
 \r
 /**\r
- * \fn int Ext2_CloseFile(vfs_node *Node)\r
+ * \fn void Ext2_CloseFile(vfs_node *Node)\r
  * \brief Close a file (Remove it from the cache)\r
  */\r
-int Ext2_CloseFile(tVFS_Node *Node)\r
+void Ext2_CloseFile(tVFS_Node *Node)\r
 {\r
        tExt2_Disk      *disk = Node->ImplPtr;\r
-       inode_uncacheNode(disk->CacheID, Node->impl);\r
-       return 1;\r
+       Inode_UncacheNode(disk->CacheID, Node->Inode);\r
+       return ;\r
 }\r
 \r
 /**\r
@@ -305,8 +312,6 @@ char *Ext2_ReadDir(tVFS_Node *Node, int Pos)
         int    block = 0, ofs = 0;\r
         int    entNum = 0;\r
        tExt2_Disk      *disk = Node->ImplPtr;\r
-       Uint64  vfsInode = 0;\r
-       tVFS_Node       *retNode;\r
        Uint    size;\r
        \r
        ENTER("pNode iPos", Node, Pos);\r
@@ -323,7 +328,7 @@ char *Ext2_ReadDir(tVFS_Node *Node, int Pos)
        Base = inode.i_block[0] * disk->BlockSize;\r
        while(Pos -- && size > 0)\r
        {\r
-               VFS_ReadAt( disk->fd, Base+ofs, sizeof(tExt2_DirEnt), &dirent);\r
+               VFS_ReadAt( disk->FD, Base+ofs, sizeof(tExt2_DirEnt), &dirent);\r
                ofs += dirent.rec_len;\r
                size -= dirent.rec_len;\r
                entNum ++;\r
@@ -331,8 +336,8 @@ char *Ext2_ReadDir(tVFS_Node *Node, int Pos)
                if(ofs >= disk->BlockSize) {\r
                        block ++;\r
                        if( ofs > disk->BlockSize ) {\r
-                               Warning("[EXT2] Directory Entry %i of inode %i ('%s') extends over a block boundary, ignoring\n",\r
-                                       entNum-1, Node->impl, Node->name);\r
+                               Warning("[EXT2] Directory Entry %i of inode %i extends over a block boundary, ignoring\n",\r
+                                       entNum-1, Node->Inode);\r
                        }\r
                        ofs = 0;\r
                        Base = Ext2_int_GetBlockAddr( disk, inode.i_block, block );\r
@@ -342,17 +347,17 @@ char *Ext2_ReadDir(tVFS_Node *Node, int Pos)
        if(size <= 0)   return NULL;\r
        \r
        // Read Entry\r
-       VFS_ReadAt( disk->fd, Base+ofs, sizeof(tExt2_DirEnt), &dirent );\r
+       VFS_ReadAt( disk->FD, Base+ofs, sizeof(tExt2_DirEnt), &dirent );\r
        //LOG(" Ext2_ReadDir: dirent.inode = %i\n", dirent.inode);\r
        //LOG(" Ext2_ReadDir: dirent.rec_len = %i\n", dirent.rec_len);\r
        //LOG(" Ext2_ReadDir: dirent.name_len = %i\n", dirent.name_len);\r
-       VFS_ReadAt( disk->fd, Base+ofs+sizeof(tExt2_DirEnt), dirent.name_len, namebuf );\r
+       VFS_ReadAt( disk->FD, Base+ofs+sizeof(tExt2_DirEnt), dirent.name_len, namebuf );\r
        namebuf[ dirent.name_len ] = '\0';      // Cap off string\r
        \r
        \r
        // Ignore . and .. (these are done in the VFS)\r
        if( (namebuf[0] == '.' && namebuf[1] == '\0')\r
-       ||  (namebuf[0] == '.' && namebuf[1] == '.' && namebuf[2]=='\0'))\r
+       ||  (namebuf[0] == '.' && namebuf[1] == '.' && namebuf[2]=='\0')) {\r
                LEAVE('p', VFS_SKIP);\r
                return VFS_SKIP;        // Skip\r
        }\r
@@ -390,8 +395,8 @@ tVFS_Node *Ext2_FindDir(tVFS_Node *Node, char *Filename)
        // Find File\r
        while(size > 0)\r
        {\r
-               VFS_ReadAt( disk->fd, Base+ofs, sizeof(tExt2_DirEnt), &dirent);\r
-               VFS_ReadAt( disk->fd, Base+ofs+sizeof(tExt2_DirEnt), dirent.name_len, namebuf );\r
+               VFS_ReadAt( disk->FD, Base+ofs, sizeof(tExt2_DirEnt), &dirent);\r
+               VFS_ReadAt( disk->FD, Base+ofs+sizeof(tExt2_DirEnt), dirent.name_len, namebuf );\r
                namebuf[ dirent.name_len ] = '\0';      // Cap off string\r
                // If it matches, create a node and return it\r
                if(strcmp(namebuf, Filename) == 0)\r
@@ -405,8 +410,8 @@ tVFS_Node *Ext2_FindDir(tVFS_Node *Node, char *Filename)
                if(ofs >= disk->BlockSize) {\r
                        block ++;\r
                        if( ofs > disk->BlockSize ) {\r
-                               Warnin("[EXT2 ] Directory Entry %i of inode %i ('%s') extends over a block boundary, ignoring\n",\r
-                                       entNum-1, Node->impl, Node->name);\r
+                               Warning("[EXT2 ] Directory Entry %i of inode %i extends over a block boundary, ignoring\n",\r
+                                       entNum-1, Node->Inode);\r
                        }\r
                        ofs = 0;\r
                        Base = Ext2_int_GetBlockAddr( disk, inode.i_block, block );\r
@@ -417,10 +422,10 @@ tVFS_Node *Ext2_FindDir(tVFS_Node *Node, char *Filename)
 }\r
 \r
 /**\r
- * \fn tVFS_Node *Ext2_MkNod(tVFS_Node *Parent, char *Name, int Flags)\r
+ * \fn int Ext2_MkNod(tVFS_Node *Parent, char *Name, Uint Flags)\r
  * \brief Create a new node\r
  */\r
-tVFS_Node *Ext2_MkNod(tVFS_Node *Parent, char *Name, int Flags)\r
+int Ext2_MkNod(tVFS_Node *Parent, char *Name, Uint Flags)\r
 {\r
        return 0;\r
 }\r
@@ -455,7 +460,7 @@ tVFS_Node *Ext2_int_CreateNode(tExt2_Disk *Disk, Uint InodeID, char *Name)
        if( !Ext2_int_ReadInode(Disk, InodeID, &inode) )\r
                return NULL;\r
        \r
-       if( (tmpNode = inode_getCache(Disk->CacheID, InodeID)) )\r
+       if( (tmpNode = Inode_GetCache(Disk->CacheID, InodeID)) )\r
                return tmpNode;\r
        \r
        \r
@@ -485,11 +490,11 @@ tVFS_Node *Ext2_int_CreateNode(tExt2_Disk *Disk, Uint InodeID, char *Name)
                break;\r
        // Regular File\r
        case EXT2_S_IFREG:\r
-               retNode.flags = 0;\r
+               retNode.Flags = 0;\r
                break;\r
        // Directory\r
        case EXT2_S_IFDIR:\r
-               retNode.ReadRir = Ext2_ReadDir;\r
+               retNode.ReadDir = Ext2_ReadDir;\r
                retNode.FindDir = Ext2_FindDir;\r
                retNode.MkNod = Ext2_MkNod;\r
                //retNode.Relink = Ext2_Relink;\r
@@ -497,12 +502,12 @@ tVFS_Node *Ext2_int_CreateNode(tExt2_Disk *Disk, Uint InodeID, char *Name)
                break;\r
        // Unknown, Write protect and hide it to be safe \r
        default:\r
-               retNode.flags = VFS_FFLAG_READONLY|VFS_FFLAG_HIDDEN;\r
+               retNode.Flags = VFS_FFLAG_READONLY;//|VFS_FFLAG_HIDDEN;\r
                break;\r
        }\r
        \r
        // Check if the file should be hidden\r
-       if(Name[0] == '.')      retNode.Flags |= VFS_FFLAG_HIDDEN;\r
+       //if(Name[0] == '.')    retNode.Flags |= VFS_FFLAG_HIDDEN;\r
        \r
        // Set Timestamps\r
        retNode.ATime = now();\r
@@ -532,11 +537,11 @@ int Ext2_int_ReadInode(tExt2_Disk *Disk, Uint InodeId, tExt2_Inode *Inode)
        \r
        //LogF(" Ext2_int_ReadInode: group=%i, subId = %i\n", group, subId);\r
        \r
-       //Seek to Block - Absolute\r
-       vfs_seek(Disk->fd, Disk->Groups[group].bg_inode_table * Disk->BlockSize, SEEK_SET);\r
-       //Seeek to inode - Relative\r
-       vfs_seek(Disk->fd, sizeof(tExt2_Inode)*subId, SEEK_CUR);\r
-       vfs_read(Disk->fd, sizeof(tExt2_Inode), Inode);\r
+       // Read Inode\r
+       VFS_ReadAt(Disk->FD,\r
+               Disk->Groups[group].bg_inode_table * Disk->BlockSize + sizeof(tExt2_Inode)*subId,\r
+               sizeof(tExt2_Inode),\r
+               Inode);\r
        return 1;\r
 }\r
 \r
@@ -556,7 +561,7 @@ Uint64 Ext2_int_GetBlockAddr(tExt2_Disk *Disk, Uint32 *Blocks, int BlockNum)
        \r
        // Single Indirect Blocks\r
        iBlocks = malloc( Disk->BlockSize );\r
-       VFS_ReadAt(Disk->fd, (Uint64)Blocks[12]*Disk->BlockSize, Disk->BlockSize, iBlocks);\r
+       VFS_ReadAt(Disk->FD, (Uint64)Blocks[12]*Disk->BlockSize, Disk->BlockSize, iBlocks);\r
        \r
        BlockNum -= 12;\r
        if(BlockNum < 256) {\r
@@ -568,16 +573,16 @@ Uint64 Ext2_int_GetBlockAddr(tExt2_Disk *Disk, Uint32 *Blocks, int BlockNum)
        // Double Indirect Blocks\r
        if(BlockNum < 256*256)\r
        {\r
-               VFS_ReadAt(Disk->fd, (Uint64)Blocks[13]*Disk->BlockSize, Disk->BlockSize, iBlocks);\r
-               VFS_ReadAt(Disk->fd, (Uint64)iBlocks[BlockNum/256]*Disk->BlockSize, Disk->BlockSize, iBlocks);\r
+               VFS_ReadAt(Disk->FD, (Uint64)Blocks[13]*Disk->BlockSize, Disk->BlockSize, iBlocks);\r
+               VFS_ReadAt(Disk->FD, (Uint64)iBlocks[BlockNum/256]*Disk->BlockSize, Disk->BlockSize, iBlocks);\r
                BlockNum = iBlocks[BlockNum%256];\r
                free(iBlocks);\r
                return (Uint64)BlockNum * Disk->BlockSize;\r
        }\r
        // Triple Indirect Blocks\r
-       VFS_ReadAt(Disk->fd, (Uint64)Blocks[14]*Disk->BlockSize, Disk->BlockSize, iBlocks);\r
-       VFS_ReadAt(Disk->fd, (Uint64)iBlocks[BlockNum/(256*256)]*Disk->BlockSize, Disk->BlockSize, iBlocks);\r
-       VFS_ReadAt(Disk->fd, (Uint64)iBlocks[(BlockNum/256)%256]*Disk->BlockSize, Disk->BlockSize, iBlocks);\r
+       VFS_ReadAt(Disk->FD, (Uint64)Blocks[14]*Disk->BlockSize, Disk->BlockSize, iBlocks);\r
+       VFS_ReadAt(Disk->FD, (Uint64)iBlocks[BlockNum/(256*256)]*Disk->BlockSize, Disk->BlockSize, iBlocks);\r
+       VFS_ReadAt(Disk->FD, (Uint64)iBlocks[(BlockNum/256)%256]*Disk->BlockSize, Disk->BlockSize, iBlocks);\r
        BlockNum = iBlocks[BlockNum%256];\r
        free(iBlocks);\r
        return (Uint64)BlockNum * Disk->BlockSize;\r

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