From b5474f4b6a4561fc51aefc3f3583453a91ecb9fe Mon Sep 17 00:00:00 2001 From: Lucjan Bryndza Date: Wed, 23 Dec 2020 09:26:29 +0100 Subject: [PATCH] [EGD-5018] Add umount all filesystem Add umount all mounted filesystem. This function can be used in the cleanup vfs core stage --- .../include/user/purefs/vfs_subsystem.hpp | 1 + module-vfs/src/purefs/vfs_subsystem.cpp | 24 ++++++++++++++++++- module-vfs/tests/unittest_filesystem_core.cpp | 5 ++-- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/module-vfs/include/user/purefs/vfs_subsystem.hpp b/module-vfs/include/user/purefs/vfs_subsystem.hpp index 0d7c2293361d0ce7a7c622798439b93f66f9d2a3..54802bf7e46eccb4c62a417b254f5810928c7435 100644 --- a/module-vfs/include/user/purefs/vfs_subsystem.hpp +++ b/module-vfs/include/user/purefs/vfs_subsystem.hpp @@ -12,4 +12,5 @@ namespace purefs::subsystem auto disk_mgr() -> std::shared_ptr; auto vfs_core() -> std::shared_ptr; auto mount_defaults() -> int; + auto unmount_all() -> int; } // namespace purefs::subsystem diff --git a/module-vfs/src/purefs/vfs_subsystem.cpp b/module-vfs/src/purefs/vfs_subsystem.cpp index 37721a0064e3b99f109c14b770be811d4c972694..ed81ac24cb5293059ef8570502496fe6682ee1d1 100644 --- a/module-vfs/src/purefs/vfs_subsystem.cpp +++ b/module-vfs/src/purefs/vfs_subsystem.cpp @@ -136,7 +136,8 @@ namespace purefs::subsystem } auto parts = disk->partitions(default_blkdev_name); if (parts.size() != old_layout_part_count && parts.size() != new_layout_part_count) { - LOG_FATAL("Unknown partition layout part size is %u", unsigned(parts.size())); + LOG_FATAL("Unknown partitions layout part size is %u", unsigned(parts.size())); + return -EIO; } auto boot_it = std::end(parts); auto lfs_it = std::end(parts); @@ -174,4 +175,25 @@ namespace purefs::subsystem fs::internal::set_default_thread_cwd(user_dir); return err; } + + auto unmount_all() -> int + { + auto vfs = g_fs_core.lock(); + if (!vfs) { + LOG_ERROR("Unable to lock vfs"); + return -EIO; + } + std::list mount_points; + int err = vfs->read_mountpoints(mount_points); + if (err) { + return err; + } + for (const auto &mpoint : mount_points) { + err = vfs->umount(mpoint); + if (err) + break; + } + return err; + } + } // namespace purefs::subsystem diff --git a/module-vfs/tests/unittest_filesystem_core.cpp b/module-vfs/tests/unittest_filesystem_core.cpp index 58352797d6b8e28bbc8d8b23c6af4d5da70ad9b9..1b98ef9e4327c6f90dbee41554496b96e5f46dd3 100644 --- a/module-vfs/tests/unittest_filesystem_core.cpp +++ b/module-vfs/tests/unittest_filesystem_core.cpp @@ -277,7 +277,6 @@ TEST_CASE("Unititest integrated subsystem") auto [disk, vfs] = purefs::subsystem::initialize(); REQUIRE(purefs::subsystem::mount_defaults() == 0); REQUIRE(purefs::fs::internal::get_thread_local_cwd_path() == "/sys/current"); - const auto err = vfs->umount("/sys/user"); - REQUIRE((err == 0 || err == -2)); - REQUIRE(vfs->umount("/sys") == 0); + REQUIRE(vfs->getcwd() == "/sys/current"); + REQUIRE(purefs::subsystem::unmount_all() == 0); }