diff options
| author | Felix Morgner <felix.morgner@ost.ch> | 2026-08-26 09:41:27 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@ost.ch> | 2026-08-26 11:16:17 +0200 |
| commit | 0af6ccea26ede3372d0ecf82c1e67c13145f20c1 (patch) | |
| tree | 10798d21e457afa07646c73b43e6357148d6b565 /kernel/kernel/filesystem/ext2/inode.cpp | |
| parent | 660c4548f2da83b938fba88e39020eae2796dc0e (diff) | |
| download | kernel-0af6ccea26ede3372d0ecf82c1e67c13145f20c1.tar.xz kernel-0af6ccea26ede3372d0ecf82c1e67c13145f20c1.zip | |
kernel/fs: ext2: introduce write batching
Diffstat (limited to 'kernel/kernel/filesystem/ext2/inode.cpp')
| -rw-r--r-- | kernel/kernel/filesystem/ext2/inode.cpp | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/kernel/kernel/filesystem/ext2/inode.cpp b/kernel/kernel/filesystem/ext2/inode.cpp index 34452ac8..56174638 100644 --- a/kernel/kernel/filesystem/ext2/inode.cpp +++ b/kernel/kernel/filesystem/ext2/inode.cpp @@ -1,8 +1,10 @@ #include <kernel/filesystem/ext2/inode.hpp> #include <kernel/filesystem/error.hpp> +#include <kernel/filesystem/ext2/error.hpp> #include <kernel/filesystem/ext2/filesystem.hpp> #include <kernel/filesystem/ext2/mount_state.hpp> +#include <kernel/filesystem/ext2/write_batch.hpp> #include <kernel/filesystem/inode.hpp> #include <kernel/filesystem/mount.hpp> @@ -136,15 +138,16 @@ namespace kernel::filesystem::ext2 auto const current_block_count = (*filesystem)->block_count(*this, **state); auto const max_new_inode_size_without_new_blocks = current_block_count * block_size; + auto batch = write_batch{**filesystem, **state}; + if (new_inode_size > max_new_inode_size_without_new_blocks) { auto const additional_blocks_needed = (new_inode_size - max_new_inode_size_without_new_blocks + block_size - 1_B) / block_size; - if (!append_blocks(additional_blocks_needed)) + if (!append_blocks(additional_blocks_needed, batch)) { - // TODO handle out of space - kapi::system::panic("[EXT2] Failed to allocate blocks for inode write"); + return kstd::failure(ext2_errc::not_enough_free_blocks); } } @@ -181,11 +184,7 @@ namespace kernel::filesystem::ext2 } set_size(std::max(this->size(), offset + bytes_written)); - if (auto write_result = (*filesystem)->write_inode(m_inode_number, m_data, **state); !write_result) - { - return kstd::failure(write_result.error()); - } - + batch.mark_inode(*this); return bytes_written; } @@ -245,7 +244,7 @@ namespace kernel::filesystem::ext2 return result; } - auto inode::append_blocks(size_t count) -> bool + auto inode::append_blocks(size_t count, write_batch & batch) -> bool { auto filesystem = get_filesystem(); if (!filesystem) @@ -259,7 +258,7 @@ namespace kernel::filesystem::ext2 return false; } - auto new_blocks = (*filesystem)->allocate_blocks(count, **state); + auto new_blocks = (*filesystem)->allocate_blocks(count, **state, batch); if (!new_blocks) { return false; @@ -270,9 +269,9 @@ namespace kernel::filesystem::ext2 auto const block_index = (*filesystem)->block_count(*this, **state) + i; auto const global_block_number = new_blocks->at(i); - if (auto write_result = - (*filesystem) - ->write_global_block_number_to_inode_block_index(block_index, m_data, global_block_number, **state); + if (auto write_result = (*filesystem) + ->write_global_block_number_to_inode_block_index(block_index, m_data, + global_block_number, **state, batch); !write_result) { return false; |
