Skip to content

Commit

Permalink
(bugfix) adding line function to clear out all the global 'free' info…
Browse files Browse the repository at this point in the history
…rmation so that we can reset it after a failed traversal
  • Loading branch information
Derek Thrasher authored and geky committed Mar 29, 2020
1 parent 4677421 commit d498b9f
Showing 1 changed file with 14 additions and 4 deletions.
18 changes: 14 additions & 4 deletions lfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
#define LFS_BLOCK_NULL ((lfs_block_t)-1)
#define LFS_BLOCK_INLINE ((lfs_block_t)-2)

static void lfs_alloc_ack(lfs_t *lfs);

/// Caching block device operations ///
static inline void lfs_cache_drop(lfs_t *lfs, lfs_cache_t *rcache) {
// do not zero, cheaper if cache is readonly or only going to be
Expand All @@ -24,6 +26,15 @@ static inline void lfs_cache_zero(lfs_t *lfs, lfs_cache_t *pcache) {
pcache->block = LFS_BLOCK_NULL;
}

/// Invalidate the lookahead buffer. This is done during mounting and failed traversals ///
static inline void lfs_setup_invalid_lookahead_buffer(lfs_t *lfs)
{
lfs->free.off = lfs->seed % lfs->cfg->block_size;
lfs->free.size = 0;
lfs->free.i = 0;
lfs_alloc_ack(lfs);
}

static int lfs_bd_read(lfs_t *lfs,
const lfs_cache_t *pcache, lfs_cache_t *rcache, lfs_size_t hint,
lfs_block_t block, lfs_off_t off,
Expand Down Expand Up @@ -477,6 +488,7 @@ static int lfs_alloc(lfs_t *lfs, lfs_block_t *block) {
memset(lfs->free.buffer, 0, lfs->cfg->lookahead_size);
int err = lfs_fs_traverseraw(lfs, lfs_alloc_lookahead, lfs, true);
if (err) {
lfs_setup_invalid_lookahead_buffer(lfs);
return err;
}
}
Expand Down Expand Up @@ -3772,10 +3784,7 @@ int lfs_mount(lfs_t *lfs, const struct lfs_config *cfg) {
lfs->gdisk = lfs->gstate;

// setup free lookahead
lfs->free.off = lfs->seed % lfs->cfg->block_size;
lfs->free.size = 0;
lfs->free.i = 0;
lfs_alloc_ack(lfs);
lfs_setup_invalid_lookahead_buffer(lfs);

LFS_TRACE("lfs_mount -> %d", 0);
return 0;
Expand Down Expand Up @@ -4594,6 +4603,7 @@ static int lfs1_mount(lfs_t *lfs, struct lfs1 *lfs1,
lfs->lfs1->root[1] = LFS_BLOCK_NULL;

// setup free lookahead
// TODO should this also call lfs_setup_invalid_lookahead_buffer(lfs); the free.off is different in the current version of lfs
lfs->free.off = 0;
lfs->free.size = 0;
lfs->free.i = 0;
Expand Down

0 comments on commit d498b9f

Please sign in to comment.