From a6766b27dbd866e8f62f733fb000898851f9a13e Mon Sep 17 00:00:00 2001 From: Lucjan Bryndza Date: Thu, 17 Dec 2020 12:39:18 +0100 Subject: [PATCH] [EGD-4758] Fix littlefs directory iterator Directory iterator now seams to be working --- .../src/purefs/fs/filesystem_littlefs.cpp | 40 +++++-------------- .../src/thirdparty/littlefs/lfs_glue.cpp | 7 ++-- .../tests/unittest_filesystem_littlefs.cpp | 36 +++++++++-------- 3 files changed, 33 insertions(+), 50 deletions(-) diff --git a/module-vfs/drivers/src/purefs/fs/filesystem_littlefs.cpp b/module-vfs/drivers/src/purefs/fs/filesystem_littlefs.cpp index ff0fe70a8a4ffbf2249e928a28c278328ae39dfb..7b4af5a2e5a909062a00f9d5f37ed68dc3aa5e8d 100644 --- a/module-vfs/drivers/src/purefs/fs/filesystem_littlefs.cpp +++ b/module-vfs/drivers/src/purefs/fs/filesystem_littlefs.cpp @@ -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(dirstate); - if (!vdir) { - LOG_ERROR("Non LITTLEFS filesystem directory pointer"); - return -EBADF; - } - auto mntp = std::static_pointer_cast(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(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 diff --git a/module-vfs/drivers/src/thirdparty/littlefs/lfs_glue.cpp b/module-vfs/drivers/src/thirdparty/littlefs/lfs_glue.cpp index eff72bf296ce16c82da796a12673d2b6042aa2be..e76bae15bb4f254bcd89ee449aad99c55e68c76e 100644 --- a/module-vfs/drivers/src/thirdparty/littlefs/lfs_glue.cpp +++ b/module-vfs/drivers/src/thirdparty/littlefs/lfs_glue.cpp @@ -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(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); diff --git a/module-vfs/tests/unittest_filesystem_littlefs.cpp b/module-vfs/tests/unittest_filesystem_littlefs.cpp index 050f4dba57c94f8ede31ebd169c7c1f8b83ee099..2aaa7fa3e2811b76efb9d2844eb06e2fd32a97a3 100644 --- a/module-vfs/tests/unittest_filesystem_littlefs.cpp +++ b/module-vfs/tests/unittest_filesystem_littlefs.cpp @@ -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); }