diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/kernel/filesystem/inode.cpp | 11 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/inode.hpp | 21 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/vfs.cpp | 4 |
3 files changed, 36 insertions, 0 deletions
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 <kapi/filesystem.hpp> +#include <kstd/memory.hpp> #include <kstd/result.hpp> #include <optional> @@ -77,4 +78,14 @@ namespace kernel::filesystem return std::nullopt; } + auto inode::owning_mount() const noexcept -> kstd::weak_ptr<mount> + { + return m_owning_mount; + } + + auto inode::set_owning_mount(kstd::shared_ptr<mount> 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 <kapi/filesystem.hpp> +#include <kstd/memory.hpp> #include <kstd/result.hpp> #include <kstd/units.hpp> @@ -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<kapi::filesystem::device_number>; //! @} + + //! @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<mount>; + + //! Define which mount this inode belongs to. + //! + //! @param source The mount this inode belongs to. + auto set_owning_mount(kstd::shared_ptr<mount> const & source) noexcept -> void; + + //! @} + + private: + kstd::weak_ptr<mount> 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<dentry>(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<dentry>(current_dentry, *found_inode, part); current_dentry->add_child(next_dentry); } |
