From a036b7512107c6cc92de237d22ec1839768eba70 Mon Sep 17 00:00:00 2001 From: Lucjan Bryndza Date: Wed, 16 Dec 2020 17:14:30 +0100 Subject: [PATCH] [EGD-4758] Fix littlefs boundary check Currently littlefs boudary is checked in the wrong place this commit fix this issue --- .../src/purefs/fs/filesystem_littlefs.cpp | 7 +++- .../src/thirdparty/littlefs/lfs_glue.cpp | 12 +++--- module-vfs/src/purefs/fs/filesystem.cpp | 2 +- .../tests/unittest_filesystem_littlefs.cpp | 38 +++++++++++++++++-- 4 files changed, 48 insertions(+), 11 deletions(-) diff --git a/module-vfs/drivers/src/purefs/fs/filesystem_littlefs.cpp b/module-vfs/drivers/src/purefs/fs/filesystem_littlefs.cpp index 9b153a942766544605f0f3e33d140ba9da3c4132..ff0fe70a8a4ffbf2249e928a28c278328ae39dfb 100644 --- a/module-vfs/drivers/src/purefs/fs/filesystem_littlefs.cpp +++ b/module-vfs/drivers/src/purefs/fs/filesystem_littlefs.cpp @@ -108,8 +108,13 @@ namespace cfg->block_cycles = 512; cfg->block_size = 0; // Read later from superblock cfg->block_count = 0; // Read later from super block - cfg->cache_size = 32768; cfg->lookahead_size = 8192; + // TODO: Read lfs configuration from the superblock + cfg->block_size = 4096; + cfg->read_size = cfg->block_size; + cfg->prog_size = cfg->block_size; + cfg->cache_size = cfg->block_size; + cfg->block_count = 261887; } } // namespace diff --git a/module-vfs/drivers/src/thirdparty/littlefs/lfs_glue.cpp b/module-vfs/drivers/src/thirdparty/littlefs/lfs_glue.cpp index 76db9957163465200cf6617bacadb503f523bb53..eff72bf296ce16c82da796a12673d2b6042aa2be 100644 --- a/module-vfs/drivers/src/thirdparty/littlefs/lfs_glue.cpp +++ b/module-vfs/drivers/src/thirdparty/littlefs/lfs_glue.cpp @@ -77,8 +77,12 @@ namespace purefs::fs::drivers::littlefs::internal LOG_ERROR("Partial offset not supported"); return LFS_ERR_IO; } - const std::size_t lba_sz = (size * lfsc->block_size) / ctx->sector_size; - const auto err = diskmm->read(ctx->disk_h, buffer, lba, lba_sz); + const std::size_t lba_sz = size / ctx->sector_size; + if (size % ctx->sector_size) { + LOG_ERROR("Bounary read sz error"); + return LFS_ERR_IO; + } + const auto err = diskmm->read(ctx->disk_h, buffer, lba, lba_sz); if (err) { LOG_ERROR("Sector read error %i", err); } @@ -157,10 +161,6 @@ namespace purefs::fs::drivers::littlefs::internal LOG_ERROR("Unable to get sector size %li", long(sect_size)); return sect_size; } - if (sect_size % lfsc->block_size || lfsc->block_size < sect_size) { - LOG_ERROR("Sector size doesn't match block size"); - return -ERANGE; - } auto ctx = new lfs_io::io_context(diskmm, diskh, sect_size); lfsc->context = ctx; lfsc->read = lfs_io::read; diff --git a/module-vfs/src/purefs/fs/filesystem.cpp b/module-vfs/src/purefs/fs/filesystem.cpp index 77bf0ec95b193c28c35ca6d9562a935ebcdcd2ac..42a4f0093a90a207eb8ee748e2d2191f3e0faa5a 100644 --- a/module-vfs/src/purefs/fs/filesystem.cpp +++ b/module-vfs/src/purefs/fs/filesystem.cpp @@ -120,11 +120,11 @@ namespace purefs::fs LOG_ERROR("Unable to lock filesystem operation"); return -EIO; } + const auto diskh = mnti->second->disk(); const auto umnt_ret = fsops->umount(mnti->second); if (umnt_ret) { return umnt_ret; } - const auto diskh = mnti->second->disk(); if (diskh) { m_partitions.erase(std::string(diskh->name())); } diff --git a/module-vfs/tests/unittest_filesystem_littlefs.cpp b/module-vfs/tests/unittest_filesystem_littlefs.cpp index f75cf8445d1d98acb0ac2b88d93eef20689a1ae6..35ba809e86db557d31a499e889a9d0fa7e2215da 100644 --- a/module-vfs/tests/unittest_filesystem_littlefs.cpp +++ b/module-vfs/tests/unittest_filesystem_littlefs.cpp @@ -5,9 +5,41 @@ #include #include #include -#include +#include #include #include -TEST_CASE("Littlefs: Basic tests") -{} +namespace +{ + constexpr auto disk_image = "lfstest.img"; +} + +TEST_CASE("Littlefs: Basic mount and functionality") +{ + using namespace purefs; + auto dm = std::make_shared(); + auto disk = std::make_shared(disk_image); + REQUIRE(disk); + REQUIRE(dm->register_device(disk, "emmc0") == 0); + purefs::fs::filesystem fscore(dm); + const auto vfs_vfat = std::make_shared(); + REQUIRE(vfs_vfat->mount_count() == 0); + auto ret = fscore.register_filesystem("littlefs", vfs_vfat); + REQUIRE(ret == 0); + ret = fscore.mount("emmc0part0", "/sys", "littlefs"); + REQUIRE(ret == 0); + REQUIRE(vfs_vfat->mount_count() == 1); + REQUIRE(fscore.umount("/ala") == -ENOENT); + ret = fscore.mount("emmc0part0", "/sys", "vfat"); + REQUIRE(ret == -EBUSY); + ret = fscore.mount("emmc0part0", "/path", "vfat"); + REQUIRE(ret == -EBUSY); + ret = fscore.umount("/sys"); + REQUIRE(ret == 0); + REQUIRE(vfs_vfat->mount_count() == 0); + ret = fscore.mount("emmc0part0", "/path", "littlefs"); + REQUIRE(ret == 0); + REQUIRE(vfs_vfat->mount_count() == 1); + ret = fscore.umount("/path"); + REQUIRE(ret == 0); +}