aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/kernel/filesystem/ext2/filesystem.cpp62
-rw-r--r--kernel/kernel/filesystem/ext2/filesystem.hpp6
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>;
//! @}