From 746f0bf813dd02cbcb5a580f69cfc892dd04cb8c Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Mon, 24 Aug 2026 17:15:04 +0200 Subject: kernel/fs: ext2: retype block I/O operations --- kernel/kernel/filesystem/ext2/filesystem.cpp | 62 +++++++++++++++------------- kernel/kernel/filesystem/ext2/filesystem.hpp | 6 ++- 2 files changed, 38 insertions(+), 30 deletions(-) (limited to 'kernel') diff --git a/kernel/kernel/filesystem/ext2/filesystem.cpp b/kernel/kernel/filesystem/ext2/filesystem.cpp index a9d75743..bc935e0f 100644 --- a/kernel/kernel/filesystem/ext2/filesystem.cpp +++ b/kernel/kernel/filesystem/ext2/filesystem.cpp @@ -178,7 +178,7 @@ namespace kernel::filesystem::ext2 return kstd::failure(global_block_number.error()); } - if (auto result = read_block(*global_block_number, buffer.data(), *mount_state); !result) + if (auto result = read_block(*global_block_number, buffer, *mount_state); !result) { return kstd::failure(result.error()); } @@ -304,6 +304,30 @@ namespace kernel::filesystem::ext2 return inode.data().blocks / (2 << state.superblock.log_block_size); } + auto filesystem::read_block(uint32_t block_number, std::span buffer, mount_state const & state) const + -> kstd::result + { + if (buffer.size() < block_size(state).value) + { + return kstd::failure(vfs_errc::invalid_argument); + } + + auto const block_offset = static_cast(block_number) * block_size(state); + return state.backing_inode->read(buffer, block_offset); + } + + auto filesystem::write_block(uint32_t block_number, std::span buffer, mount_state & state) + -> kstd::result + { + if (buffer.size() < block_size(state).value) + { + return kstd::failure(vfs_errc::invalid_argument); + } + + auto const block_offset = static_cast(block_number) * block_size(state); + return state.backing_inode->write(buffer, block_offset); + } + auto filesystem::indirect_levels(mount_state const & state) const -> std::array { return { @@ -325,7 +349,7 @@ namespace kernel::filesystem::ext2 } auto buffer = kstd::vector{block_size(state).value}; - if (auto result = read_block(*global_block, buffer.data(), state); !result) + if (auto result = read_block(*global_block, buffer, state); !result) { return kstd::failure(result.error()); } @@ -368,7 +392,7 @@ namespace kernel::filesystem::ext2 auto remainder = block_size(state) - entry_offset; (*entry)->rec_len = remainder.value; - return global_block.and_then([&](auto block_number) { return write_block(block_number, buffer.data(), state); }) + return global_block.and_then([&](auto block_number) { return write_block(block_number, buffer, state); }) .transform([](auto) {}); } else @@ -396,8 +420,8 @@ namespace kernel::filesystem::ext2 auto remainder = block_size(state); (*entry)->rec_len = remainder.value; - if (auto result = new_global_block.and_then( - [&](auto block_number) { return write_block(block_number, buffer.data(), state); }); + if (auto result = + new_global_block.and_then([&](auto block_number) { return write_block(block_number, buffer, state); }); !result) { return kstd::failure(result.error()); @@ -446,7 +470,7 @@ namespace kernel::filesystem::ext2 return write_inode(parent.number(), parent_inode_data, state) .and_then([&]() { return global_block; }) - .and_then([&](auto block_number) { return write_block(block_number, buffer.data(), state); }) + .and_then([&](auto block_number) { return write_block(block_number, buffer, state); }) .transform([](auto) {}); } @@ -567,7 +591,7 @@ namespace kernel::filesystem::ext2 } auto block_bitmap = kstd::vector{block_size(state).value}; - if (auto read_result = read_block(block_group_descriptor.block_bitmap, block_bitmap.data(), state); !read_result) + if (auto read_result = read_block(block_group_descriptor.block_bitmap, block_bitmap, state); !read_result) { return kstd::failure(read_result.error()); } @@ -589,8 +613,7 @@ namespace kernel::filesystem::ext2 if (is_bitmap_dirty) { - if (auto write_result = write_block(block_group_descriptor.block_bitmap, block_bitmap.data(), state); - !write_result) + if (auto write_result = write_block(block_group_descriptor.block_bitmap, block_bitmap, state); !write_result) { return kstd::failure(write_result.error()); } @@ -641,7 +664,7 @@ namespace kernel::filesystem::ext2 } auto inode_bitmap = kstd::vector{block_size(state).value}; - if (auto read_result = read_block(block_group_descriptor.inode_bitmap, inode_bitmap.data(), state); !read_result) + if (auto read_result = read_block(block_group_descriptor.inode_bitmap, inode_bitmap, state); !read_result) { return kstd::failure(read_result.error()); } @@ -654,8 +677,7 @@ namespace kernel::filesystem::ext2 block_group_descriptor.free_inodes_count--; superblock.free_inodes_count--; - if (auto write_result = write_block(block_group_descriptor.inode_bitmap, inode_bitmap.data(), state); - !write_result) + if (auto write_result = write_block(block_group_descriptor.inode_bitmap, inode_bitmap, state); !write_result) { return kstd::failure(write_result.error()); } @@ -834,22 +856,6 @@ namespace kernel::filesystem::ext2 return kstd::success(); } - auto filesystem::read_block(uint32_t block_number, void * buffer, mount_state const & state) const - -> kstd::result - { - auto const block_offset = static_cast(block_number) * block_size(state); - return state.backing_inode->read(std::span{static_cast(buffer), block_size(state).value}, - block_offset); - } - - auto filesystem::write_block(uint32_t block_number, void const * buffer, mount_state & state) - -> kstd::result - { - auto const block_offset = static_cast(block_number) * block_size(state); - return state.backing_inode->write(std::span{static_cast(buffer), block_size(state).value}, - block_offset); - } - auto filesystem::write_block_group_descriptor(block_group_descriptor const & block_group_descriptor, size_t block_group_descriptor_index, mount_state const & state) const -> kstd::result diff --git a/kernel/kernel/filesystem/ext2/filesystem.hpp b/kernel/kernel/filesystem/ext2/filesystem.hpp index bb1e8e84..e98dabde 100644 --- a/kernel/kernel/filesystem/ext2/filesystem.hpp +++ b/kernel/kernel/filesystem/ext2/filesystem.hpp @@ -137,7 +137,8 @@ namespace kernel::filesystem::ext2 //! @param buffer The buffer to read the block data into. //! @param state The state to operate on. //! @return The number of bytes read. - auto read_block(uint32_t block_number, void * buffer, mount_state const & state) const -> kstd::result; + [[nodiscard]] auto read_block(uint32_t block_number, std::span buffer, mount_state const & state) const + -> kstd::result; //! Write a block of data from the provided buffer to the backing inode. //! @@ -145,7 +146,8 @@ namespace kernel::filesystem::ext2 //! @param buffer The buffer containing the data to write. //! @param state The state to operate on. //! @return The number of bytes written. - auto write_block(uint32_t block_number, void const * buffer, mount_state & state) -> kstd::result; + [[nodiscard]] auto write_block(uint32_t block_number, std::span buffer, mount_state & state) + -> kstd::result; //! @} -- cgit v1.2.3