aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/kernel/filesystem/inode.cpp11
-rw-r--r--kernel/kernel/filesystem/inode.hpp21
-rw-r--r--kernel/kernel/filesystem/vfs.cpp4
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);
}