diff options
| author | marcel.braun <marcel.braun@ost.ch> | 2026-03-23 09:49:10 +0100 |
|---|---|---|
| committer | Lukas Oesch <lukasoesch20@gmail.com> | 2026-03-26 21:18:47 +0100 |
| commit | d70e2df0885a844d47b6498bf2c710fb9730b364 (patch) | |
| tree | ce6c26e895c4c80ce7dfd8c40abca90fc47eee5a /kernel | |
| parent | f90cbdaa91b1b7a4752db3f159ce2524696cff9f (diff) | |
| download | teachos-d70e2df0885a844d47b6498bf2c710fb9730b364.tar.xz teachos-d70e2df0885a844d47b6498bf2c710fb9730b364.zip | |
Add dentry structure
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/include/kernel/filesystem/dentry.hpp | 14 | ||||
| -rw-r--r-- | kernel/include/kernel/filesystem/vfs.hpp | 2 | ||||
| -rw-r--r-- | kernel/src/filesystem/dentry.cpp | 17 | ||||
| -rw-r--r-- | kernel/src/filesystem/vfs.cpp | 21 |
4 files changed, 43 insertions, 11 deletions
diff --git a/kernel/include/kernel/filesystem/dentry.hpp b/kernel/include/kernel/filesystem/dentry.hpp index 1532880..db15b48 100644 --- a/kernel/include/kernel/filesystem/dentry.hpp +++ b/kernel/include/kernel/filesystem/dentry.hpp @@ -4,21 +4,35 @@ #include "kernel/filesystem/inode.hpp" #include <kstd/memory> +#include <kstd/string> #include <kstd/vector> +#include <cstdint> + namespace filesystem { struct dentry { + enum class dentry_flags : uint32_t + { + dcache_mounted = 1 << 15 + }; + dentry(kstd::shared_ptr<dentry> const & parent, kstd::shared_ptr<inode> const & node); [[nodiscard]] auto get_inode() const -> kstd::shared_ptr<inode> const &; [[nodiscard]] auto get_parent() const -> kstd::shared_ptr<dentry> const &; + auto set_flag(dentry_flags flag) -> void; + auto unset_flag(dentry_flags flag) -> void; + [[nodiscard]] auto has_flag(dentry_flags flag) const -> bool; + private: + kstd::string m_name; kstd::shared_ptr<dentry> m_parent; kstd::vector<kstd::shared_ptr<dentry>> m_children; kstd::shared_ptr<inode> m_inode; + uint32_t m_flags{0}; }; } // namespace filesystem diff --git a/kernel/include/kernel/filesystem/vfs.hpp b/kernel/include/kernel/filesystem/vfs.hpp index bcf06f7..01cd2ea 100644 --- a/kernel/include/kernel/filesystem/vfs.hpp +++ b/kernel/include/kernel/filesystem/vfs.hpp @@ -40,7 +40,7 @@ namespace filesystem [[nodiscard]] auto resolve_path(std::string_view path) -> std::optional<dentry>; kstd::shared_ptr<filesystem> m_root_fs; - std::optional<mount> m_root_mount; + kstd::shared_ptr<dentry> m_root_dentry; kstd::vector<mount> m_mount_table; }; } // namespace filesystem diff --git a/kernel/src/filesystem/dentry.cpp b/kernel/src/filesystem/dentry.cpp index 08f0b25..e498b52 100644 --- a/kernel/src/filesystem/dentry.cpp +++ b/kernel/src/filesystem/dentry.cpp @@ -6,6 +6,8 @@ #include <kstd/memory> +#include <cstdint> + namespace filesystem { dentry::dentry(kstd::shared_ptr<dentry> const & parent, kstd::shared_ptr<inode> const & node) @@ -27,4 +29,19 @@ namespace filesystem { return m_parent; } + + auto dentry::set_flag(dentry_flags flag) -> void + { + m_flags |= static_cast<uint32_t>(flag); + } + + auto dentry::unset_flag(dentry_flags flag) -> void + { + m_flags &= ~static_cast<uint32_t>(flag); + } + + auto dentry::has_flag(dentry_flags flag) const -> bool + { + return (m_flags & static_cast<uint32_t>(flag)) != 0; + } } // namespace filesystem
\ No newline at end of file diff --git a/kernel/src/filesystem/vfs.cpp b/kernel/src/filesystem/vfs.cpp index a111f23..2c4a4d5 100644 --- a/kernel/src/filesystem/vfs.cpp +++ b/kernel/src/filesystem/vfs.cpp @@ -38,10 +38,11 @@ namespace filesystem if (auto boot_device = storage_mgmt.determine_boot_device()) { active_vfs->m_root_fs = kstd::make_shared<ext2::ext2_filesystem>(); - if (active_vfs->do_mount("/", active_vfs->m_root_fs) != 0) - { - kapi::system::panic("[FILESYSTEM] Failed to mount root filesystem."); - } + active_vfs->m_root_dentry = kstd::make_shared<dentry>(nullptr, active_vfs->m_root_fs->root_inode()); + // if (active_vfs->do_mount("/", active_vfs->m_root_fs) != 0) + // { + // kapi::system::panic("[FILESYSTEM] Failed to mount root filesystem."); + // } // TODO BA-FS26 use do_mount when tempdevfs is implemented -> just call /dev/ with all devices in devtempfs std::ranges::for_each(storage_mgmt.all_controllers(), [&](auto controller) { @@ -92,12 +93,12 @@ namespace filesystem return -1; // TODO BA-FS26 panic or errorcode? } - if (path == "/") - { - m_root_fs = filesystem; - m_root_mount = mount{"/", filesystem}; - return 0; - } + // if (path == "/") + // { + // m_root_fs = filesystem; + // m_root_mount = mount{"/", filesystem}; + // return 0; + // } auto existing_mount = std::ranges::find_if(m_mount_table, [&](auto const & existing) { return existing.path() == path; }); |
