diff options
| -rw-r--r-- | kernel/kernel/filesystem/filesystem.cpp | 13 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/filesystem.hpp | 12 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/mount.cpp | 36 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/mount.hpp | 33 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/mount.tests.cpp | 59 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/mount_table.tests.cpp | 40 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/vfs.cpp | 38 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/vfs.hpp | 4 |
8 files changed, 142 insertions, 93 deletions
diff --git a/kernel/kernel/filesystem/filesystem.cpp b/kernel/kernel/filesystem/filesystem.cpp index 1d222888..362c4d1e 100644 --- a/kernel/kernel/filesystem/filesystem.cpp +++ b/kernel/kernel/filesystem/filesystem.cpp @@ -8,13 +8,10 @@ #include <kstd/result.hpp> #include <kstd/system_error.hpp> -#include <utility> - namespace kernel::filesystem { - auto filesystem::probe_and_mount(kstd::shared_ptr<inode> const & backing_inode) - -> kstd::result<std::pair<kstd::shared_ptr<filesystem>, kstd::shared_ptr<inode>>> + auto filesystem::probe(kstd::shared_ptr<inode> const & backing_inode) -> kstd::result<kstd::shared_ptr<filesystem>> { for (auto & type : type_registry::get().all()) { @@ -23,14 +20,10 @@ namespace kernel::filesystem continue; } - auto fs = type->make_instance(); - auto root = fs->mount(backing_inode); - if (!root) + if (auto fs = type->make_instance()) { - continue; + return fs; } - - return std::pair{fs, *root}; } return kstd::failure(vfs_errc::unsupported_filesystem); diff --git a/kernel/kernel/filesystem/filesystem.hpp b/kernel/kernel/filesystem/filesystem.hpp index f18422b2..dccc9434 100644 --- a/kernel/kernel/filesystem/filesystem.hpp +++ b/kernel/kernel/filesystem/filesystem.hpp @@ -12,7 +12,6 @@ #include <optional> #include <string_view> -#include <utility> namespace kernel::filesystem { @@ -25,14 +24,11 @@ namespace kernel::filesystem //! Virtual destructor enabling polymorphic destruction. virtual ~filesystem() = default; - //! Probes the given inode to determine if it contains a recognizable filesystem, and if so, mount it. + //! Probes the given inode to determine if it contains a recognizable filesystem. //! - //! @warning This function panics if @p backing_inode is null. - //! - //! @param backing_inode The inode to probe and mount. - //! @return A pointer to the mounted filesystem and the root of it on success, an error otherwise. - auto static probe_and_mount(kstd::shared_ptr<inode> const & backing_inode) - -> kstd::result<std::pair<kstd::shared_ptr<filesystem>, kstd::shared_ptr<inode>>>; + //! @param backing_inode The inode to probe and mount, if any. + //! @return A pointer to the instantiated filesystem and the root of it on success, an error otherwise. + auto static probe(kstd::shared_ptr<inode> const & backing_inode) -> kstd::result<kstd::shared_ptr<filesystem>>; //! Initializes the filesystem with the given inode. //! diff --git a/kernel/kernel/filesystem/mount.cpp b/kernel/kernel/filesystem/mount.cpp index 009ab230..b1335735 100644 --- a/kernel/kernel/filesystem/mount.cpp +++ b/kernel/kernel/filesystem/mount.cpp @@ -6,6 +6,7 @@ #include <kapi/system.hpp> #include <kstd/memory.hpp> +#include <kstd/result.hpp> #include <kstd/string.hpp> #include <cstddef> @@ -29,6 +30,41 @@ namespace kernel::filesystem } } + auto mount::attach(kstd::shared_ptr<dentry> const & mount_dentry, kstd::shared_ptr<filesystem> const & fs, + kstd::shared_ptr<inode> const & root_inode, kstd::shared_ptr<mount> const & parent_mount, + kstd::shared_ptr<mount> const & source_mount) -> kstd::shared_ptr<mount> + { + auto root_dentry = mount_dentry + ? kstd::make_shared<dentry>(mount_dentry->parent(), root_inode, mount_dentry->name()) + : kstd::make_shared<dentry>(nullptr, root_inode, "/"); + + auto instance = kstd::shared_ptr<mount>{ + new mount{mount_dentry, root_dentry, fs, parent_mount, source_mount} + }; + + root_inode->set_owning_mount(instance); + + return instance; + } + + auto mount::create(kstd::shared_ptr<dentry> const & mount_dentry, kstd::shared_ptr<filesystem> const & fs, + kstd::shared_ptr<mount> const & parent_mount, kstd::shared_ptr<mount> const & source_mount, + kstd::shared_ptr<inode> const & backing_inode) -> kstd::result<kstd::shared_ptr<mount>> + { + if (!fs) + { + kapi::system::panic("[OS:FS] Tried to mount a null filesystem!"); + } + + auto root_inode = fs->mount(backing_inode); + if (!root_inode) + { + return kstd::failure(root_inode.error()); + } + + return attach(mount_dentry, fs, *root_inode, parent_mount, source_mount); + } + auto mount::mount_dentry() const -> kstd::shared_ptr<dentry> const & { return m_mount_dentry; diff --git a/kernel/kernel/filesystem/mount.hpp b/kernel/kernel/filesystem/mount.hpp index b906def5..c07de071 100644 --- a/kernel/kernel/filesystem/mount.hpp +++ b/kernel/kernel/filesystem/mount.hpp @@ -5,6 +5,7 @@ #include <kernel/filesystem/filesystem.hpp> #include <kstd/memory.hpp> +#include <kstd/result.hpp> #include <kstd/string.hpp> #include <atomic> @@ -12,19 +13,32 @@ namespace kernel::filesystem { + struct inode; + //! A mounted filesystem struct mount { + //! Attach a mounted filesystem with a known root inode + //! + //! @param mount_dentry The directory entry where the filesystem is mounted. + //! @param fs The filesystem instance being mounted. + //! @param root_inode The backing inode for the filesystem, must not be null. + //! @param parent_mount The parent mount which contains the mount_dentry. + //! @param source_mount The mount that the filesystem originates from. + auto static attach(kstd::shared_ptr<dentry> const & mount_dentry, kstd::shared_ptr<filesystem> const & fs, + kstd::shared_ptr<inode> const & root_inode, kstd::shared_ptr<mount> const & parent_mount, + kstd::shared_ptr<mount> const & source_mount) -> kstd::shared_ptr<mount>; + //! Create a new mount with the given parameters. //! //! @param mount_dentry The directory entry where the filesystem is mounted. - //! @param root_dentry The root directory entry of the mounted filesystem. //! @param fs The filesystem instance being mounted. //! @param parent_mount The parent mount which contains the mount_dentry. //! @param source_mount The mount that the filesystem originates from. - mount(kstd::shared_ptr<dentry> const & mount_dentry, kstd::shared_ptr<dentry> const & root_dentry, - kstd::shared_ptr<filesystem> const & fs, kstd::shared_ptr<mount> const & parent_mount, - kstd::shared_ptr<mount> const & source_mount); + //! @param backing_inode The backing inode for the filesystem, if any. + auto static create(kstd::shared_ptr<dentry> const & mount_dentry, kstd::shared_ptr<filesystem> const & fs, + kstd::shared_ptr<mount> const & parent_mount, kstd::shared_ptr<mount> const & source_mount, + kstd::shared_ptr<inode> const & backing_inode) -> kstd::result<kstd::shared_ptr<mount>>; //! Get the directory entry where the filesystem is mounted. [[nodiscard]] auto mount_dentry() const -> kstd::shared_ptr<dentry> const &; @@ -63,6 +77,17 @@ namespace kernel::filesystem [[nodiscard]] auto ref_count() const -> size_t; private: + //! Create a new mount with the given parameters. + //! + //! @param mount_dentry The directory entry where the filesystem is mounted. + //! @param root_dentry The root directory entry of the mounted filesystem. + //! @param fs The filesystem instance being mounted. + //! @param parent_mount The parent mount which contains the mount_dentry. + //! @param source_mount The mount that the filesystem originates from. + mount(kstd::shared_ptr<dentry> const & mount_dentry, kstd::shared_ptr<dentry> const & root_dentry, + kstd::shared_ptr<filesystem> const & fs, kstd::shared_ptr<mount> const & parent_mount, + kstd::shared_ptr<mount> const & source_mount); + kstd::shared_ptr<dentry> m_mount_dentry{}; kstd::shared_ptr<dentry> m_root_dentry{}; kstd::shared_ptr<filesystem> m_filesystem{}; diff --git a/kernel/kernel/filesystem/mount.tests.cpp b/kernel/kernel/filesystem/mount.tests.cpp index 800a0cfc..3337a172 100644 --- a/kernel/kernel/filesystem/mount.tests.cpp +++ b/kernel/kernel/filesystem/mount.tests.cpp @@ -15,29 +15,29 @@ SCENARIO("Mount construction", "[filesystem][mount]") { - GIVEN("a filesystem and a root dentry") + GIVEN("a filesystem and a root inode") { auto fs = kstd::make_shared<kernel::tests::filesystem::filesystem>(); auto root_inode = kstd::make_shared<kernel::tests::filesystem::inode>(); - auto root_dentry = kstd::make_shared<kernel::filesystem::dentry>(nullptr, root_inode, "/"); - WHEN("constructing a mount with the filesystem and root dentry") + WHEN("attaching a mount with no mount point") { - auto mount = kernel::filesystem::mount{root_dentry, root_dentry, fs, nullptr, nullptr}; + auto mount = kernel::filesystem::mount::attach(nullptr, fs, root_inode, nullptr, nullptr); THEN("the mount has the correct filesystem, root dentry, mount dentry, and mount path") { - REQUIRE(mount.get_filesystem() == fs); - REQUIRE(mount.root_dentry() == root_dentry); - REQUIRE(mount.mount_dentry() == root_dentry); - REQUIRE(mount.mount_path() == "/"); - REQUIRE(mount.is_ready_to_unmount()); + REQUIRE(mount->get_filesystem() == fs); + REQUIRE(mount->root_dentry()->get_inode() == root_inode); + REQUIRE(mount->root_dentry()->name() == "/"); + REQUIRE(mount->mount_dentry() == nullptr); + REQUIRE(mount->mount_path() == "/"); + REQUIRE(mount->is_ready_to_unmount()); } THEN("the mount has no parent mount and no source mount") { - REQUIRE(mount.parent_mount() == nullptr); - REQUIRE(mount.source_mount() == nullptr); + REQUIRE(mount->parent_mount() == nullptr); + REQUIRE(mount->source_mount() == nullptr); } } @@ -45,7 +45,7 @@ SCENARIO("Mount construction", "[filesystem][mount]") { THEN("the constructor panics") { - REQUIRE_THROWS_AS((kernel::filesystem::mount{root_dentry, root_dentry, nullptr, nullptr, nullptr}), + REQUIRE_THROWS_AS((kernel::filesystem::mount::create(nullptr, nullptr, nullptr, nullptr, nullptr)), kernel::tests::cpu::halt); } } @@ -63,32 +63,33 @@ SCENARIO("Mount reference counting", "[filesystem][mount]") THEN("reference count can be incremented and decremented, the mount is ready to unmount when the reference " "count == 0") { - auto mount = kernel::filesystem::mount{root_dentry, root_dentry, fs, nullptr, nullptr}; + auto mount = kernel::filesystem::mount::create(root_dentry, fs, nullptr, nullptr, nullptr); + REQUIRE(mount); - mount.increment_ref_count(); - REQUIRE(mount.ref_count() == 1); - REQUIRE_FALSE(mount.is_ready_to_unmount()); + (*mount)->increment_ref_count(); + REQUIRE((*mount)->ref_count() == 1); + REQUIRE_FALSE((*mount)->is_ready_to_unmount()); - mount.increment_ref_count(); - REQUIRE(mount.ref_count() == 2); - REQUIRE_FALSE(mount.is_ready_to_unmount()); + (*mount)->increment_ref_count(); + REQUIRE((*mount)->ref_count() == 2); + REQUIRE_FALSE((*mount)->is_ready_to_unmount()); - mount.decrement_ref_count(); - REQUIRE(mount.ref_count() == 1); - REQUIRE_FALSE(mount.is_ready_to_unmount()); + (*mount)->decrement_ref_count(); + REQUIRE((*mount)->ref_count() == 1); + REQUIRE_FALSE((*mount)->is_ready_to_unmount()); - mount.decrement_ref_count(); - REQUIRE(mount.ref_count() == 0); - REQUIRE(mount.is_ready_to_unmount()); + (*mount)->decrement_ref_count(); + REQUIRE((*mount)->ref_count() == 0); + REQUIRE((*mount)->is_ready_to_unmount()); } THEN("decrementing reference count when it is already zero does not decrement it below zero") { - auto mount = kernel::filesystem::mount{root_dentry, root_dentry, fs, nullptr, nullptr}; + auto mount = kernel::filesystem::mount::create(root_dentry, fs, nullptr, nullptr, nullptr); - REQUIRE_THROWS_AS(mount.decrement_ref_count(), std::runtime_error); - REQUIRE(mount.ref_count() == 0); - REQUIRE(mount.is_ready_to_unmount()); + REQUIRE_THROWS_AS((*mount)->decrement_ref_count(), std::runtime_error); + REQUIRE((*mount)->ref_count() == 0); + REQUIRE((*mount)->is_ready_to_unmount()); } } }
\ No newline at end of file diff --git a/kernel/kernel/filesystem/mount_table.tests.cpp b/kernel/kernel/filesystem/mount_table.tests.cpp index 39ad6b01..bed6cd9d 100644 --- a/kernel/kernel/filesystem/mount_table.tests.cpp +++ b/kernel/kernel/filesystem/mount_table.tests.cpp @@ -38,17 +38,17 @@ SCENARIO("Adding, finding and removing mounts in the mount table", "[filesystem] nullptr, kstd::make_shared<kernel::tests::filesystem::inode>(), "/"); auto mount_dentry1 = kstd::make_shared<kernel::filesystem::dentry>( nullptr, kstd::make_shared<kernel::tests::filesystem::inode>(), "/"); - auto mount1 = kstd::make_shared<kernel::filesystem::mount>(mount_dentry1, root_dentry1, fs1, nullptr, nullptr); + auto mount1 = kernel::filesystem::mount::create(mount_dentry1, fs1, nullptr, nullptr, nullptr); auto fs2 = kstd::make_shared<kernel::tests::filesystem::filesystem>(); auto root_dentry2 = kstd::make_shared<kernel::filesystem::dentry>( nullptr, kstd::make_shared<kernel::tests::filesystem::inode>(), "/"); auto mount_dentry2 = kstd::make_shared<kernel::filesystem::dentry>( nullptr, kstd::make_shared<kernel::tests::filesystem::inode>(), "/mnt"); - auto mount2 = kstd::make_shared<kernel::filesystem::mount>(mount_dentry2, root_dentry2, fs2, nullptr, nullptr); + auto mount2 = kernel::filesystem::mount::create(mount_dentry2, fs2, nullptr, nullptr, nullptr); - table.add_mount(mount1); - table.add_mount(mount2); + table.add_mount(*mount1); + table.add_mount(*mount2); THEN("dentry flags are set correctly for mounted dentries") { @@ -89,17 +89,17 @@ SCENARIO("Adding, finding and removing mounts in the mount table", "[filesystem] nullptr, kstd::make_shared<kernel::tests::filesystem::inode>(), "/"); auto mount_dentry1 = kstd::make_shared<kernel::filesystem::dentry>( nullptr, kstd::make_shared<kernel::tests::filesystem::inode>(), "/"); - auto mount1 = kstd::make_shared<kernel::filesystem::mount>(mount_dentry1, root_dentry1, fs1, nullptr, nullptr); + auto mount1 = kernel::filesystem::mount::create(mount_dentry1, fs1, nullptr, nullptr, nullptr); auto fs2 = kstd::make_shared<kernel::tests::filesystem::filesystem>(); auto root_dentry2 = kstd::make_shared<kernel::filesystem::dentry>( nullptr, kstd::make_shared<kernel::tests::filesystem::inode>(), "/"); auto mount_dentry2 = kstd::make_shared<kernel::filesystem::dentry>( nullptr, kstd::make_shared<kernel::tests::filesystem::inode>(), "/"); - auto mount2 = kstd::make_shared<kernel::filesystem::mount>(mount_dentry2, root_dentry2, fs2, nullptr, nullptr); + auto mount2 = kernel::filesystem::mount::create(mount_dentry2, fs2, nullptr, nullptr, nullptr); - table.add_mount(mount1); - table.add_mount(mount2); + table.add_mount(*mount1); + table.add_mount(*mount2); THEN("finding mounts by exact valid path returns the correct mount") { @@ -122,25 +122,25 @@ SCENARIO("Adding, finding and removing mounts in the mount table", "[filesystem] nullptr, kstd::make_shared<kernel::tests::filesystem::inode>(), "/"); auto mount_dentry1 = kstd::make_shared<kernel::filesystem::dentry>( nullptr, kstd::make_shared<kernel::tests::filesystem::inode>(), "/"); - auto mount1 = kstd::make_shared<kernel::filesystem::mount>(mount_dentry1, root_dentry1, fs1, nullptr, nullptr); + auto mount1 = kernel::filesystem::mount::create(mount_dentry1, fs1, nullptr, nullptr, nullptr); auto fs2 = kstd::make_shared<kernel::tests::filesystem::filesystem>(); auto root_dentry2 = kstd::make_shared<kernel::filesystem::dentry>( nullptr, kstd::make_shared<kernel::tests::filesystem::inode>(), "/"); auto mount_dentry2 = kstd::make_shared<kernel::filesystem::dentry>( mount_dentry1, kstd::make_shared<kernel::tests::filesystem::inode>(), "mnt"); - auto mount2 = kstd::make_shared<kernel::filesystem::mount>(mount_dentry2, root_dentry2, fs2, mount1, nullptr); + auto mount2 = kernel::filesystem::mount::create(mount_dentry2, fs2, *mount1, nullptr, nullptr); auto fs3 = kstd::make_shared<kernel::tests::filesystem::filesystem>(); auto root_dentry3 = kstd::make_shared<kernel::filesystem::dentry>( nullptr, kstd::make_shared<kernel::tests::filesystem::inode>(), "/"); auto mount_dentry3 = kstd::make_shared<kernel::filesystem::dentry>( mount_dentry2, kstd::make_shared<kernel::tests::filesystem::inode>(), "submnt"); - auto mount3 = kstd::make_shared<kernel::filesystem::mount>(mount_dentry3, root_dentry3, fs3, mount2, nullptr); + auto mount3 = kernel::filesystem::mount::create(mount_dentry3, fs3, *mount2, nullptr, nullptr); - table.add_mount(mount1); - table.add_mount(mount2); - table.add_mount(mount3); + table.add_mount(*mount1); + table.add_mount(*mount2); + table.add_mount(*mount3); THEN("removing a mount with child mounts returns has_child_mounts") { @@ -166,19 +166,19 @@ SCENARIO("Mount reference counting", "[filesystem][mount_table]") auto root_inode = kstd::make_shared<kernel::tests::filesystem::inode>(); auto root_dentry = kstd::make_shared<kernel::filesystem::dentry>(nullptr, root_inode, "/"); - auto source_mount = kstd::make_shared<kernel::filesystem::mount>(root_dentry, root_dentry, fs, nullptr, nullptr); - auto mount = kstd::make_shared<kernel::filesystem::mount>(root_dentry, root_dentry, fs, nullptr, source_mount); + auto source_mount = kernel::filesystem::mount::create(root_dentry, fs, nullptr, nullptr, nullptr); + auto mount = kernel::filesystem::mount::create(root_dentry, fs, nullptr, *source_mount, nullptr); THEN("reference count of source mount is incremented when a mount is added to the mount table and decremented when " "the mount is removed") { - REQUIRE(source_mount->ref_count() == 0); + REQUIRE((*source_mount)->ref_count() == 0); - table.add_mount(mount); - REQUIRE(source_mount->ref_count() == 1); + table.add_mount(*mount); + REQUIRE((*source_mount)->ref_count() == 1); REQUIRE(table.remove_mount("/") == kernel::filesystem::mount_table::operation_result::removed); - REQUIRE(source_mount->ref_count() == 0); + REQUIRE((*source_mount)->ref_count() == 0); } } } diff --git a/kernel/kernel/filesystem/vfs.cpp b/kernel/kernel/filesystem/vfs.cpp index 57ae6c70..21ac3752 100644 --- a/kernel/kernel/filesystem/vfs.cpp +++ b/kernel/kernel/filesystem/vfs.cpp @@ -66,8 +66,7 @@ namespace kernel::filesystem kapi::system::panic("[FILESYSTEM] failed to mount root FS", root_fs_root_inode.error()); } - auto root_fs_root_dentry = kstd::make_shared<dentry>(nullptr, *root_fs_root_inode, "/"); - auto root_mount = kstd::make_shared<struct mount>(nullptr, root_fs_root_dentry, root_fs, nullptr, nullptr); + auto root_mount = mount::attach(nullptr, root_fs, *root_fs_root_inode, nullptr, nullptr); m_mount_table.add_mount(root_mount); // mount devfs at /dev (inside rootfs, temporary, will be shadowed) @@ -90,13 +89,17 @@ namespace kernel::filesystem resolve_path_internal("/dev/ram0").value_or(std::pair{nullptr, nullptr}); if (boot_device_dentry && boot_device_mount_context) { - if (auto result = kernel::filesystem::filesystem::probe_and_mount(boot_device_dentry->get_inode())) + if (auto result = kernel::filesystem::filesystem::probe(boot_device_dentry->get_inode())) { - auto [boot_root_fs, boot_root_fs_root_inode] = *result; - if (auto root_dentry = resolve_path("/")) { - do_mount_internal(*root_dentry, root_mount, boot_root_fs, boot_root_fs_root_inode, boot_device_mount_context); + auto mount = mount::create(*root_dentry, *result, root_mount, boot_device_mount_context, + boot_device_dentry->get_inode()); + if (!mount) + { + kapi::system::panic("[OS:FS] failed to mount boot FS", mount.error()); + } + m_mount_table.add_mount(*mount); graft_persistent_device_fs(device_fs, *device_fs_root_inode); } } @@ -181,14 +184,20 @@ namespace kernel::filesystem } auto [source_dentry, source_mount_context] = *resolved_source; - auto fs = kernel::filesystem::filesystem::probe_and_mount(source_dentry->get_inode()); + auto fs = kernel::filesystem::filesystem::probe(source_dentry->get_inode()); if (!fs) { return kstd::failure(fs.error()); } - auto [filesystem, root_inode] = *fs; - do_mount_internal(mount_point_dentry, mount_context, filesystem, root_inode, source_mount_context); + auto mount = + mount::create(mount_point_dentry, *fs, mount_context, source_mount_context, source_dentry->get_inode()); + if (!mount) + { + return kstd::failure(mount.error()); + } + m_mount_table.add_mount(*mount); + return kstd::success(); } @@ -299,14 +308,6 @@ namespace kernel::filesystem return kstd::failure(vfs_errc::no_such_file_or_directory); } - auto vfs::do_mount_internal(dentry_ptr const & mount_point_dentry, mount_ptr const & parent_mount, fs_ptr const & fs, - kstd::shared_ptr<inode> const & root_inode, mount_ptr const & source_mount) -> void - { - auto new_fs_root = kstd::make_shared<dentry>(mount_point_dentry->parent(), root_inode, mount_point_dentry->name()); - auto new_mount = kstd::make_shared<struct mount>(mount_point_dentry, new_fs_root, fs, parent_mount, source_mount); - m_mount_table.add_mount(new_mount); - } - auto vfs::graft_persistent_device_fs(kstd::shared_ptr<filesystem> const & device_fs, kstd::shared_ptr<inode> const & root_inode) -> void { @@ -320,7 +321,8 @@ namespace kernel::filesystem root_mount_point_dentry->add_child(dev_dentry); } - do_mount_internal(dev_dentry, root_mount, device_fs, root_inode); + auto new_mount = mount::attach(dev_dentry, device_fs, root_inode, root_mount, nullptr); + m_mount_table.add_mount(new_mount); } } diff --git a/kernel/kernel/filesystem/vfs.hpp b/kernel/kernel/filesystem/vfs.hpp index 0f29608c..1975ac8a 100644 --- a/kernel/kernel/filesystem/vfs.hpp +++ b/kernel/kernel/filesystem/vfs.hpp @@ -111,10 +111,6 @@ namespace kernel::filesystem [[nodiscard]] auto find_mount(std::string_view path) const -> kstd::result<mount_ptr>; - auto do_mount_internal(dentry_ptr const & mount_point_dentry, mount_ptr const & parent_mount, fs_ptr const & fs, - kstd::shared_ptr<inode> const & root_inode, mount_ptr const & source_mount = nullptr) - -> void; - auto graft_persistent_device_fs(kstd::shared_ptr<filesystem> const & device_fs, kstd::shared_ptr<inode> const & root_inode) -> void; |
