Merge pull request #233 from ARMmbed/discourage-no-wear-leveling

Change block_cycles disable from 0 to -1
This commit is contained in:
Christopher Haster
2019-07-28 21:35:48 -05:00
committed by GitHub
3 changed files with 18 additions and 8 deletions

View File

@@ -123,7 +123,7 @@ jobs:
if: branch !~ -prefix$ if: branch !~ -prefix$
install: install:
- sudo apt-get install libfuse-dev - sudo apt-get install libfuse-dev
- git clone --depth 1 https://github.com/geky/littlefs-fuse -b v2-alpha - git clone --depth 1 https://github.com/geky/littlefs-fuse -b v2
- fusermount -V - fusermount -V
- gcc --version - gcc --version
before_script: before_script:
@@ -158,7 +158,7 @@ jobs:
if: branch !~ -prefix$ if: branch !~ -prefix$
install: install:
- sudo apt-get install libfuse-dev - sudo apt-get install libfuse-dev
- git clone --depth 1 https://github.com/geky/littlefs-fuse -b v2-alpha v2 - git clone --depth 1 https://github.com/geky/littlefs-fuse -b v2 v2
- git clone --depth 1 https://github.com/geky/littlefs-fuse -b v1 v1 - git clone --depth 1 https://github.com/geky/littlefs-fuse -b v1 v1
- fusermount -V - fusermount -V
- gcc --version - gcc --version

12
lfs.c
View File

@@ -1468,7 +1468,7 @@ static int lfs_dir_compact(lfs_t *lfs,
// increment revision count // increment revision count
dir->rev += 1; dir->rev += 1;
if (lfs->cfg->block_cycles && if (lfs->cfg->block_cycles > 0 &&
(dir->rev % (lfs->cfg->block_cycles+1) == 0)) { (dir->rev % (lfs->cfg->block_cycles+1) == 0)) {
if (lfs_pair_cmp(dir->pair, (const lfs_block_t[2]){0, 1}) == 0) { if (lfs_pair_cmp(dir->pair, (const lfs_block_t[2]){0, 1}) == 0) {
// oh no! we're writing too much to the superblock, // oh no! we're writing too much to the superblock,
@@ -3226,8 +3226,14 @@ static int lfs_init(lfs_t *lfs, const struct lfs_config *cfg) {
LFS_ASSERT(4*lfs_npw2(0xffffffff / (lfs->cfg->block_size-2*4)) LFS_ASSERT(4*lfs_npw2(0xffffffff / (lfs->cfg->block_size-2*4))
<= lfs->cfg->block_size); <= lfs->cfg->block_size);
// we don't support some corner cases // block_cycles = 0 is no longer supported.
LFS_ASSERT(lfs->cfg->block_cycles < 0xffffffff); //
// block_cycles is the number of erase cycles before littlefs evicts
// metadata logs as a part of wear leveling. Suggested values are in the
// range of 100-1000, or set block_cycles to -1 to disable block-level
// wear-leveling.
LFS_ASSERT(lfs->cfg->block_cycles != 0);
// setup read cache // setup read cache
if (lfs->cfg->read_buffer) { if (lfs->cfg->read_buffer) {

10
lfs.h
View File

@@ -191,9 +191,13 @@ struct lfs_config {
// Number of erasable blocks on the device. // Number of erasable blocks on the device.
lfs_size_t block_count; lfs_size_t block_count;
// Number of erase cycles before we should move data to another block. // Number of erase cycles before littlefs evicts metadata logs and moves
// May be zero, in which case no block-level wear-leveling is performed. // the metadata to another block. Suggested values are in the
uint32_t block_cycles; // range 100-1000, with large values having better performance at the cost
// of less consistent wear distribution.
//
// Set to -1 to disable block-level wear-leveling.
int32_t block_cycles;
// Size of block caches. Each cache buffers a portion of a block in RAM. // Size of block caches. Each cache buffers a portion of a block in RAM.
// The littlefs needs a read cache, a program cache, and one additional // The littlefs needs a read cache, a program cache, and one additional