Skip to content

Commit 425aa3c

Browse files
committed
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 5ee20e8 commit 425aa3c

File tree

2 files changed

+5
-6
lines changed

2 files changed

+5
-6
lines changed

Diff for: .travis.yml

+3-4
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

Diff for: lfs.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -2040,8 +2040,8 @@ int lfs_mount(lfs_t *lfs, const struct lfs_config *cfg) {
20402040
}
20412041

20422042
// setup free lookahead
2043-
lfs->free.begin = -lfs->cfg->lookahead;
2044-
lfs->free.off = lfs->cfg->lookahead;
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)