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);
}