diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 198f3b93..5de2adac 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -112,7 +112,7 @@ jobs: table[$i,$j]=$c_camel ((j+=1)) - for s in code stack struct + for s in code stack structs do f=sizes/thumb${c:+-$c}.$s.csv [ -e $f ] && table[$i,$j]=$( \ diff --git a/DESIGN.md b/DESIGN.md index 1d02ba3b..9c9703a6 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -59,7 +59,7 @@ This leaves us with three major requirements for an embedded filesystem. RAM to temporarily store filesystem metadata. For ROM, this means we need to keep our design simple and reuse code paths - were possible. For RAM we have a stronger requirement, all RAM usage is + where possible. For RAM we have a stronger requirement, all RAM usage is bounded. This means RAM usage does not grow as the filesystem changes in size or number of files. This creates a unique challenge as even presumably simple operations, such as traversing the filesystem, become surprisingly @@ -626,7 +626,7 @@ log₂_n_ pointers that skip to different preceding elements of the skip-list. The name comes from heavy use of the [CTZ instruction][wikipedia-ctz], which -lets us calculate the power-of-two factors efficiently. For a give block _n_, +lets us calculate the power-of-two factors efficiently. For a given block _n_, that block contains ctz(_n_)+1 pointers. ``` diff --git a/lfs2.c b/lfs2.c index d89c42fd..e54b9734 100644 --- a/lfs2.c +++ b/lfs2.c @@ -2151,9 +2151,11 @@ static int lfs2_dir_splittingcompact(lfs2_t *lfs2, lfs2_mdir_t *dir, return size; } - // do we have extra space? littlefs can't reclaim this space - // by itself, so expand cautiously - if ((lfs2_size_t)size < lfs2->block_count/2) { + // littlefs cannot reclaim expanded superblocks, so expand cautiously + // + // if our filesystem is more than ~88% full, don't expand, this is + // somewhat arbitrary + if (lfs2->block_count - size > lfs2->block_count/8) { LFS2_DEBUG("Expanding superblock at rev %"PRIu32, dir->rev); int err = lfs2_dir_split(lfs2, dir, attrs, attrcount, source, begin, end);