X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FModules%2FFilesystems%2FExt2%2Fread.c;h=76ee993918dbe54273e30d712d65c701f5ccbfeb;hb=1100f7207b40fef763f353d8a0b4c798253cc2d9;hp=6244d9dc42d11effcfa475ee340a3139030e8905;hpb=880dd63bfcba522dab0a75cc63fdec1d04ff8c89;p=tpg%2Facess2.git diff --git a/KernelLand/Modules/Filesystems/Ext2/read.c b/KernelLand/Modules/Filesystems/Ext2/read.c index 6244d9dc..76ee9939 100644 --- a/KernelLand/Modules/Filesystems/Ext2/read.c +++ b/KernelLand/Modules/Filesystems/Ext2/read.c @@ -7,7 +7,7 @@ * \brief Second Extended Filesystem Driver * \todo Implement file full write support */ -#define DEBUG 1 +#define DEBUG 0 #define VERBOSE 0 #include "ext2_common.h" @@ -15,32 +15,29 @@ /** * \brief Read from a file */ -size_t Ext2_Read(tVFS_Node *Node, off_t Offset, size_t 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; } @@ -54,6 +51,7 @@ size_t Ext2_Read(tVFS_Node *Node, off_t Offset, size_t 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; @@ -63,9 +61,9 @@ size_t Ext2_Read(tVFS_Node *Node, off_t Offset, size_t 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; } @@ -76,7 +74,7 @@ size_t Ext2_Read(tVFS_Node *Node, off_t Offset, size_t 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);