diff --git a/lfs.c b/lfs.c index 38b825dd..f24002ba 100644 --- a/lfs.c +++ b/lfs.c @@ -654,20 +654,27 @@ static int lfs_alloc(lfs_t *lfs, lfs_block_t *block) { return LFS_ERR_NOSPC; } - lfs->free.off = (lfs->free.off + lfs->free.size) - % lfs->cfg->block_count; - lfs->free.size = lfs_min(8*lfs->cfg->lookahead_size, lfs->free.ack); - lfs->free.i = 0; - - // find mask of free blocks from tree - memset(lfs->free.buffer, 0, lfs->cfg->lookahead_size); - int err = lfs_fs_rawtraverse(lfs, lfs_alloc_lookahead, lfs, true); - if (err) { - lfs_alloc_drop(lfs); + int err = lfs_find_free_blocks(lfs); + if(err) { return err; } } } + +int lfs_find_free_blocks(lfs_t *lfs){ + lfs->free.off = (lfs->free.off + lfs->free.size) + % lfs->cfg->block_count; + lfs->free.size = lfs_min(8*lfs->cfg->lookahead_size, lfs->free.ack); + lfs->free.i = 0; + + // find mask of free blocks from tree + memset(lfs->free.buffer, 0, lfs->cfg->lookahead_size); + int const err = lfs_fs_rawtraverse(lfs, lfs_alloc_lookahead, lfs, true); + if (err) { + lfs_alloc_drop(lfs); + } + return err; +} #endif /// Metadata pair and directory operations /// diff --git a/lfs.h b/lfs.h index 1081735f..004e1465 100644 --- a/lfs.h +++ b/lfs.h @@ -705,6 +705,10 @@ lfs_ssize_t lfs_fs_size(lfs_t *lfs); // Returns a negative error code on failure. int lfs_fs_traverse(lfs_t *lfs, int (*cb)(void*, lfs_block_t), void *data); +// Use Traverse function and try to find free blocks. LittleFS free blocks search is unpredictable. +// Search is costly operation which may delay write. In realtime write scenarios can be better to find them before a write. +int lfs_find_free_blocks(lfs_t *lfs); + #ifndef LFS_READONLY // Attempt to make the filesystem consistent and ready for writing //