aboutsummaryrefslogtreecommitdiff
path: root/kernel/kernel/vfs/mount_table.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/kernel/vfs/mount_table.cpp')
-rw-r--r--kernel/kernel/vfs/mount_table.cpp34
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
{