~aleteoryx/muditaos

a6766b27dbd866e8f62f733fb000898851f9a13e — Lucjan Bryndza 5 years ago 26b7917
[EGD-4758] Fix littlefs directory iterator

Directory iterator now seams to be working
M module-vfs/drivers/src/purefs/fs/filesystem_littlefs.cpp => module-vfs/drivers/src/purefs/fs/filesystem_littlefs.cpp +9 -31
@@ 418,40 418,18 @@ namespace purefs::fs::drivers

    auto filesystem_littlefs::dirnext(fsdir dirstate, std::string &filename, struct stat &filestat) -> int
    {
        auto vdir = std::dynamic_pointer_cast<directory_handle_littlefs>(dirstate);
        if (!vdir) {
            LOG_ERROR("Non LITTLEFS filesystem directory pointer");
            return -EBADF;
        }
        auto mntp = std::static_pointer_cast<mount_point_littlefs>(vdir->mntpoint());
        if (!mntp) {
            LOG_ERROR("Non LITTLEFS mount point");
            return -EBADF;
        }
        int lerr;
        ::lfs_info linfo;
        {
            cpp_freertos::LockGuard _lck(m_lock);
            lerr = ::lfs_dir_read(mntp->lfs_mount(), vdir->lfs_dirp(), &linfo);
            if (!lerr) {
                const auto loffs = ::lfs_dir_tell(mntp->lfs_mount(), vdir->lfs_dirp());
                if (loffs >= 0) {
                    lerr = ::lfs_dir_seek(mntp->lfs_mount(), vdir->lfs_dirp(), loffs + 1);
                }
                else {
                    lerr = loffs;
                    LOG_ERROR("LFS unable to seek dir %i", lerr);
                }
            }
            else {
                LOG_ERROR("LFS unable to read dir %i", lerr);
            }
        }
        if (!lerr) {
        lfs_info linfo;
        int err = invoke_lfs(m_lock, dirstate, ::lfs_dir_read, &linfo);
        if (err == 1) {
            auto mntp = std::static_pointer_cast<mount_point_littlefs>(dirstate->mntpoint());
            translate_lfsinfo_to_stat(linfo, *mntp->lfs_config(), filestat);
            filename = linfo.name;
            err      = 0;
        }
        return lfs_to_errno(lerr);
        else if (err == 0) {
            err = -ENODATA;
        }
        return err;
    }

    auto filesystem_littlefs::dirclose(fsdir dirstate) noexcept -> int

M module-vfs/drivers/src/thirdparty/littlefs/lfs_glue.cpp => module-vfs/drivers/src/thirdparty/littlefs/lfs_glue.cpp +4 -3
@@ 64,6 64,7 @@ namespace purefs::fs::drivers::littlefs::internal
            }
            int read(const struct lfs_config *lfsc, lfs_block_t block, lfs_off_t off, void *buffer, lfs_size_t size)
            {
                // LOG_DEBUG("lfs_read_req(block=%u off=%u size=%u", unsigned(block), unsigned(off), unsigned(size));
                auto ctx = reinterpret_cast<io_context *>(lfsc->context);
                if (!ctx) {
                    return LFS_ERR_IO;


@@ 72,7 73,7 @@ namespace purefs::fs::drivers::littlefs::internal
                if (!diskmm) {
                    return LFS_ERR_IO;
                }
                const auto lba = (uint64_t(lfsc->block_size) * block + off) / ctx->sector_size;
                const auto lba = (uint64_t(lfsc->block_size) * block) / ctx->sector_size;
                if (off % ctx->sector_size) {
                    LOG_ERROR("Partial offset not supported");
                    return LFS_ERR_IO;


@@ 100,12 101,12 @@ namespace purefs::fs::drivers::littlefs::internal
                if (!diskmm) {
                    return LFS_ERR_IO;
                }
                const auto lba = (uint64_t(lfsc->block_size) * block + off) / ctx->sector_size;
                const auto lba = (uint64_t(lfsc->block_size) * block) / ctx->sector_size;
                if (off % ctx->sector_size) {
                    LOG_ERROR("Partial offset not supported");
                    return LFS_ERR_IO;
                }
                const std::size_t lba_sz = (size * lfsc->block_size) / ctx->sector_size;
                const std::size_t lba_sz = size / ctx->sector_size;
                const auto err           = diskmm->write(ctx->disk_h, buffer, lba, lba_sz);
                if (err) {
                    LOG_ERROR("Sector read error %i", err);

M module-vfs/tests/unittest_filesystem_littlefs.cpp => module-vfs/tests/unittest_filesystem_littlefs.cpp +20 -16
@@ 71,7 71,7 @@ TEST_CASE("littlefs: Basic API test")
        ret = fscore.open("/sys/ala/ma/kota/", 0, 0);
        REQUIRE(ret == -ENOENT);
        // Simple file test
        int hwnd = fscore.open("/sys/.boot.json", 0, 0);
        int hwnd = fscore.open("/sys/fonts/gt_pressura_bold_27.mpf", 0, 0);
        REQUIRE(hwnd >= 3);
        std::cout << "File open handle " << hwnd << std::endl;
        struct stat st;


@@ 83,22 83,26 @@ TEST_CASE("littlefs: Basic API test")
        REQUIRE(ret > 0);
        ret = fscore.close(hwnd);
        REQUIRE(ret == 0);
        {
            // Simple directory test
            auto dirhandle = fscore.diropen("/sys");
            REQUIRE(dirhandle);
            REQUIRE(dirhandle->error() == 0);
            for (std::string fnm;;) {
                if (fscore.dirnext(dirhandle, fnm, st) != 0) {
                    break;
                }
                else {
                    std::cout << "name " << fnm << " size " << st.st_size << std::endl;
                }
    }
    {
        struct stat st;
        int ndirs{};
        // Simple directory test
        auto dirhandle = fscore.diropen("/sys/fonts/");
        REQUIRE(dirhandle);
        REQUIRE(dirhandle->error() == 0);
        for (std::string fnm;;) {
            if (fscore.dirnext(dirhandle, fnm, st) != 0) {
                break;
            }
            else {
                std::cout << "name " << fnm << " size " << st.st_size << std::endl;
                ndirs++;
            }
            fscore.dirclose(dirhandle);
        }
        ret = fscore.umount("/sys");
        REQUIRE(ret == 0);
        fscore.dirclose(dirhandle);
        REQUIRE(ndirs > 0);
    }
    ret = fscore.umount("/sys");
    REQUIRE(ret == 0);
}