aboutsummaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/kernel/filesystem/ext2/inode.cpp41
-rw-r--r--kernel/kernel/filesystem/ext2/inode.hpp4
-rw-r--r--kernel/kernel/filesystem/mount.cpp10
-rw-r--r--kernel/kernel/filesystem/mount.hpp4
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};