From 3f31c8cba31e0f6cef5b02dba2e050d8df1168b7 Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Thu, 9 Nov 2017 19:28:55 -0600 Subject: [PATCH] Fixed corner case with immediate exhaustion and lookahead==block_count The previous math for determining if we scanned all of disk wasn't set up correctly in the lfs_mount function. If lookahead == block_count the lfs_alloc function would think we had already searched the entire disk. This is only an issue if we manage to exhaust a block on the first pass after mount, since lfs_alloc_ack resets the lookahead region into a valid state after a succesful block allocation. --- lfs.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lfs.c b/lfs.c index dc2ae65..b043bd9 100644 --- a/lfs.c +++ b/lfs.c @@ -1922,7 +1922,7 @@ int lfs_format(lfs_t *lfs, const struct lfs_config *cfg) { memset(lfs->free.buffer, 0, lfs->cfg->lookahead/8); lfs->free.begin = 0; lfs->free.off = 0; - lfs->free.end = lfs->free.begin + lfs->cfg->block_count; + lfs->free.end = lfs->free.begin + lfs->free.off + lfs->cfg->block_count; // create superblock dir lfs_alloc_ack(lfs); @@ -2000,7 +2000,7 @@ int lfs_mount(lfs_t *lfs, const struct lfs_config *cfg) { // setup free lookahead lfs->free.begin = -lfs->cfg->lookahead; lfs->free.off = lfs->cfg->lookahead; - lfs->free.end = lfs->free.begin + lfs->cfg->block_count; + lfs->free.end = lfs->free.begin + lfs->free.off + lfs->cfg->block_count; // load superblock lfs_dir_t dir;