aboutsummaryrefslogtreecommitdiff
path: root/kernel/src/filesystem/ext2/inode.cpp
diff options
context:
space:
mode:
authorLukas Oesch <lukas.oesch@ost.ch>2026-05-12 14:49:08 +0200
committerLukas Oesch <lukas.oesch@ost.ch>2026-05-12 14:49:08 +0200
commit9d77ac6e5ae36be07b80d49080d017b19acfa02a (patch)
tree6da40a47f43e7a038ad92ebe1f832646a83dec12 /kernel/src/filesystem/ext2/inode.cpp
parent92994a0c662e19bc94a06a544520e8a48bf8f11e (diff)
parent7b1e578480f2f522fe39a742e688012a7f5ea4ed (diff)
downloadkernel-9d77ac6e5ae36be07b80d49080d017b19acfa02a.tar.xz
kernel-9d77ac6e5ae36be07b80d49080d017b19acfa02a.zip
Merge branch 'refactor-ext2-inode-size' into 'develop-BA-FS26'
Determine ext2 inode size depending on revision level, add const to several methods See merge request teachos/kernel!34
Diffstat (limited to 'kernel/src/filesystem/ext2/inode.cpp')
-rw-r--r--kernel/src/filesystem/ext2/inode.cpp20
1 files changed, 16 insertions, 4 deletions
diff --git a/kernel/src/filesystem/ext2/inode.cpp b/kernel/src/filesystem/ext2/inode.cpp
index 1914c70..303838e 100644
--- a/kernel/src/filesystem/ext2/inode.cpp
+++ b/kernel/src/filesystem/ext2/inode.cpp
@@ -13,7 +13,7 @@
namespace kernel::filesystem::ext2
{
- inode::inode(filesystem * fs, inode_data const & data)
+ inode::inode(filesystem const * fs, inode_data const & data)
: m_filesystem(fs)
, m_data(data)
{
@@ -25,11 +25,10 @@ namespace kernel::filesystem::ext2
auto inode::read(void * buffer, size_t offset, size_t size) const -> size_t
{
- // TODO BA-FS26 use revision 1 size
- auto const max_readable = static_cast<size_t>(m_data.size) - offset;
+ auto const max_readable = get_size() - offset;
auto const requested_size = std::min(size, max_readable);
- if (is_symbolic_link() && m_data.size <= sizeof(m_data.block))
+ if (is_symbolic_link() && get_size() <= sizeof(m_data.block))
{
auto inline_target = reinterpret_cast<uint8_t const *>(m_data.block.data());
kstd::libc::memcpy(static_cast<uint8_t *>(buffer), inline_target + offset, requested_size);
@@ -91,4 +90,17 @@ namespace kernel::filesystem::ext2
{
return (m_data.mode & constants::mode_mask) == constants::mode_symbolic_link;
}
+
+ auto inode::get_size() const -> size_t
+ {
+ uint64_t size = m_data.size;
+
+ if (m_filesystem->get_revision_level() > constants::good_old_revision && is_regular())
+ {
+ size |= static_cast<uint64_t>(m_data.dir_acl) << 32;
+ }
+
+ return size;
+ }
+
} // namespace kernel::filesystem::ext2