aboutsummaryrefslogtreecommitdiff
path: root/kernel/kernel/filesystem/ext2/inode.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/kernel/filesystem/ext2/inode.cpp')
-rw-r--r--kernel/kernel/filesystem/ext2/inode.cpp25
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;