bmap: Tweaked bmapcache algo to piggyback on mdir commits

There's really no reason to immediately commit the bmap to disk, at
least no until the first mdir commit, when we need to at least discard
the previous bmap state.

We already do all the gstate handling in lfs3_mdir_commit anyways, and
piggybacking on mdir commit lets us get rid of the annoying extra mdir
param in lfs3_alloc_ckpoint.

This does mean a slightly higher risk of needing to re-rebuild the bmap
after a powerloss, but in theory only if the user does something weird
like writing to a file and never calling sync. Most on-disk operations
terminate in an mdir commit as that's how any state change becomes
atomically visibile in littlefs.

Saves a nice bit of stack:

                code          stack          ctx
  before:      36920           2368          684
  after:       36920 (+0.0%)   2368 (+0.0%)  684 (+0.0%)

                code          stack          ctx
  bmap before: 38552           2472          812
  bmap after:  38464 (-0.2%)   2400 (-2.9%)  812 (+0.0%)
This commit is contained in:
Christopher Haster
2025-07-29 00:42:40 -05:00
parent 316ca1cc05
commit 726cccfe76
7 changed files with 141 additions and 152 deletions
+32 -43
View File
@@ -2380,7 +2380,7 @@ static inline bool lfs3_alloc_iserase(uint32_t flags) {
// blocks are allocated at most once, and never reallocated, between
// checkpoints
#if !defined(LFS3_RDONLY)
static inline void lfs3_alloc_ckpoint(lfs3_t *lfs3, lfs3_mdir_t *mdir);
static inline void lfs3_alloc_ckpoint(lfs3_t *lfs3);
#endif
// discard any lookahead state, this is necessary if block_count changes
@@ -10494,7 +10494,7 @@ dropped:;
: lfs3->cfg->block_size - lfs3->cfg->block_size/8);
// checkpoint the allocator
lfs3_alloc_ckpoint(lfs3, mdir);
lfs3_alloc_ckpoint(lfs3);
// compact the mdir
err = lfs3_mdir_compact(lfs3, mdir);
if (err) {
@@ -10800,7 +10800,7 @@ static int lfs3_bmap_setbptr(lfs3_t *lfs3, lfs3_btree_t *bmap,
/// Block allocator ///
// needed in lfs3_alloc_ckpoint
static int lfs3_alloc_rebuildbmap(lfs3_t *lfs3, lfs3_mdir_t *mdir);
static int lfs3_alloc_rebuildbmap(lfs3_t *lfs3);
// checkpoint the allocator
//
@@ -10810,7 +10810,7 @@ static int lfs3_alloc_rebuildbmap(lfs3_t *lfs3, lfs3_mdir_t *mdir);
// blocks are allocated at most once, and never reallocated, between
// checkpoints
#if !defined(LFS3_RDONLY)
static inline void lfs3_alloc_ckpoint(lfs3_t *lfs3, lfs3_mdir_t *mdir) {
static inline void lfs3_alloc_ckpoint(lfs3_t *lfs3) {
#ifndef LFS3_2BONLY
lfs3->lookahead.ckpoint = lfs3->block_count;
#ifdef LFS3_BMAP
@@ -10818,7 +10818,7 @@ static inline void lfs3_alloc_ckpoint(lfs3_t *lfs3, lfs3_mdir_t *mdir) {
if (lfs3->lookahead.bmapped < lfs3_min(
lfs3->cfg->bmap_scan_thresh,
lfs3->block_count)) {
int err = lfs3_alloc_rebuildbmap(lfs3, mdir);
int err = lfs3_alloc_rebuildbmap(lfs3);
// TODO lfs3_alloc_ckpoint should propagate errors
LFS3_ASSERT(!err);
}
@@ -11276,7 +11276,7 @@ static lfs3_sblock_t lfs3_alloc(lfs3_t *lfs3, uint32_t flags) {
//
// if NULL, we just commit to the mroot, and mroot chain extension can
// take over if the wear gets too bad
static int lfs3_alloc_rebuildbmap(lfs3_t *lfs3, lfs3_mdir_t *mdir) {
static int lfs3_alloc_rebuildbmap(lfs3_t *lfs3) {
// we should ckpoint before calling this
LFS3_ASSERT(lfs3->lookahead.ckpoint == lfs3->cfg->block_count);
LFS3_INFO("Rebuilding bmap "
@@ -11284,7 +11284,6 @@ static int lfs3_alloc_rebuildbmap(lfs3_t *lfs3, lfs3_mdir_t *mdir) {
lfs3->lookahead.bmapped,
lfs3->lookahead.ckpoint,
lfs3->cfg->block_count);
lfs3_block_t bmapped = lfs3->lookahead.bmapped;
// create a new bmap
lfs3_btree_t bmap_;
@@ -11324,25 +11323,17 @@ static int lfs3_alloc_rebuildbmap(lfs3_t *lfs3, lfs3_mdir_t *mdir) {
}
}
// commit the new bmap into gstate
// update gbmap with what we found
//
// lfs3_mdir_commit may immediately allocate from the bmap before it
// even hits the, but this is fine, lfs3_mdir_commit updates
// window/known with alloc progress before any internal commits
// we don't commit this to disk immediately, instead we piggypack on
// the next mdir commit, most writes terminate in an mdir commit so
// this avoids extra writing at a risk of needing to reconstruct the
// bmap if we lose power
//
// also note lfs3_mdir_commit reverts to on-disk state on failure
// lfs3->gbmap.window = (lfs3->lookahead.window + lfs3->lookahead.off)
// % lfs3->cfg->block_count;
// lfs3->gbmap.known = ((lfs3->lookahead.ckpoint + lfs3->cfg->block_count)
// - lfs3->gbmap.window)
// % lfs3->cfg->block_count;
// don't worry about window/known, lfs3_mdir_commit updates these
// last minute before calculating gdeltas for a commit
lfs3->lookahead.bmapped = lfs3->lookahead.ckpoint;
lfs3->gbmap.b = bmap_;
err = lfs3_mdir_commit(lfs3, (mdir) ? mdir : &lfs3->mroot, NULL, 0);
if (err) {
goto failed;
}
return 0;
failed:;
@@ -11355,8 +11346,6 @@ failed:;
lfs3->cfg->block_count);
return 0;
}
// revert bmapped on error
lfs3->lookahead.bmapped = bmapped;
return err;
}
#endif
@@ -11486,7 +11475,7 @@ int lfs3_mkdir(lfs3_t *lfs3, const char *path) {
// mid updates, since the mid technically doesn't exist yet...
// commit our bookmark and a grm to self-remove in case of powerloss
lfs3_alloc_ckpoint(lfs3, &mdir);
lfs3_alloc_ckpoint(lfs3);
err = lfs3_mdir_commit(lfs3, &mdir, LFS3_RATTRS(
LFS3_RATTR_NAME(
LFS3_TAG_BOOKMARK, +1, did_, NULL, 0),
@@ -11513,7 +11502,7 @@ int lfs3_mkdir(lfs3_t *lfs3, const char *path) {
//
// commit our new directory into our parent, zeroing the grm in the
// process
lfs3_alloc_ckpoint(lfs3, &mdir);
lfs3_alloc_ckpoint(lfs3);
lfs3_grm_pop(lfs3);
err = lfs3_mdir_commit(lfs3, &mdir, LFS3_RATTRS(
LFS3_RATTR_NAME(
@@ -11660,7 +11649,7 @@ int lfs3_remove(lfs3_t *lfs3, const char *path) {
bool zombie = lfs3_mid_isopen(lfs3, mdir.mid, -1);
// remove the metadata entry
lfs3_alloc_ckpoint(lfs3, &mdir);
lfs3_alloc_ckpoint(lfs3);
err = lfs3_mdir_commit(lfs3, &mdir, LFS3_RATTRS(
// create a stickynote if zombied
//
@@ -11841,7 +11830,7 @@ int lfs3_rename(lfs3_t *lfs3, const char *old_path, const char *new_path) {
// rename our entry, copying all tags associated with the old rid to the
// new rid, while also marking the old rid for removal
lfs3_alloc_ckpoint(lfs3, &new_mdir);
lfs3_alloc_ckpoint(lfs3);
err = lfs3_mdir_commit(lfs3, &new_mdir, LFS3_RATTRS(
LFS3_RATTR_NAME(
LFS3_TAG_MASK12 | old_tag,
@@ -12282,7 +12271,7 @@ int lfs3_setattr(lfs3_t *lfs3, const char *path, uint8_t type,
}
// commit our attr
lfs3_alloc_ckpoint(lfs3, &mdir);
lfs3_alloc_ckpoint(lfs3);
err = lfs3_mdir_commit(lfs3, &mdir, LFS3_RATTRS(
LFS3_RATTR_DATA(
LFS3_TAG_ATTR(type), 0,
@@ -12338,7 +12327,7 @@ int lfs3_removeattr(lfs3_t *lfs3, const char *path, uint8_t type) {
}
// commit our removal
lfs3_alloc_ckpoint(lfs3, &mdir);
lfs3_alloc_ckpoint(lfs3);
err = lfs3_mdir_commit(lfs3, &mdir, LFS3_RATTRS(
LFS3_RATTR(
LFS3_TAG_RM | LFS3_TAG_ATTR(type), 0)));
@@ -12637,7 +12626,7 @@ int lfs3_file_opencfg_(lfs3_t *lfs3, lfs3_file_t *file,
} else {
// create a stickynote entry if we don't have one, this
// reserves the mid until first sync
lfs3_alloc_ckpoint(lfs3, &file->b.h.mdir);
lfs3_alloc_ckpoint(lfs3);
err = lfs3_mdir_commit(lfs3, &file->b.h.mdir, LFS3_RATTRS(
LFS3_RATTR_NAME(
LFS3_TAG_STICKYNOTE, +1,
@@ -13590,7 +13579,7 @@ static int lfs3_file_crystallize(lfs3_t *lfs3, lfs3_file_t *file) {
LFS3_ASSERT(lfs3_o_isunsync(file->b.h.flags));
// checkpoint the allocator
lfs3_alloc_ckpoint(lfs3, &file->b.h.mdir);
lfs3_alloc_ckpoint(lfs3);
// finish crystallizing
int err = lfs3_file_crystallize_(lfs3, file,
file->leaf.pos - lfs3_bptr_off(&file->leaf.bptr), -1, -1,
@@ -13612,7 +13601,7 @@ static int lfs3_file_flushset_(lfs3_t *lfs3, lfs3_file_t *file,
lfs3_off_t pos = 0;
while (size > 0) {
// checkpoint the allocator
lfs3_alloc_ckpoint(lfs3, &file->b.h.mdir);
lfs3_alloc_ckpoint(lfs3);
// enough data for a block?
#ifndef LFS3_2BONLY
@@ -13712,7 +13701,7 @@ static int lfs3_file_flush_(lfs3_t *lfs3, lfs3_file_t *file,
#ifndef LFS3_2BONLY
while (size > 0) {
// checkpoint the allocator
lfs3_alloc_ckpoint(lfs3, &file->b.h.mdir);
lfs3_alloc_ckpoint(lfs3);
// mid-crystallization? can we just resume crystallizing?
//
@@ -13961,7 +13950,7 @@ fragment:;
// iteratively write fragments (inlined leaves)
while (size > 0) {
// checkpoint the allocator
lfs3_alloc_ckpoint(lfs3, &file->b.h.mdir);
lfs3_alloc_ckpoint(lfs3);
// do we need to discard our leaf? we need to discard fragments
// in case the underlying rbyd compacts, and we need to discard
@@ -14459,7 +14448,7 @@ static int lfs3_file_sync_(lfs3_t *lfs3, lfs3_file_t *file,
// make sure we don't overflow our rattr buffer
LFS3_ASSERT(rattr_count <= sizeof(rattrs)/sizeof(lfs3_rattr_t));
// checkpoint the allocator
lfs3_alloc_ckpoint(lfs3, &file->b.h.mdir);
lfs3_alloc_ckpoint(lfs3);
// and commit!
int err = lfs3_mdir_commit(lfs3, &file->b.h.mdir,
rattrs, rattr_count);
@@ -14755,7 +14744,7 @@ int lfs3_file_truncate(lfs3_t *lfs3, lfs3_file_t *file, lfs3_off_t size_) {
file->b.h.flags |= LFS3_o_UNSYNC;
// checkpoint the allocator
lfs3_alloc_ckpoint(lfs3, &file->b.h.mdir);
lfs3_alloc_ckpoint(lfs3);
// truncate our btree
err = lfs3_file_graft_(lfs3, file,
lfs3_min(size, size_), size - lfs3_min(size, size_),
@@ -14837,7 +14826,7 @@ int lfs3_file_fruncate(lfs3_t *lfs3, lfs3_file_t *file, lfs3_off_t size_) {
file->b.h.flags |= LFS3_o_UNSYNC;
// checkpoint the allocator
lfs3_alloc_ckpoint(lfs3, &file->b.h.mdir);
lfs3_alloc_ckpoint(lfs3);
// fruncate our btree
err = lfs3_file_graft_(lfs3, file,
0, lfs3_smax(size - size_, 0),
@@ -16573,7 +16562,7 @@ static int lfs3_fs_fixgrm(lfs3_t *lfs3) {
lfs3_grm_t grm_p = lfs3->grm;
// checkpoint the allocator
lfs3_alloc_ckpoint(lfs3, &mdir);
lfs3_alloc_ckpoint(lfs3);
// mark grm as taken care of
lfs3_grm_pop(lfs3);
// remove the rid while atomically updating our grm
@@ -16628,7 +16617,7 @@ static int lfs3_mdir_mkconsistent(lfs3_t *lfs3, lfs3_mdir_t *mdir) {
lfs3_dbgmrid(lfs3, mdir->mid));
// checkpoint the allocator
lfs3_alloc_ckpoint(lfs3, mdir);
lfs3_alloc_ckpoint(lfs3);
// remove the orphaned stickynote
err = lfs3_mdir_commit(lfs3, mdir, LFS3_RATTRS(
LFS3_RATTR(LFS3_TAG_RM, -1)));
@@ -16781,7 +16770,7 @@ static int lfs3_fs_gc_(lfs3_t *lfs3, lfs3_trv_t *trv,
while (pending && (lfs3_off_t)steps > 0) {
// checkpoint the allocator to maximize any lookahead scans
#ifndef LFS3_RDONLY
lfs3_alloc_ckpoint(lfs3, NULL);
lfs3_alloc_ckpoint(lfs3);
#endif
// start a new traversal?
@@ -16921,7 +16910,7 @@ int lfs3_fs_grow(lfs3_t *lfs3, lfs3_size_t block_count_) {
lfs3_alloc_discard(lfs3);
// update our on-disk config
lfs3_alloc_ckpoint(lfs3, NULL);
lfs3_alloc_ckpoint(lfs3);
int err = lfs3_mdir_commit(lfs3, &lfs3->mroot, LFS3_RATTRS(
LFS3_RATTR_GEOMETRY(
LFS3_TAG_GEOMETRY, 0,
@@ -17020,7 +17009,7 @@ int lfs3_trv_read(lfs3_t *lfs3, lfs3_trv_t *trv,
// checkpoint the allocator to maximize any lookahead scans
#ifndef LFS3_RDONLY
lfs3_alloc_ckpoint(lfs3, NULL);
lfs3_alloc_ckpoint(lfs3);
#endif
while (true) {
+3 -3
View File
@@ -33,7 +33,7 @@ code = '''
lfs3_mount(&lfs3, LFS3_M_RDWR, &cfg) => 0;
// start allocating
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
lfs3_size_t alloced = 0;
while (true) {
lfs3_sblock_t block = lfs3_alloc(&lfs3, ERASE);
@@ -77,7 +77,7 @@ code = '''
lfs3_mount(&lfs3, LFS3_M_RDWR, &cfg) => 0;
// start allocating
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
lfs3_size_t alloced = 0;
while (true) {
lfs3_sblock_t block = lfs3_alloc(&lfs3, ERASE);
@@ -98,7 +98,7 @@ code = '''
assert(alloced == COUNT-2);
// ack again, effectively releasing all the previously alloced blocks
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
alloced = 0;
while (true) {
lfs3_sblock_t block = lfs3_alloc(&lfs3, ERASE);
+3 -3
View File
@@ -61,7 +61,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a btree
lfs3_btree_t btree;
@@ -2016,7 +2016,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a btree
lfs3_btree_t btree;
@@ -3973,7 +3973,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a btree
lfs3_btree_t btree;
+6 -6
View File
@@ -9,7 +9,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create an initial bmap
lfs3_btree_t bmap;
@@ -70,7 +70,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create an initial bmap
lfs3_btree_t bmap;
@@ -135,7 +135,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create an initial bmap
lfs3_btree_t bmap;
@@ -201,7 +201,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create an initial bmap
lfs3_btree_t bmap;
@@ -268,7 +268,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create an initial bmap
lfs3_btree_t bmap;
@@ -318,7 +318,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create an initial bmap
lfs3_btree_t bmap;
+50 -50
View File
@@ -20,7 +20,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create an empty tree
lfs3_btree_t btree;
@@ -52,7 +52,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a single-entry tree
lfs3_btree_t btree;
@@ -96,7 +96,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a two-entry tree
lfs3_btree_t btree;
@@ -147,7 +147,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a two-entry tree
lfs3_btree_t btree;
@@ -199,7 +199,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a two-entry tree
lfs3_btree_t btree;
@@ -259,7 +259,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a two-entry tree
lfs3_btree_t btree;
@@ -322,7 +322,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a tree with N elements
lfs3_btree_t btree;
@@ -374,7 +374,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a tree with N elements
lfs3_btree_t btree;
@@ -428,7 +428,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a btree
lfs3_btree_t btree;
@@ -512,7 +512,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a tree with N elements
lfs3_btree_t btree;
@@ -582,7 +582,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a btree
lfs3_btree_t btree;
@@ -720,7 +720,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a single-entry tree
lfs3_btree_t btree;
@@ -767,7 +767,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a two-entry tree
lfs3_btree_t btree;
@@ -827,7 +827,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a two-entry tree
lfs3_btree_t btree;
@@ -901,7 +901,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a tree with N elements
lfs3_btree_t btree;
@@ -960,7 +960,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a btree
lfs3_btree_t btree;
@@ -1048,7 +1048,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a tree with N elements
lfs3_btree_t btree;
@@ -1123,7 +1123,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a btree
lfs3_btree_t btree;
@@ -1268,7 +1268,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a single-entry tree
lfs3_btree_t btree;
@@ -1326,7 +1326,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a single-entry tree
lfs3_btree_t btree;
@@ -1400,7 +1400,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a single-entry tree
lfs3_btree_t btree;
@@ -1474,7 +1474,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a single-entry tree
lfs3_btree_t btree;
@@ -1567,7 +1567,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a tree with N elements
lfs3_btree_t btree;
@@ -1648,7 +1648,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a tree with N elements
lfs3_btree_t btree;
@@ -1732,7 +1732,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a btree
lfs3_btree_t btree;
@@ -1822,7 +1822,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a tree with N elements
lfs3_btree_t btree;
@@ -1930,7 +1930,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a btree
lfs3_btree_t btree;
@@ -2082,7 +2082,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a tree with N elements
lfs3_btree_t btree;
@@ -2143,7 +2143,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a btree
lfs3_btree_t btree;
@@ -2234,7 +2234,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a tree with N elements
lfs3_btree_t btree;
@@ -2296,7 +2296,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a btree
lfs3_btree_t btree;
@@ -2476,7 +2476,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a tree
lfs3_btree_t btree;
@@ -2547,7 +2547,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a tree
lfs3_btree_t btree;
@@ -2621,7 +2621,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a tree
lfs3_btree_t btree;
@@ -2688,7 +2688,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a tree
lfs3_btree_t btree;
@@ -2772,7 +2772,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a btree
lfs3_btree_t btree;
@@ -2880,7 +2880,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a btree
lfs3_btree_t btree;
@@ -3047,7 +3047,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a zero-entry tree
lfs3_btree_t btree;
@@ -3079,7 +3079,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a single-entry tree
lfs3_btree_t btree;
@@ -3138,7 +3138,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a two-entry tree
lfs3_btree_t btree;
@@ -3214,7 +3214,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a two-entry tree
lfs3_btree_t btree;
@@ -3307,7 +3307,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a two-entry tree
lfs3_btree_t btree;
@@ -3401,7 +3401,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a tree with N elements
lfs3_btree_t btree;
@@ -3478,7 +3478,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a btree
lfs3_btree_t btree;
@@ -3596,7 +3596,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a tree with N elements
lfs3_btree_t btree;
@@ -3674,7 +3674,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a btree
lfs3_btree_t btree;
@@ -3833,7 +3833,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a btree
lfs3_btree_t btree;
@@ -4013,7 +4013,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a btree
lfs3_btree_t btree;
@@ -4241,7 +4241,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a tree with N elements
lfs3_btree_t btree;
@@ -4369,7 +4369,7 @@ code = '''
lfs3.lookahead.off = 0;
lfs3.lookahead.known = lfs3_min(8*CFG->lookahead_size,
CFG->block_count-2);
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create a btree
lfs3_btree_t btree;
+1 -1
View File
@@ -1226,7 +1226,7 @@ code = '''
lfs3_file_sync(&lfs3, &file) => 0;
// create an empty btree
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
lfs3_rbyd_alloc(&lfs3, &file.b.shrub.r) => 0;
lfs3_rbyd_commit(&lfs3, &file.b.shrub.r, 0, LFS3_RATTRS(
LFS3_RATTR_BUF(LFS3_TAG_DATA, +1, "?", 1))) => 0;
+46 -46
View File
@@ -42,7 +42,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
for (lfs3_size_t i = 0; i < N; i++) {
lfs3_mdir_commit(&lfs3, &lfs3.mroot, LFS3_RATTRS(
@@ -86,7 +86,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
for (lfs3_size_t i = 0; i < N; i++) {
// force mroot to compact
@@ -133,7 +133,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
for (lfs3_size_t i = 0; i < N; i++) {
lfs3_mdir_commit(&lfs3, &lfs3.mroot, LFS3_RATTRS(
@@ -182,7 +182,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
lfs3_data_t data;
// create a 2 large rattrs that needs to be uninlined
@@ -265,7 +265,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
lfs3_data_t data;
// create 2 large entries that needs to be uninlined and split
@@ -360,7 +360,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
lfs3_data_t data;
// create 2 large entries that needs to be uninlined and split
@@ -501,7 +501,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create entries
for (lfs3_size_t i = 0; i < N; i++) {
@@ -588,7 +588,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
bool sim[N];
for (lfs3_size_t i = 0; i < N; i++) {
@@ -697,7 +697,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
lfs3_data_t data;
// create 2 large entries that needs to be uninlined and split
@@ -791,7 +791,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
lfs3_data_t data;
// create 2 large entries that needs to be uninlined and split
@@ -887,7 +887,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
lfs3_data_t data;
// create 2 large entries that needs to be uninlined and split
@@ -964,7 +964,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
lfs3_data_t data;
// create 2 large entries that needs to be uninlined and split
@@ -1084,7 +1084,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
lfs3_data_t data;
// create 2 large entries that needs to be uninlined and split
@@ -1206,7 +1206,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
bool sim[N];
for (lfs3_size_t i = 0; i < N; i++) {
@@ -1343,7 +1343,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
lfs3_data_t data;
// create a 2 large rattrs that needs to be uninlined
@@ -1469,7 +1469,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
lfs3_data_t data;
// create 2 large entries that needs to be uninlined and split
@@ -1609,7 +1609,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
lfs3_data_t data;
// create 2 large entries that needs to be uninlined and split
@@ -1749,7 +1749,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
lfs3_data_t data;
// prepare mroot with an entry
@@ -1832,7 +1832,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
lfs3_data_t data;
// prepare mroot with an entry
@@ -1970,7 +1970,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
lfs3_data_t data;
// prepare mroot with an entry
@@ -2081,7 +2081,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
lfs3_data_t data;
// create 2 large entries that needs to be uninlined and split
@@ -2226,7 +2226,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
lfs3_data_t data;
// create 2 large entries that needs to be uninlined and split
@@ -2388,7 +2388,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
lfs3_data_t data;
// create 2 large entries that needs to be uninlined and split
@@ -2495,7 +2495,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// force mroot to compact once, so the second compact below will
// trigger a relocation
@@ -2588,7 +2588,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// force mroot to compact once, so the second compact below will
// trigger a relocation
@@ -2695,7 +2695,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
bool sim[N];
for (lfs3_size_t i = 0; i < N; i++) {
@@ -2857,7 +2857,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// setup our neighbors
lfs3_handle_t left = {.flags=0};
@@ -2917,7 +2917,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// setup our neighbors
lfs3_handle_t left = {.flags=0};
@@ -2967,7 +2967,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// setup our neighbors
lfs3_handle_t left = {.flags=0};
@@ -3019,7 +3019,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// setup our neighbors
lfs3_handle_t left = {.flags=0};
@@ -3096,7 +3096,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// setup our neighbors
lfs3_handle_t left = {.flags=0};
@@ -3187,7 +3187,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// setup our neighbors
lfs3_handle_t left = {.flags=0};
@@ -3245,7 +3245,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// setup our neighbors
lfs3_handle_t left = {.flags=0};
@@ -3342,7 +3342,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// setup our neighbors
lfs3_handle_t left = {.flags=0};
@@ -3437,7 +3437,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// setup our neighbors
lfs3_handle_t left = {.flags=0};
@@ -3547,7 +3547,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// setup our neighbors
lfs3_handle_t left = {.flags=0};
@@ -3651,7 +3651,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// insert at least one entry
lfs3_mdir_t mdir;
@@ -3757,7 +3757,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
lfs3_data_t data;
// create a 2 large rattrs that needs to be uninlined
@@ -3897,7 +3897,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
lfs3_data_t data;
// create 2 large entries that needs to be uninlined and split
@@ -4049,7 +4049,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
lfs3_data_t data;
// create 2 large entries that needs to be uninlined and split
@@ -4234,7 +4234,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// insert at least one entry
lfs3_mdir_t mdir;
@@ -4353,7 +4353,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
// create entries
for (lfs3_size_t i = 0; i < N; i++) {
@@ -4505,7 +4505,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
bool sim[N];
for (lfs3_size_t i = 0; i < N; i++) {
@@ -4678,7 +4678,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
lfs3_mdir_commit(&lfs3, &lfs3.mroot, LFS3_RATTRS(
LFS3_RATTR_MPTR(
@@ -4998,7 +4998,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
lfs3_data_t data;
// prepare mroot with an entry
@@ -5058,7 +5058,7 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3, LFS3_F_RDWR | F_FLAGS, CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR | M_FLAGS, CFG) => 0;
lfs3_alloc_ckpoint(&lfs3, NULL);
lfs3_alloc_ckpoint(&lfs3);
lfs3_data_t data;
// prepare mroot with an entry