diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/kernel/filesystem/ext2/filesystem.cpp | 62 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/ext2/filesystem.hpp | 6 |
2 files changed, 38 insertions, 30 deletions
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<std::byte> buffer, mount_state const & state) const + -> kstd::result<kstd::bytes> + { + if (buffer.size() < block_size(state).value) + { + return kstd::failure(vfs_errc::invalid_argument); + } + + auto const block_offset = static_cast<size_t>(block_number) * block_size(state); + return state.backing_inode->read(buffer, block_offset); + } + + auto filesystem::write_block(uint32_t block_number, std::span<std::byte const> buffer, mount_state & state) + -> kstd::result<kstd::bytes> + { + if (buffer.size() < block_size(state).value) + { + return kstd::failure(vfs_errc::invalid_argument); + } + + auto const block_offset = static_cast<size_t>(block_number) * block_size(state); + return state.backing_inode->write(buffer, block_offset); + } + auto filesystem::indirect_levels(mount_state const & state) const -> std::array<indirect_level, 3> { return { @@ -325,7 +349,7 @@ namespace kernel::filesystem::ext2 } auto buffer = kstd::vector<std::byte>{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<std::byte>{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<std::byte>{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<kstd::bytes> - { - auto const block_offset = static_cast<size_t>(block_number) * block_size(state); - return state.backing_inode->read(std::span{static_cast<std::byte *>(buffer), block_size(state).value}, - block_offset); - } - - auto filesystem::write_block(uint32_t block_number, void const * buffer, mount_state & state) - -> kstd::result<kstd::bytes> - { - auto const block_offset = static_cast<size_t>(block_number) * block_size(state); - return state.backing_inode->write(std::span{static_cast<std::byte const *>(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<void> 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<kstd::bytes>; + [[nodiscard]] auto read_block(uint32_t block_number, std::span<std::byte> buffer, mount_state const & state) const + -> kstd::result<kstd::bytes>; //! 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<kstd::bytes>; + [[nodiscard]] auto write_block(uint32_t block_number, std::span<std::byte const> buffer, mount_state & state) + -> kstd::result<kstd::bytes>; //! @} |
