From c1678823d808932c065942e9aa0f7d7fe0246b8a Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Sat, 22 Aug 2026 14:30:33 +0200 Subject: kernel/fs: add backing inode to mount --- kernel/kernel/filesystem/ext2/inode.cpp | 41 +++++++++++++++++++++++++++++---- kernel/kernel/filesystem/ext2/inode.hpp | 4 ++++ kernel/kernel/filesystem/mount.cpp | 10 +++++++- kernel/kernel/filesystem/mount.hpp | 4 ++++ 4 files changed, 53 insertions(+), 6 deletions(-) diff --git a/kernel/kernel/filesystem/ext2/inode.cpp b/kernel/kernel/filesystem/ext2/inode.cpp index 5e80f40b..7059527a 100644 --- a/kernel/kernel/filesystem/ext2/inode.cpp +++ b/kernel/kernel/filesystem/ext2/inode.cpp @@ -67,10 +67,16 @@ namespace kernel::filesystem::ext2 } else { + auto inode = backing_inode(); + if (!inode) + { + return kstd::failure(inode.error()); + } + auto const block_start_offset = block_number.value() * (*filesystem)->block_size(); auto const read_offset = block_start_offset + in_block_offset; - auto const read_result = - (*filesystem)->backing_inode()->read(buffer.subspan(bytes_read.value, bytes_to_read.value), read_offset); + + auto const read_result = (*inode)->read(buffer.subspan(bytes_read.value, bytes_to_read.value), read_offset); if (!read_result) { return kstd::failure(read_result.error()); @@ -140,9 +146,14 @@ namespace kernel::filesystem::ext2 auto const block_start_offset = block_number.value() * (*filesystem)->block_size(); auto const write_offset = block_start_offset + in_block_offset; - auto const write_result = (*filesystem) - ->backing_inode() - ->write(buffer.subspan(bytes_written.value, bytes_to_write.value), write_offset); + auto inode = backing_inode(); + if (!inode) + { + return kstd::failure(inode.error()); + } + + auto const write_result = + (*inode)->write(buffer.subspan(bytes_written.value, bytes_to_write.value), write_offset); if (!write_result) { return kstd::failure(write_result.error()); @@ -318,4 +329,24 @@ namespace kernel::filesystem::ext2 return kstd::failure(vfs_errc::not_mounted); } + auto inode::backing_inode() -> kstd::result> + { + if (auto mount = owning_mount().lock()) + { + return mount->backing_inode(); + } + + return kstd::failure(vfs_errc::not_mounted); + } + + auto inode::backing_inode() const -> kstd::result> + { + if (auto mount = owning_mount().lock()) + { + return mount->backing_inode(); + } + + return kstd::failure(vfs_errc::not_mounted); + } + } // namespace kernel::filesystem::ext2 diff --git a/kernel/kernel/filesystem/ext2/inode.hpp b/kernel/kernel/filesystem/ext2/inode.hpp index 41231cab..cae1d801 100644 --- a/kernel/kernel/filesystem/ext2/inode.hpp +++ b/kernel/kernel/filesystem/ext2/inode.hpp @@ -105,6 +105,10 @@ namespace kernel::filesystem::ext2 [[nodiscard]] auto get_filesystem() const -> kstd::result>; + [[nodiscard]] auto backing_inode() -> kstd::result>; + + [[nodiscard]] auto backing_inode() const -> kstd::result>; + //! The inode number on disk. uint32_t m_inode_number{}; //! The inode data. diff --git a/kernel/kernel/filesystem/mount.cpp b/kernel/kernel/filesystem/mount.cpp index b1335735..995c12c8 100644 --- a/kernel/kernel/filesystem/mount.cpp +++ b/kernel/kernel/filesystem/mount.cpp @@ -62,7 +62,10 @@ namespace kernel::filesystem return kstd::failure(root_inode.error()); } - return attach(mount_dentry, fs, *root_inode, parent_mount, source_mount); + auto instance = attach(mount_dentry, fs, *root_inode, parent_mount, source_mount); + instance->m_backing_inode = backing_inode; + + return instance; } auto mount::mount_dentry() const -> kstd::shared_ptr const & @@ -75,6 +78,11 @@ namespace kernel::filesystem return m_filesystem; } + auto mount::backing_inode() const -> kstd::shared_ptr const & + { + return m_backing_inode; + } + auto mount::root_dentry() const -> kstd::shared_ptr const & { return m_root_dentry; diff --git a/kernel/kernel/filesystem/mount.hpp b/kernel/kernel/filesystem/mount.hpp index c07de071..d8d9c625 100644 --- a/kernel/kernel/filesystem/mount.hpp +++ b/kernel/kernel/filesystem/mount.hpp @@ -49,6 +49,9 @@ namespace kernel::filesystem //! Get the filesystem instance being mounted. [[nodiscard]] auto get_filesystem() const -> kstd::shared_ptr const &; + //! Get the backing inode, if any, of this mount. + [[nodiscard]] auto backing_inode() const -> kstd::shared_ptr const &; + //! Get the path at which the filesystem is mounted. [[nodiscard]] auto mount_path() const -> kstd::string; @@ -91,6 +94,7 @@ namespace kernel::filesystem kstd::shared_ptr m_mount_dentry{}; kstd::shared_ptr m_root_dentry{}; kstd::shared_ptr m_filesystem{}; + kstd::shared_ptr m_backing_inode{}; kstd::shared_ptr m_parent_mount{}; kstd::weak_ptr m_source_mount{}; std::atomic_size_t m_ref_count{0}; -- cgit v1.2.3