M module-vfs/include/user/purefs/vfs_subsystem.hpp => module-vfs/include/user/purefs/vfs_subsystem.hpp +1 -0
@@ 12,4 12,5 @@ namespace purefs::subsystem
auto disk_mgr() -> std::shared_ptr<blkdev::disk_manager>;
auto vfs_core() -> std::shared_ptr<fs::filesystem>;
auto mount_defaults() -> int;
+ auto unmount_all() -> int;
} // namespace purefs::subsystem
M module-vfs/src/purefs/vfs_subsystem.cpp => module-vfs/src/purefs/vfs_subsystem.cpp +23 -1
@@ 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<std::string> 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
M module-vfs/tests/unittest_filesystem_core.cpp => module-vfs/tests/unittest_filesystem_core.cpp +2 -3
@@ 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);
}