3 * Ext2 Driver Version 1
7 * \brief Second Extended Filesystem Driver
8 * \todo Implement file full write support
12 #include "ext2_common.h"
15 Uint64 Ext2_Read(tVFS_Node *node, Uint64 offset, Uint64 length, void *buffer);
16 int Ext2_int_ReadInode(tExt2_Disk *Disk, Uint InodeId, tExt2_Inode *Inode);
20 * \fn Uint64 Ext2_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
21 * \brief Read from a file
23 Uint64 Ext2_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
25 tExt2_Disk *disk = Node->ImplPtr;
31 ENTER("pNode XOffset XLength pBuffer", Node, Offset, Length, Buffer);
34 Ext2_int_GetInode(Node, &inode);
37 if(Offset >= inode.i_size) {
41 if(Offset + Length > inode.i_size)
42 Length = inode.i_size - Offset;
44 block = Offset / disk->BlockSize;
45 Offset = Offset / disk->BlockSize;
46 base = Ext2_int_GetBlockAddr(disk, inode.i_block, block);
48 Warning("[EXT2 ] NULL Block Detected in INode 0x%llx", Node->Inode);
54 if(Length <= disk->BlockSize - Offset)
56 VFS_ReadAt( disk->FD, base+Offset, Length, Buffer);
63 VFS_ReadAt( disk->FD, base + Offset, disk->BlockSize - Offset, Buffer);
64 remLen -= disk->BlockSize - Offset;
65 Buffer += disk->BlockSize - Offset;
69 while(remLen > disk->BlockSize)
71 base = Ext2_int_GetBlockAddr(disk, inode.i_block, block);
73 Warning("[EXT2 ] NULL Block Detected in INode 0x%llx", Node->Inode);
77 VFS_ReadAt( disk->FD, base, disk->BlockSize, Buffer);
78 Buffer += disk->BlockSize;
79 remLen -= disk->BlockSize;
84 base = Ext2_int_GetBlockAddr(disk, inode.i_block, block);
85 VFS_ReadAt( disk->FD, base, remLen, Buffer);