~aleteoryx/muditaos

37aee3901cf6ab36aeb3dae6a2a91a171cec0526 — Lucjan Bryndza 5 years ago e6213e9
[EGD-5165] Fix emulator crash on lfs and fat

Disk access was not protected by the mutex and race contition
occurs when multiple access was made for lfs and fat.

Signed-off-by: Lucjan Bryndza <lucjan.bryndza@mudita.com>
M board/linux/libiosyscalls/include/iosyscalls.hpp => board/linux/libiosyscalls/include/iosyscalls.hpp +1 -1
@@ 1,4 1,4 @@
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once

M board/linux/libiosyscalls/src/iosyscalls.cpp => board/linux/libiosyscalls/src/iosyscalls.cpp +1 -1
@@ 1,4 1,4 @@
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include <iosyscalls.hpp>

M module-utils/bootconfig/include/boot/bootconstants.hpp => module-utils/bootconfig/include/boot/bootconstants.hpp +1 -1
@@ 1,4 1,4 @@
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once

M module-vfs/board/linux/purefs/include/purefs/blkdev/disk_image.hpp => module-vfs/board/linux/purefs/include/purefs/blkdev/disk_image.hpp +2 -0
@@ 4,6 4,7 @@
#pragma once

#include <purefs/blkdev/disk.hpp>
#include <mutex>

namespace purefs::blkdev
{


@@ 31,5 32,6 @@ namespace purefs::blkdev
        int m_filedes{-1};
        unsigned long m_sectors{0};
        std::string m_image_name;
        mutable std::recursive_mutex m_mtx;
    };
} // namespace purefs::blkdev

M module-vfs/board/linux/purefs/src/blkdev/disk_image.cpp => module-vfs/board/linux/purefs/src/blkdev/disk_image.cpp +10 -3
@@ 15,6 15,7 @@ namespace purefs::blkdev

    auto disk_image::probe(unsigned int flags) -> int
    {
        std::lock_guard<std::recursive_mutex> m_lock(m_mtx);
        m_filedes = ::open(m_image_name.c_str(), O_RDWR, O_SYNC);
        if (!m_filedes)
            return m_filedes;


@@ 24,10 25,11 @@ namespace purefs::blkdev
            return -errno;
        }
        m_sectors = fst.st_size / sector_size;
        return 0;
        return fst.st_size % sector_size;
    }
    auto disk_image::cleanup() -> int
    {
        std::lock_guard<std::recursive_mutex> m_lock(m_mtx);
        int ret{-EBADFD};
        if (m_filedes) {
            if (m_filedes) {


@@ 40,10 42,11 @@ namespace purefs::blkdev
    }
    auto disk_image::write(const void *buf, sector_t lba, std::size_t count) -> int
    {
        std::lock_guard<std::recursive_mutex> m_lock(m_mtx);
        if (!range_valid(lba, count)) {
            return -ERANGE;
        }
        auto offs = ::lseek(m_filedes, off_t(lba) * sector_size, SEEK_SET);
        auto offs = ::lseek64(m_filedes, off64_t(lba) * off64_t(sector_size), SEEK_SET);
        if (offs < 0) {
            return offs;
        }


@@ 67,10 70,11 @@ namespace purefs::blkdev
    }
    auto disk_image::read(void *buf, sector_t lba, std::size_t count) -> int
    {
        std::lock_guard<std::recursive_mutex> m_lock(m_mtx);
        if (!range_valid(lba, count)) {
            return -ERANGE;
        }
        auto offs = ::lseek(m_filedes, off_t(lba) * sector_size, SEEK_SET);
        auto offs = ::lseek64(m_filedes, off64_t(lba) * off64_t(sector_size), SEEK_SET);
        if (offs < 0) {
            return offs;
        }


@@ 88,6 92,7 @@ namespace purefs::blkdev
    }
    auto disk_image::sync() -> int
    {
        std::lock_guard<std::recursive_mutex> m_lock(m_mtx);
        int ret{-EBADFD};
        if (m_filedes) {
            ret = fsync(m_filedes);


@@ 98,6 103,7 @@ namespace purefs::blkdev
    }
    auto disk_image::status() const -> media_status
    {
        std::lock_guard<std::recursive_mutex> m_lock(m_mtx);
        struct stat st;
        auto ret = ::stat(m_image_name.c_str(), &st);
        if (!ret)


@@ 107,6 113,7 @@ namespace purefs::blkdev
    }
    auto disk_image::get_info(info_type what) const -> scount_t
    {
        std::lock_guard<std::recursive_mutex> m_lock(m_mtx);
        switch (what) {
        case info_type::sector_size:
            return sector_size;

M module-vfs/board/rt1051/purefs/src/vfs_subsystem_internal.cpp => module-vfs/board/rt1051/purefs/src/vfs_subsystem_internal.cpp +1 -1
@@ 1,4 1,4 @@
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include <purefs/vfs_subsystem_internal.hpp>