From 0b28a0df3406f011cd618cd5e7b2f15f38dbc516 Mon Sep 17 00:00:00 2001 From: Marcel Braun Date: Mon, 8 Jun 2026 21:47:25 +0200 Subject: Implement inode type handling for directory and regular in ext2 --- kernel/kernel/filesystem/ext2/filesystem.cpp | 45 +++++++++++++++++++--------- kernel/kernel/filesystem/ext2/filesystem.hpp | 6 +++- kernel/kernel/filesystem/vfs_types.hpp | 15 ++++++++++ 3 files changed, 51 insertions(+), 15 deletions(-) create mode 100644 kernel/kernel/filesystem/vfs_types.hpp (limited to 'kernel') diff --git a/kernel/kernel/filesystem/ext2/filesystem.cpp b/kernel/kernel/filesystem/ext2/filesystem.cpp index fb314d0d..a5bc5f4d 100644 --- a/kernel/kernel/filesystem/ext2/filesystem.cpp +++ b/kernel/kernel/filesystem/ext2/filesystem.cpp @@ -9,6 +9,9 @@ #include #include #include +#include + +#include #include #include @@ -64,6 +67,15 @@ namespace kernel::filesystem::ext2 [[gnu::used]] constexpr auto registration = type_registration{}; + auto filesystem::indirect_levels() const -> std::array + { + return { + {{constants::singly_indirect_block_index, block_numbers_per_singly_indirect_block()}, + {constants::doubly_indirect_block_index, block_numbers_per_doubly_indirect_block()}, + {constants::triply_indirect_block_index, block_numbers_per_triply_indirect_block()}} + }; + } + auto filesystem::mount(kstd::shared_ptr const & backing_inode) -> kstd::result { std::ignore = kernel::filesystem::filesystem::mount(backing_inode); @@ -154,7 +166,8 @@ namespace kernel::filesystem::ext2 return kstd::failure(vfs_errc::no_such_file_or_directory); } - auto filesystem::create_inode(kstd::shared_ptr const & parent, std::string_view name) + auto filesystem::create_inode(kstd::shared_ptr const & parent, std::string_view name, + kernel::filesystem::vfs_types::inode_type inode_type) -> kstd::result> { if (!parent) @@ -183,8 +196,7 @@ namespace kernel::filesystem::ext2 inode_data new_inode_data{}; - // TODO set mode depending on type/mode - new_inode_data.mode = 0x8000; + new_inode_data.mode = map_vfs_inode_type_to_inode_mode(inode_type); new_inode_data.size = 0; new_inode_data.dir_acl = 0; new_inode_data.links_count = 1; @@ -200,8 +212,7 @@ namespace kernel::filesystem::ext2 auto new_inode = kstd::make_shared(this, inode_number, new_inode_data); - bool is_directory = false; // TODO refactor - if (is_directory) + if (new_inode->is_directory()) { if (auto result = init_directory(new_inode, ext2_parent); !result) { @@ -503,15 +514,6 @@ namespace kernel::filesystem::ext2 return kstd::failure(ext2_errc::not_enough_inodes); } - auto filesystem::indirect_levels() const -> std::array - { - return { - {{constants::singly_indirect_block_index, block_numbers_per_singly_indirect_block()}, - {constants::doubly_indirect_block_index, block_numbers_per_doubly_indirect_block()}, - {constants::triply_indirect_block_index, block_numbers_per_triply_indirect_block()}} - }; - } - auto filesystem::map_inode_block_index_to_global_block_number(size_t inode_block_index, inode_data data) const -> std::expected { @@ -721,6 +723,21 @@ namespace kernel::filesystem::ext2 } } + auto filesystem::map_vfs_inode_type_to_inode_mode(kernel::filesystem::vfs_types::inode_type vfs_type) -> uint16_t + { + switch (vfs_type) + { + case kernel::filesystem::vfs_types::inode_type::directory: + return constants::mode_directory; + case kernel::filesystem::vfs_types::inode_type::regular: + return constants::mode_regular; + case kernel::filesystem::vfs_types::inode_type::symbolic_link: + // return constants::mode_symbolic_link; // TODO implement + default: + kapi::system::panic("[EXT2] Not implemented."); + } + } + auto filesystem::block_numbers_per_block() const -> size_t { return block_size() / sizeof(uint32_t); diff --git a/kernel/kernel/filesystem/ext2/filesystem.hpp b/kernel/kernel/filesystem/ext2/filesystem.hpp index d997f508..e8f72727 100644 --- a/kernel/kernel/filesystem/ext2/filesystem.hpp +++ b/kernel/kernel/filesystem/ext2/filesystem.hpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -71,9 +72,11 @@ namespace kernel::filesystem::ext2 @brief Creates a new inode with @p name within a @p parent directory. @param parent The parent directory inode. @param name The name of the inode to create. + @param inode_type The type of inode to be created. @return A pointer to the created inode, or a null pointer if creation failed. */ - [[nodiscard]] auto create_inode(kstd::shared_ptr const & parent, std::string_view name) + [[nodiscard]] auto create_inode(kstd::shared_ptr const & parent, std::string_view name, + kernel::filesystem::vfs_types::inode_type inode_type) -> kstd::result>; // TODO move into base class and override /** @@ -191,6 +194,7 @@ namespace kernel::filesystem::ext2 [[nodiscard]] auto write_superblock() const -> kstd::result; auto map_inode_mode_to_file_type(uint16_t mode) -> uint8_t; + auto map_vfs_inode_type_to_inode_mode(kernel::filesystem::vfs_types::inode_type vfs_type) -> uint16_t; superblock m_superblock{}; kstd::vector m_block_group_descriptors; diff --git a/kernel/kernel/filesystem/vfs_types.hpp b/kernel/kernel/filesystem/vfs_types.hpp new file mode 100644 index 00000000..4bedaddc --- /dev/null +++ b/kernel/kernel/filesystem/vfs_types.hpp @@ -0,0 +1,15 @@ +#ifndef TEACH_OS_KERNEL_FILESYSTEM_VFS_TYPES_HPP +#define TEACH_OS_KERNEL_FILESYSTEM_VFS_TYPES_HPP + +#include + +namespace kernel::filesystem::vfs_types +{ + enum class inode_type : size_t + { + directory = 0, + regular = 1, + symbolic_link = 2, + }; +} // namespace kernel::filesystem::vfs_types +#endif \ No newline at end of file -- cgit v1.2.3