aboutsummaryrefslogtreecommitdiff
path: root/kernel/src/filesystem/ext2
diff options
context:
space:
mode:
authorLukas Oesch <lukasoesch20@gmail.com>2026-05-13 10:14:21 +0200
committerLukas Oesch <lukasoesch20@gmail.com>2026-05-13 10:14:21 +0200
commitde0ef46e7bab75d0ab94f02d569df62e2b4281f2 (patch)
treedd68ef1d3a1ce9288f757ace1cebfd32e2ab66a3 /kernel/src/filesystem/ext2
parentd061f31f33feccb4203979c6e8d9bbaeabecb453 (diff)
downloadkernel-de0ef46e7bab75d0ab94f02d569df62e2b4281f2.tar.xz
kernel-de0ef46e7bab75d0ab94f02d569df62e2b4281f2.zip
implement sparse files, fix bug with reading more than inode size
Diffstat (limited to 'kernel/src/filesystem/ext2')
-rw-r--r--kernel/src/filesystem/ext2/inode.cpp22
1 files changed, 14 insertions, 8 deletions
diff --git a/kernel/src/filesystem/ext2/inode.cpp b/kernel/src/filesystem/ext2/inode.cpp
index 303838e..cfe0a35 100644
--- a/kernel/src/filesystem/ext2/inode.cpp
+++ b/kernel/src/filesystem/ext2/inode.cpp
@@ -40,23 +40,29 @@ namespace kernel::filesystem::ext2
auto bytes_read = 0uz;
- while (bytes_read < size)
+ while (bytes_read < requested_size)
{
auto const block_number = m_filesystem->map_inode_block_index_to_global_block_number(block_index, m_data);
- // TODO BA-FS26 really correct? sparse files -> 0 means a full block with zeros --> function
- // map_inode_block_index_to_global_block_number should return 0 if not possible to find an block
- if (block_number == 0)
+ if (block_number == -1)
{
break;
}
- auto const block_start_offset = block_number * m_filesystem->get_block_size();
- auto const read_offset = block_start_offset + in_block_offset;
auto const bytes_to_read =
std::min(requested_size - bytes_read, m_filesystem->get_block_size() - in_block_offset);
+ if (block_number == 0)
+ {
+ kstd::libc::memset(static_cast<uint8_t *>(buffer) + bytes_read, 0, bytes_to_read);
+ bytes_read += bytes_to_read;
+ }
+ else
+ {
+ auto const block_start_offset = block_number * m_filesystem->get_block_size();
+ auto const read_offset = block_start_offset + in_block_offset;
- bytes_read +=
- m_filesystem->backing_inode()->read(static_cast<uint8_t *>(buffer) + bytes_read, read_offset, bytes_to_read);
+ bytes_read += m_filesystem->backing_inode()->read(static_cast<uint8_t *>(buffer) + bytes_read, read_offset,
+ bytes_to_read);
+ }
block_index++;
in_block_offset = 0; // After the first block, we always start at the beginning of the block