bmap: Enabled at least opportunistic bmap allocations

This doesn't fully replace the lookahead buffer, but at least augments
it with known bmap state when available.

To be honest, this is a minimal effort hack to try to get something
benchmarkable without dealing with all the catch-22 issues that a
self-support bmap allocator would encounter (allocating blocks for the
bmap requires a bmap, oh no).

Though now that I'm writing this, maybe this is a reasonable long-term
solution? Having the lookahead buffer to fall back on solves a lot of
problems, and, realistically, it's unlikely to be a performance
bottleneck unless the user has extreme write requests (>available
storage?).

---

Also tweaked field naming to be consistent between the bmap and
lookahead buffer.
This commit is contained in:
Christopher Haster
2025-07-28 01:11:48 -05:00
parent 838a4beee1
commit 71b9ad2412
4 changed files with 172 additions and 97 deletions
+112 -40
View File
@@ -7785,6 +7785,12 @@ static int lfs3_rbyd_appendgdelta(lfs3_t *lfs3, lfs3_rbyd_t *rbyd) {
// pending gbmap state?
#ifdef LFS3_BMAP
// TODO is this the right place?
// try to update to most recent lookahead window
lfs3->gbmap.window = (lfs3->lookahead.window + lfs3->lookahead.off)
% lfs3->cfg->block_count;
lfs3->gbmap.known = lfs3->lookahead.bmapped;
uint8_t gbmapdelta_[LFS3_GBMAP_DSIZE];
lfs3_data_fromgbmap(lfs3, gbmapdelta_);
lfs3_memxor(gbmapdelta_, lfs3->gbmap_p, LFS3_GBMAP_DSIZE);
@@ -10282,8 +10288,8 @@ static lfs3_stag_t lfs3_mtree_traverse_(lfs3_t *lfs3, lfs3_trv_t *trv,
}
// needed in lfs3_mtree_traverse
static void lfs3_alloc_markinuse(lfs3_t *lfs3,
lfs3_tag_t tag, const lfs3_bptr_t *bptr_);
static void lfs3_alloc_markbptr(lfs3_t *lfs3,
lfs3_tag_t tag, const lfs3_bptr_t *bptr);
// high-level immutable traversal, handle extra features here,
// but no mutation! (we're called in lfs3_alloc, so things would end up
@@ -10412,7 +10418,7 @@ eot:;
// needed in lfs3_mtree_gc
static int lfs3_mdir_mkconsistent(lfs3_t *lfs3, lfs3_mdir_t *mdir);
static void lfs3_alloc_markfree(lfs3_t *lfs3);
static void lfs3_alloc_markfree(lfs3_t *lfs3, lfs3_block_t known);
// high-level mutating traversal, handle extra features that require
// mutation here, upper layers should call lfs3_alloc_ckpoint as needed
@@ -10439,7 +10445,7 @@ dropped:;
// track in-use blocks?
#ifndef LFS3_2BONLY
if (lfs3_t_islookahead(trv->b.h.flags)) {
lfs3_alloc_markinuse(lfs3, tag, bptr_);
lfs3_alloc_markbptr(lfs3, tag, bptr_);
}
#endif
@@ -10516,7 +10522,7 @@ eot:;
&& !lfs3_t_ismtreeonly(trv->b.h.flags)
&& !lfs3_t_isdirty(trv->b.h.flags)
&& !lfs3_t_ismutated(trv->b.h.flags)) {
lfs3_alloc_markfree(lfs3);
lfs3_alloc_markfree(lfs3, lfs3->lookahead.ckpoint);
}
#endif
@@ -10546,8 +10552,8 @@ eot:;
#if !defined(LFS3_RDONLY) && !defined(LFS3_2BONLY) && defined(LFS3_BMAP)
static lfs3_data_t lfs3_data_fromgbmap(const lfs3_t *lfs3,
uint8_t buffer[static LFS3_GBMAP_DSIZE]) {
// cursor should not exceed 31-bits
LFS3_ASSERT(lfs3->gbmap.cursor <= 0x7fffffff);
// window should not exceed 31-bits
LFS3_ASSERT(lfs3->gbmap.window <= 0x7fffffff);
// known should not exceed 31-bits
LFS3_ASSERT(lfs3->gbmap.known <= 0x7fffffff);
@@ -10555,7 +10561,7 @@ static lfs3_data_t lfs3_data_fromgbmap(const lfs3_t *lfs3,
lfs3_memset(buffer, 0, LFS3_GBMAP_DSIZE);
lfs3_ssize_t d = 0;
lfs3_ssize_t d_ = lfs3_toleb128(lfs3->gbmap.cursor, &buffer[d], 5);
lfs3_ssize_t d_ = lfs3_toleb128(lfs3->gbmap.window, &buffer[d], 5);
if (d_ < 0) {
LFS3_UNREACHABLE();
}
@@ -10576,7 +10582,7 @@ static lfs3_data_t lfs3_data_fromgbmap(const lfs3_t *lfs3,
#if !defined(LFS3_RDONLY) && !defined(LFS3_2BONLY) && defined(LFS3_BMAP)
static int lfs3_data_readgbmap(lfs3_t *lfs3, lfs3_data_t *data) {
int err = lfs3_data_readleb128(lfs3, data, &lfs3->gbmap.cursor);
int err = lfs3_data_readleb128(lfs3, data, &lfs3->gbmap.window);
if (err) {
return err;
}
@@ -10778,14 +10784,14 @@ static inline void lfs3_alloc_ckpoint(lfs3_t *lfs3) {
// discard any lookahead state, this is necessary if block_count changes
#if !defined(LFS3_RDONLY) && !defined(LFS3_2BONLY)
static inline void lfs3_alloc_discard(lfs3_t *lfs3) {
lfs3->lookahead.size = 0;
lfs3->lookahead.known = 0;
lfs3_memset(lfs3->lookahead.buffer, 0, lfs3->cfg->lookahead_size);
}
#endif
// mark a block as in-use
#if !defined(LFS3_RDONLY) && !defined(LFS3_2BONLY)
static void lfs3_alloc_markinuse_(lfs3_t *lfs3, lfs3_block_t block) {
static void lfs3_alloc_markinuse(lfs3_t *lfs3, lfs3_block_t block) {
// translate to lookahead-relative
lfs3_block_t block_ = ((
(lfs3_sblock_t)(block
@@ -10808,19 +10814,19 @@ static void lfs3_alloc_markinuse_(lfs3_t *lfs3, lfs3_block_t block) {
// mark some filesystem object as in-use
#if !defined(LFS3_RDONLY) && !defined(LFS3_2BONLY)
static void lfs3_alloc_markinuse(lfs3_t *lfs3,
static void lfs3_alloc_markbptr(lfs3_t *lfs3,
lfs3_tag_t tag, const lfs3_bptr_t *bptr) {
if (tag == LFS3_TAG_MDIR) {
lfs3_mdir_t *mdir = (lfs3_mdir_t*)bptr->d.u.buffer;
lfs3_alloc_markinuse_(lfs3, mdir->r.blocks[0]);
lfs3_alloc_markinuse_(lfs3, mdir->r.blocks[1]);
lfs3_alloc_markinuse(lfs3, mdir->r.blocks[0]);
lfs3_alloc_markinuse(lfs3, mdir->r.blocks[1]);
} else if (tag == LFS3_TAG_BRANCH) {
lfs3_rbyd_t *rbyd = (lfs3_rbyd_t*)bptr->d.u.buffer;
lfs3_alloc_markinuse_(lfs3, rbyd->blocks[0]);
lfs3_alloc_markinuse(lfs3, rbyd->blocks[0]);
} else if (tag == LFS3_TAG_BLOCK) {
lfs3_alloc_markinuse_(lfs3, lfs3_bptr_block(bptr));
lfs3_alloc_markinuse(lfs3, lfs3_bptr_block(bptr));
} else {
LFS3_UNREACHABLE();
@@ -10828,17 +10834,50 @@ static void lfs3_alloc_markinuse(lfs3_t *lfs3,
}
#endif
// mark lookahead buffer to match bmap
#if !defined(LFS3_RDONLY) && !defined(LFS3_2BONLY) && defined(LFS3_BMAP)
static int lfs3_alloc_markbmap(lfs3_t *lfs3, lfs3_btree_t *bmap,
lfs3_block_t known) {
lfs3_block_t block = lfs3->lookahead.window + lfs3->lookahead.off;
while (block < lfs3->lookahead.window + lfs3->lookahead.off + known) {
lfs3_block_t block_ = block % lfs3->block_count;
lfs3_block_t block__;
lfs3_stag_t tag = lfs3_bmap_lookupnext(lfs3, bmap, block_,
&block__, NULL);
if (tag < 0) {
return tag;
}
lfs3_block_t d = (block__+1) - block_;
// in-use? bad? etc? mark as in-use
if (tag != LFS3_TAG_BMFREE) {
// this could probably be more efficient, but cpu usage is
// not a big priority at the moment
for (lfs3_block_t i = 0; i < d; i++) {
lfs3_alloc_markinuse(lfs3, block_+i);
}
}
block += d;
}
return 0;
}
#endif
// needed in lfs3_alloc_markfree
static lfs3_sblock_t lfs3_alloc_findfree(lfs3_t *lfs3);
// mark any not-in-use blocks as free
#if !defined(LFS3_RDONLY) && !defined(LFS3_2BONLY)
static void lfs3_alloc_markfree(lfs3_t *lfs3) {
static void lfs3_alloc_markfree(lfs3_t *lfs3, lfs3_block_t known) {
// make lookahead buffer usable
lfs3->lookahead.size = lfs3_min(
lfs3->lookahead.known = lfs3_min(
8*lfs3->cfg->lookahead_size,
lfs3->lookahead.ckpoint);
known);
// TODO how does this interact with the bmap?
//
// signal that lookahead is full, this may be cleared by
// lfs3_alloc_findfree
lfs3->flags &= ~LFS3_I_LOOKAHEAD;
@@ -10852,7 +10891,7 @@ static void lfs3_alloc_markfree(lfs3_t *lfs3) {
// increment lookahead buffer
#if !defined(LFS3_RDONLY) && !defined(LFS3_2BONLY)
static void lfs3_alloc_inc(lfs3_t *lfs3) {
LFS3_ASSERT(lfs3->lookahead.size > 0);
LFS3_ASSERT(lfs3->lookahead.known > 0);
// clear lookahead as we increment
lfs3->lookahead.buffer[lfs3->lookahead.off / 8]
@@ -10871,16 +10910,20 @@ static void lfs3_alloc_inc(lfs3_t *lfs3) {
}
// decrement size
lfs3->lookahead.size -= 1;
lfs3->lookahead.known -= 1;
// decrement ckpoint
lfs3->lookahead.ckpoint -= 1;
// decrement bmap airspace
#ifdef LFS3_BMAP
lfs3->lookahead.bmapped = lfs3_smax(lfs3->lookahead.bmapped-1, 0);
#endif
}
#endif
// find next free block in lookahead buffer, if there is one
#if !defined(LFS3_RDONLY) && !defined(LFS3_2BONLY)
static lfs3_sblock_t lfs3_alloc_findfree(lfs3_t *lfs3) {
while (lfs3->lookahead.size > 0) {
while (lfs3->lookahead.known > 0) {
if (!(lfs3->lookahead.buffer[lfs3->lookahead.off / 8]
& (1 << (lfs3->lookahead.off % 8)))) {
// found a free block
@@ -10936,7 +10979,7 @@ static lfs3_sblock_t lfs3_alloc(lfs3_t *lfs3, uint32_t flags) {
LFS3_DEBUG("Allocated block 0x%"PRIx32", "
"lookahead %"PRId32"/%"PRId32"/%"PRId32,
block,
lfs3->lookahead.size,
lfs3->lookahead.known,
lfs3->lookahead.ckpoint,
lfs3->cfg->block_count);
#endif
@@ -10953,7 +10996,7 @@ static lfs3_sblock_t lfs3_alloc(lfs3_t *lfs3, uint32_t flags) {
if (lfs3->lookahead.ckpoint <= 0) {
LFS3_ERROR("No more free space "
"(lookahead %"PRId32"/%"PRId32"/%"PRId32")",
lfs3->lookahead.size,
lfs3->lookahead.known,
lfs3->lookahead.ckpoint,
lfs3->cfg->block_count);
return LFS3_ERR_NOSPC;
@@ -10961,6 +11004,27 @@ static lfs3_sblock_t lfs3_alloc(lfs3_t *lfs3, uint32_t flags) {
// no blocks in our lookahead buffer?
// known blocks in our bmap?
#ifdef LFS3_YES_BMAPCACHE
if (lfs3->lookahead.bmapped > 0) {
int err = lfs3_alloc_markbmap(lfs3, &lfs3->gbmap.b, lfs3_min(
lfs3->lookahead.bmapped,
lfs3->lookahead.ckpoint));
if (err) {
return err;
}
// TODO should markinuse, etc, take the lookahead buffer?
// with known blocks we can trust the block state to be
// exact
lfs3_alloc_markfree(lfs3, lfs3_min(
lfs3->lookahead.bmapped,
lfs3->lookahead.ckpoint));
continue;
}
#endif
// // controlled airspace in our bmap?
// #ifdef LFS3_BMAP
// if (lfs3->gbmap.ctrled > 0) {
@@ -11054,18 +11118,18 @@ static lfs3_sblock_t lfs3_alloc(lfs3_t *lfs3, uint32_t flags) {
}
// track in-use blocks
lfs3_alloc_markinuse(lfs3, tag, &bptr);
lfs3_alloc_markbptr(lfs3, tag, &bptr);
}
// mask out any in-flight graft state
for (lfs3_size_t i = 0;
i < lfs3_graft_count(lfs3->graft_count);
i++) {
lfs3_alloc_markinuse_(lfs3, lfs3->graft[i].u.disk.block);
lfs3_alloc_markinuse(lfs3, lfs3->graft[i].u.disk.block);
}
// mark anything not seen as free
lfs3_alloc_markfree(lfs3);
lfs3_alloc_markfree(lfs3, lfs3->lookahead.ckpoint);
}
// //// bmap fast algorithm ////
@@ -15039,8 +15103,11 @@ static int lfs3_init(lfs3_t *lfs3, uint32_t flags,
}
lfs3->lookahead.window = 0;
lfs3->lookahead.off = 0;
lfs3->lookahead.size = 0;
lfs3->lookahead.known = 0;
lfs3->lookahead.ckpoint = 0;
#ifdef LFS3_BMAP
lfs3->lookahead.bmapped = 0;
#endif
lfs3_alloc_discard(lfs3);
#endif
@@ -15211,7 +15278,7 @@ static int lfs3_init(lfs3_t *lfs3, uint32_t flags,
// TODO is this actually needed?
#ifdef LFS3_BMAP
lfs3_btree_init(&lfs3->gbmap.b);
lfs3->gbmap.cursor = 0;
lfs3->gbmap.window = 0;
lfs3->gbmap.known = 0;
lfs3_memset(lfs3->gbmap_p, 0, LFS3_GBMAP_DSIZE);
lfs3_memset(lfs3->gbmap_d, 0, LFS3_GBMAP_DSIZE);
@@ -15766,16 +15833,6 @@ static int lfs3_mountinited(lfs3_t *lfs3) {
lfs3->gcksum_p = lfs3->gcksum;
#endif
// once we've mounted and derived a pseudo-random seed, initialize our
// block allocator
//
// the purpose of this is to avoid bad wear patterns such as always
// allocating blocks near the beginning of disk after a power-loss
//
#if !defined(LFS3_RDONLY) && !defined(LFS3_2BONLY)
lfs3->lookahead.window = lfs3->gcksum % lfs3->block_count;
#endif
// TODO should the consumegdelta above take gstate/gdelta as a parameter?
// keep track of the current gstate on disk
#ifndef LFS3_RDONLY
@@ -15806,6 +15863,7 @@ static int lfs3_mountinited(lfs3_t *lfs3) {
lfs3_dbgmrid(lfs3, lfs3->grm.queue[0]));
}
#if !defined(LFS3_RDONLY) && !defined(LFS3_2BONLY)
#ifdef LFS3_BMAP
// decode the global block-map
err = lfs3_data_readgbmap(lfs3,
@@ -15814,6 +15872,20 @@ static int lfs3_mountinited(lfs3_t *lfs3) {
// TODO switch to read-only?
return err;
}
// if we have a bmap, position our lookahead buffer at the last
// known bmap window
lfs3->lookahead.window = lfs3->gbmap.window;
lfs3->lookahead.bmapped = lfs3->gbmap.known;
#else
// if we _don't_ have a bmap, position our lookahead buffer
// pseudo-randomly using our gcksum as a prng
//
// the purpose of this is to avoid bad wear patterns such as always
// allocating blocks near the beginning of disk after a power-loss
//
lfs3->lookahead.window = lfs3->gcksum % lfs3->block_count;
#endif
#endif
return 0;
@@ -15989,7 +16061,7 @@ static int lfs3_formatbmap(lfs3_t *lfs3) {
// TODO should we try multiple blocks?
// assume we can write bmap to block 2
lfs3->gbmap.cursor = 3;
lfs3->gbmap.window = 3;
lfs3->gbmap.known = lfs3->cfg->block_count;
lfs3->gbmap.b.r.blocks[0] = 2;
lfs3->gbmap.b.r.trunk = 0;
+7 -4
View File
@@ -843,8 +843,8 @@ typedef struct lfs3_grm {
} lfs3_grm_t;
// gbmap encoding:
// .---+- -+- -+- -+- -. cursor: 1 leb128 <=5 bytes
// | cursor | known: 1 leb128 <=5 bytes
// .---+- -+- -+- -+- -. window: 1 leb128 <=5 bytes
// | window | known: 1 leb128 <=5 bytes
// +---+- -+- -+- -+- -+ block: 1 leb128 <=5 bytes
// | known | trunk: 1 leb128 <=4 bytes
// +---+- -+- -+- -+- -+ cksum: 1 le32 4 bytes
@@ -857,7 +857,7 @@ typedef struct lfs3_grm {
#define LFS3_GBMAP_DSIZE (5+5+5+4+4)
typedef struct lfs3_gbmap {
lfs3_block_t cursor;
lfs3_block_t window;
lfs3_block_t known;
lfs3_btree_t b;
} lfs3_gbmap_t;
@@ -916,8 +916,11 @@ typedef struct lfs3 {
struct lfs3_lookahead {
lfs3_block_t window;
lfs3_block_t off;
lfs3_block_t size;
lfs3_block_t known;
lfs3_block_t ckpoint;
#ifdef LFS3_BMAP
lfs3_block_t bmapped;
#endif
uint8_t *buffer;
} lookahead;
#endif
+3 -3
View File
@@ -56,7 +56,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -2011,7 +2011,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -3968,7 +3968,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
+50 -50
View File
@@ -15,7 +15,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -47,7 +47,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -91,7 +91,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -142,7 +142,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -194,7 +194,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -254,7 +254,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -317,7 +317,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -369,7 +369,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -423,7 +423,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -507,7 +507,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -577,7 +577,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -715,7 +715,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -762,7 +762,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -822,7 +822,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -896,7 +896,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -955,7 +955,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -1043,7 +1043,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -1118,7 +1118,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -1263,7 +1263,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -1321,7 +1321,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -1395,7 +1395,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -1469,7 +1469,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -1562,7 +1562,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -1643,7 +1643,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -1727,7 +1727,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -1817,7 +1817,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -1925,7 +1925,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -2077,7 +2077,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -2138,7 +2138,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -2229,7 +2229,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -2291,7 +2291,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -2471,7 +2471,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -2542,7 +2542,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -2616,7 +2616,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -2683,7 +2683,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -2767,7 +2767,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -2875,7 +2875,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -3042,7 +3042,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -3074,7 +3074,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -3133,7 +3133,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -3209,7 +3209,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -3302,7 +3302,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -3396,7 +3396,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -3473,7 +3473,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -3591,7 +3591,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -3669,7 +3669,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -3828,7 +3828,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -4008,7 +4008,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -4236,7 +4236,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);
@@ -4364,7 +4364,7 @@ code = '''
memset(lfs3.lookahead.buffer, 0, CFG->lookahead_size);
lfs3.lookahead.window = 2;
lfs3.lookahead.off = 0;
lfs3.lookahead.size = lfs3_min(8*CFG->lookahead_size,
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3);