3 * Ext2 Driver Version 1
7 * \brief Second Extended Filesystem Driver
8 * \todo Implement file full write support
12 #include "ext2_common.h"
16 * \brief Read from a file
18 size_t Ext2_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer, Uint Flags)
20 tExt2_Disk *disk = Node->ImplPtr;
26 ENTER("pNode XOffset XLength pBuffer", Node, Offset, Length, Buffer);
29 Ext2_int_ReadInode(disk, Node->Inode, &inode);
32 if(Offset >= inode.i_size) {
36 if(Offset + Length > inode.i_size)
37 Length = inode.i_size - Offset;
39 block = Offset / disk->BlockSize;
40 Offset = Offset / disk->BlockSize;
41 base = Ext2_int_GetBlockAddr(disk, inode.i_block, block);
43 Warning("[EXT2 ] NULL Block Detected in INode 0x%llx", Node->Inode);
49 if(Length <= disk->BlockSize - Offset)
51 VFS_ReadAt( disk->FD, base+Offset, Length, Buffer);
57 // TODO: If (Flags & VFS_IOFLAG_NOBLOCK) trigger read and return EWOULDBLOCK?
59 VFS_ReadAt( disk->FD, base + Offset, disk->BlockSize - Offset, Buffer);
60 remLen -= disk->BlockSize - Offset;
61 Buffer += disk->BlockSize - Offset;
65 while(remLen > disk->BlockSize)
67 base = Ext2_int_GetBlockAddr(disk, inode.i_block, block);
69 Log_Warning("EXT2", "NULL Block Detected in INode 0x%llx", Node->Inode);
73 VFS_ReadAt( disk->FD, base, disk->BlockSize, Buffer);
74 Buffer += disk->BlockSize;
75 remLen -= disk->BlockSize;
80 base = Ext2_int_GetBlockAddr(disk, inode.i_block, block);
81 VFS_ReadAt( disk->FD, base, remLen, Buffer);