~aleteoryx/muditaos

b5474f4b6a4561fc51aefc3f3583453a91ecb9fe — Lucjan Bryndza 5 years ago e7931b2
[EGD-5018] Add umount all filesystem

Add umount all mounted filesystem. This function
can be used in the cleanup vfs core stage
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);
}