diff options
Diffstat (limited to 'kernel/kernel/vfs/mount_table.cpp')
| -rw-r--r-- | kernel/kernel/vfs/mount_table.cpp | 34 |
1 files changed, 28 insertions, 6 deletions
diff --git a/kernel/kernel/vfs/mount_table.cpp b/kernel/kernel/vfs/mount_table.cpp index 2b494040..43dff516 100644 --- a/kernel/kernel/vfs/mount_table.cpp +++ b/kernel/kernel/vfs/mount_table.cpp @@ -1,9 +1,11 @@ #include <kernel/vfs/mount_table.hpp> #include <kernel/vfs/dentry.hpp> +#include <kernel/vfs/error.hpp> #include <kernel/vfs/mount.hpp> #include <kstd/memory.hpp> +#include <kstd/result.hpp> #include <kstd/vector.hpp> #include <algorithm> @@ -33,22 +35,32 @@ namespace kernel::vfs } } - auto mount_table::remove_mount(std::string_view path) -> operation_result + auto mount_table::remove_mount(std::string_view path) -> kstd::result<void> { auto mount_it = find_mount_iterator(path); if (mount_it == m_mounts.end()) { - return operation_result::mount_not_found; + return kstd::failure(errc::not_mounted); } auto const & mount = *mount_it; + return remove_mount(mount); + } + + auto mount_table::remove_mount(kstd::shared_ptr<mount> const & mount) -> kstd::result<void> + { + if (!mount) + { + return kstd::failure(errc::invalid_argument); + } + if (!mount->is_ready_to_unmount()) { - return operation_result::cannot_be_unmounted; + return kstd::failure(errc::mount_busy); } if (has_child_mounts(mount)) { - return operation_result::has_child_mounts; + return kstd::failure(errc::has_child_mounts); } if (auto source_mount = mount->source_mount()) @@ -61,8 +73,8 @@ namespace kernel::vfs mount_dentry->unset_flag(dentry::dentry_flags::is_mount_point); } - m_mounts.erase(mount_it); - return operation_result::removed; + kstd::erase(m_mounts, mount); + return kstd::success(); } auto mount_table::find_mount(std::string_view path) const -> kstd::shared_ptr<mount> @@ -71,6 +83,16 @@ namespace kernel::vfs return (mount_it != m_mounts.end()) ? *mount_it : nullptr; } + auto mount_table::move_mount(kstd::shared_ptr<mount> const & mount, kstd::shared_ptr<dentry> const & mount_point, + kstd::shared_ptr<struct mount> const & parent) -> void + { + mount->mount_dentry()->unset_flag(dentry::dentry_flags::is_mount_point); + mount->root_dentry()->set_parent(mount_point->parent()); + mount->set_mount_dentry(mount_point); + mount->set_parent_mount(parent); + mount_point->set_flag(dentry::dentry_flags::is_mount_point); + } + auto mount_table::find_mount_iterator(std::string_view path) const -> kstd::vector<kstd::shared_ptr<mount>>::const_iterator { |
