From 0a03abd3d367384c1ae1ad6709f97a9c42ec8a7d Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Fri, 21 Aug 2026 19:32:55 +0200 Subject: kernel/fs: add back-link from inodes to their mount --- kernel/kernel/filesystem/inode.cpp | 11 +++++++++++ kernel/kernel/filesystem/inode.hpp | 21 +++++++++++++++++++++ kernel/kernel/filesystem/vfs.cpp | 4 ++++ 3 files changed, 36 insertions(+) diff --git a/kernel/kernel/filesystem/inode.cpp b/kernel/kernel/filesystem/inode.cpp index d0762472..26f523c6 100644 --- a/kernel/kernel/filesystem/inode.cpp +++ b/kernel/kernel/filesystem/inode.cpp @@ -2,6 +2,7 @@ #include +#include #include #include @@ -77,4 +78,14 @@ namespace kernel::filesystem return std::nullopt; } + auto inode::owning_mount() const noexcept -> kstd::weak_ptr + { + return m_owning_mount; + } + + auto inode::set_owning_mount(kstd::shared_ptr const & source) noexcept -> void + { + m_owning_mount = source; + } + } // namespace kernel::filesystem \ No newline at end of file diff --git a/kernel/kernel/filesystem/inode.hpp b/kernel/kernel/filesystem/inode.hpp index afe15e7d..677c5155 100644 --- a/kernel/kernel/filesystem/inode.hpp +++ b/kernel/kernel/filesystem/inode.hpp @@ -3,6 +3,7 @@ #include +#include #include #include @@ -12,6 +13,8 @@ namespace kernel::filesystem { + struct mount; + //! An inode in the filesystem. //! //! Specific filesystems, or other subsystems, may provide their own implementation of this abstract base class. For @@ -102,6 +105,24 @@ namespace kernel::filesystem [[nodiscard]] virtual auto raw_device() const -> std::optional; //! @} + + //! @name Mount Resolution + //! @{ + + //! Get the mount this inode belongs to. + //! + //! @return The mount this inode belongs to. + [[nodiscard]] auto owning_mount() const noexcept -> kstd::weak_ptr; + + //! Define which mount this inode belongs to. + //! + //! @param source The mount this inode belongs to. + auto set_owning_mount(kstd::shared_ptr const & source) noexcept -> void; + + //! @} + + private: + kstd::weak_ptr m_owning_mount{}; }; } // namespace kernel::filesystem diff --git a/kernel/kernel/filesystem/vfs.cpp b/kernel/kernel/filesystem/vfs.cpp index 0cb46cac..02c577f2 100644 --- a/kernel/kernel/filesystem/vfs.cpp +++ b/kernel/kernel/filesystem/vfs.cpp @@ -282,6 +282,8 @@ namespace kernel::filesystem { if (auto new_inode = fs->create_inode(parent_dentry->get_inode(), name, type, raw_device)) { + (*new_inode)->set_owning_mount(mount_context); + auto new_dentry = kstd::make_shared(parent_dentry, *new_inode, name); parent_dentry->add_child(new_dentry); @@ -385,6 +387,8 @@ namespace kernel::filesystem return kstd::failure(found_inode.error()); } + (*found_inode)->set_owning_mount(current_mount); + next_dentry = kstd::make_shared(current_dentry, *found_inode, part); current_dentry->add_child(next_dentry); } -- cgit v1.2.3