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.cpp21
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