diff options
Diffstat (limited to 'kernel/kernel/filesystem/ext2/inode.cpp')
| -rw-r--r-- | kernel/kernel/filesystem/ext2/inode.cpp | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/kernel/kernel/filesystem/ext2/inode.cpp b/kernel/kernel/filesystem/ext2/inode.cpp index 2484d2f5..83db6ec6 100644 --- a/kernel/kernel/filesystem/ext2/inode.cpp +++ b/kernel/kernel/filesystem/ext2/inode.cpp @@ -105,8 +105,6 @@ namespace kernel::filesystem::ext2 } } - // TODO update inode size, ... - auto block_index = offset / m_filesystem->block_size(); auto in_block_offset = offset % m_filesystem->block_size(); @@ -136,7 +134,13 @@ namespace kernel::filesystem::ext2 bytes_written += write_result.value(); block_index++; - in_block_offset = 0; // After the first block, we always start at the beginning of the block + in_block_offset = 0; + } + + set_size(std::max(this->size(), offset + bytes_written)); + if (auto write_result = m_filesystem->write_inode(m_inode_number, m_data); !write_result) + { + return kstd::failure(write_result.error()); } return bytes_written; @@ -159,7 +163,7 @@ namespace kernel::filesystem::ext2 } m_filesystem->update_inode_block_count(m_data, count); - return m_filesystem->write_inode(m_inode_number, m_data).has_value(); + return true; } [[nodiscard]] auto inode::data() const -> inode_data const & @@ -194,4 +198,13 @@ namespace kernel::filesystem::ext2 return size; } + auto inode::set_size(uint64_t new_size) -> void + { + if (m_filesystem->revision_level() > constants::good_old_revision && is_regular()) + { + m_data.dir_acl = static_cast<uint32_t>(new_size >> 32); + } + m_data.size = static_cast<uint32_t>(new_size); + } + } // namespace kernel::filesystem::ext2 |
