diff options
| -rw-r--r-- | kernel/kernel/filesystem/ext2/inode.cpp | 41 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/ext2/inode.hpp | 4 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/mount.cpp | 10 | ||||
| -rw-r--r-- | 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<kstd::shared_ptr<kernel::filesystem::inode>> + { + if (auto mount = owning_mount().lock()) + { + return mount->backing_inode(); + } + + return kstd::failure(vfs_errc::not_mounted); + } + + auto inode::backing_inode() const -> kstd::result<kstd::shared_ptr<kernel::filesystem::inode const>> + { + 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<kstd::shared_ptr<filesystem const>>; + [[nodiscard]] auto backing_inode() -> kstd::result<kstd::shared_ptr<kernel::filesystem::inode>>; + + [[nodiscard]] auto backing_inode() const -> kstd::result<kstd::shared_ptr<kernel::filesystem::inode const>>; + //! 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<dentry> const & @@ -75,6 +78,11 @@ namespace kernel::filesystem return m_filesystem; } + auto mount::backing_inode() const -> kstd::shared_ptr<inode> const & + { + return m_backing_inode; + } + auto mount::root_dentry() const -> kstd::shared_ptr<dentry> 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<filesystem> const &; + //! Get the backing inode, if any, of this mount. + [[nodiscard]] auto backing_inode() const -> kstd::shared_ptr<inode> 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<dentry> m_mount_dentry{}; kstd::shared_ptr<dentry> m_root_dentry{}; kstd::shared_ptr<filesystem> m_filesystem{}; + kstd::shared_ptr<inode> m_backing_inode{}; kstd::shared_ptr<mount> m_parent_mount{}; kstd::weak_ptr<mount> m_source_mount{}; std::atomic_size_t m_ref_count{0}; |
