X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FModules%2FFilesystems%2FExt2%2Fread.c;h=76ee993918dbe54273e30d712d65c701f5ccbfeb;hb=1100f7207b40fef763f353d8a0b4c798253cc2d9;hp=81f5ee64fec7cc3ef3cefbf3601d154965929b87;hpb=51ab5f489bc356940c95cc936fd0508e8f07ea97;p=tpg%2Facess2.git diff --git a/KernelLand/Modules/Filesystems/Ext2/read.c b/KernelLand/Modules/Filesystems/Ext2/read.c index 81f5ee64..76ee9939 100644 --- a/KernelLand/Modules/Filesystems/Ext2/read.c +++ b/KernelLand/Modules/Filesystems/Ext2/read.c @@ -7,44 +7,37 @@ * \brief Second Extended Filesystem Driver * \todo Implement file full write support */ -#define DEBUG 1 +#define DEBUG 0 #define VERBOSE 0 #include "ext2_common.h" -// === PROTOTYPES === -Uint64 Ext2_Read(tVFS_Node *node, Uint64 offset, Uint64 length, void *buffer); - // === CODE === /** - * \fn Uint64 Ext2_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) * \brief Read from a file */ -Uint64 Ext2_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) +size_t Ext2_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer, Uint Flags) { tExt2_Disk *disk = Node->ImplPtr; - tExt2_Inode inode; + tExt2_Inode *inode = (void*)(Node+1); Uint64 base; Uint block; Uint64 remLen; - ENTER("pNode XOffset XLength pBuffer", Node, Offset, Length, Buffer); - - // Get Inode - Ext2_int_ReadInode(disk, Node->Inode, &inode); + ENTER("pNode XOffset xLength pBuffer", Node, Offset, Length, Buffer); // Sanity Checks - if(Offset >= inode.i_size) { + if(Offset >= inode->i_size) { LEAVE('i', 0); return 0; } - if(Offset + Length > inode.i_size) - Length = inode.i_size - Offset; + if(Offset + Length > inode->i_size) + Length = inode->i_size - Offset; block = Offset / disk->BlockSize; - Offset = Offset / disk->BlockSize; - base = Ext2_int_GetBlockAddr(disk, inode.i_block, block); + Offset = Offset % disk->BlockSize; + base = Ext2_int_GetBlockAddr(disk, inode->i_block, block); if(base == 0) { - Warning("[EXT2 ] NULL Block Detected in INode 0x%llx", Node->Inode); + Log_Warning("EXT2", "NULL Block Detected in INode 0x%llx (Block %i)", Node->Inode, block); LEAVE('i', 0); return 0; } @@ -58,6 +51,7 @@ Uint64 Ext2_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) } // Read first block + // TODO: If (Flags & VFS_IOFLAG_NOBLOCK) trigger read and return EWOULDBLOCK? remLen = Length; VFS_ReadAt( disk->FD, base + Offset, disk->BlockSize - Offset, Buffer); remLen -= disk->BlockSize - Offset; @@ -67,9 +61,9 @@ Uint64 Ext2_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) // Read middle blocks while(remLen > disk->BlockSize) { - base = Ext2_int_GetBlockAddr(disk, inode.i_block, block); + base = Ext2_int_GetBlockAddr(disk, inode->i_block, block); if(base == 0) { - Warning("[EXT2 ] NULL Block Detected in INode 0x%llx", Node->Inode); + Log_Warning("EXT2", "NULL Block Detected in INode 0x%llx", Node->Inode); LEAVE('i', 0); return 0; } @@ -80,7 +74,7 @@ Uint64 Ext2_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) } // Read last block - base = Ext2_int_GetBlockAddr(disk, inode.i_block, block); + base = Ext2_int_GetBlockAddr(disk, inode->i_block, block); VFS_ReadAt( disk->FD, base, remLen, Buffer); LEAVE('X', Length);