Skip to content

Commit 0b747e7

Browse files
gekycmonr
authored andcommitted
littlefs: Fixed issue with immediate exhaustion and small unaligned storage
This was a small hole in the logic that handles initializing the lookahead buffer. To imitate exhaustion (so the block allocator will trigger a scan), the lookahead buffer is rewound a full lookahead and set up to look like it is exhausted. However, unlike normal allocation, this rewind was not kept aligned to a multiple of the scan size, which is limited by both the lookahead buffer and the total storage size. This bug went unnoticed for so long because it only causes problems when the block device is both: 1. Not aligned to the lookahead buffer (not a power of 2) 2. Smaller than the lookahead buffer While this seems like a strange corner case for a block device, this turned out to be very common for internal flash, especially when a handleful of blocks are reserved for code.
1 parent 6c819c4 commit 0b747e7

File tree

3 files changed

+10
-12
lines changed

3 files changed

+10
-12
lines changed

.travis.yml

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -142,11 +142,10 @@ matrix:
142142
# Run local littlefs tests
143143
- CFLAGS="-Wno-format" make -C$LITTLEFS/littlefs test QUIET=1
144144
# Run local littlefs tests with set of variations
145-
- CFLAGS="-Wno-format -DLFS_READ_SIZE=64 -DLFS_PROG_SIZE=64" make -C$LITTLEFS/littlefs test QUIET=1
146-
- CFLAGS="-Wno-format -DLFS_READ_SIZE=1 -DLFS_PROG_SIZE=1" make -C$LITTLEFS/littlefs test QUIET=1
147-
- CFLAGS="-Wno-format -DLFS_READ_SIZE=512 -DLFS_PROG_SIZE=512" make -C$LITTLEFS/littlefs test QUIET=1
148-
- CFLAGS="-Wno-format -DLFS_BLOCK_COUNT=1023" make -C$LITTLEFS/littlefs test QUIET=1
149-
- CFLAGS="-Wno-format -DLFS_LOOKAHEAD=2048" make -C$LITTLEFS/littlefs test QUIET=1
145+
- CFLAGS="-Wno-format -DLFS_READ_SIZE=64 -DLFS_PROG_SIZE=64" make -C$LITTLEFS/littlefs test QUIET=1
146+
- CFLAGS="-Wno-format -DLFS_READ_SIZE=1 -DLFS_PROG_SIZE=1" make -C$LITTLEFS/littlefs test QUIET=1
147+
- CFLAGS="-Wno-format -DLFS_READ_SIZE=512 -DLFS_PROG_SIZE=512" make -C$LITTLEFS/littlefs test QUIET=1
148+
- CFLAGS="-Wno-format -DLFS_BLOCK_COUNT=1023 -DLFS_LOOKAHEAD=2048" make -C$LITTLEFS/littlefs test QUIET=1
150149
# Self-hosting littlefs fuzz test with littlefs-fuse
151150
- make -Clittlefs_fuse
152151
- littlefs_fuse/lfs --format /dev/loop0

features/filesystem/littlefs/littlefs/.travis.yml

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,9 @@ script:
1212
- make test QUIET=1
1313

1414
# run tests with a few different configurations
15-
- CFLAGS="-DLFS_READ_SIZE=1 -DLFS_PROG_SIZE=1" make test QUIET=1
16-
- CFLAGS="-DLFS_READ_SIZE=512 -DLFS_PROG_SIZE=512" make test QUIET=1
17-
- CFLAGS="-DLFS_BLOCK_COUNT=1023" make test QUIET=1
18-
- CFLAGS="-DLFS_LOOKAHEAD=2048" make test QUIET=1
15+
- CFLAGS="-DLFS_READ_SIZE=1 -DLFS_PROG_SIZE=1" make test QUIET=1
16+
- CFLAGS="-DLFS_READ_SIZE=512 -DLFS_PROG_SIZE=512" make test QUIET=1
17+
- CFLAGS="-DLFS_BLOCK_COUNT=1023 -DLFS_LOOKAHEAD=2048" make test QUIET=1
1918

2019
# self-host with littlefs-fuse for fuzz test
2120
- make -C littlefs-fuse

features/filesystem/littlefs/littlefs/lfs.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2039,9 +2039,9 @@ int lfs_mount(lfs_t *lfs, const struct lfs_config *cfg) {
20392039
return err;
20402040
}
20412041

2042-
// setup free lookahead
2043-
lfs->free.begin = -lfs->cfg->lookahead;
2044-
lfs->free.off = lfs->cfg->lookahead;
2042+
// setup free lookahead, rewind so first allocation triggers a scan
2043+
lfs->free.begin = -lfs_min(lfs->cfg->lookahead, lfs->cfg->block_count);
2044+
lfs->free.off = -lfs->free.begin;
20452045
lfs->free.end = lfs->free.begin + lfs->free.off + lfs->cfg->block_count;
20462046

20472047
// load superblock

0 commit comments

Comments
 (0)