diff --git a/lfs3.c b/lfs3.c index 93e1386c..21567828 100644 --- a/lfs3.c +++ b/lfs3.c @@ -7399,6 +7399,15 @@ static inline bool lfs3_t_islookahead(uint32_t flags) { #endif } +static inline bool lfs3_t_isrebuildgbmap(uint32_t flags) { + (void)flags; + #if !defined(LFS3_RDONLY) && defined(LFS3_GBMAP) + return flags & LFS3_T_REBUILDGBMAP; + #else + return false; + #endif +} + static inline bool lfs3_t_iscompact(uint32_t flags) { (void)flags; #ifndef LFS3_RDONLY @@ -7451,6 +7460,10 @@ static inline void lfs3_t_setbtype(uint32_t *flags, uint8_t btype) { *flags = (*flags & ~LFS3_t_BTYPE) | lfs3_t_btypeflags(btype); } +static inline bool lfs3_t_isckpointed(uint32_t flags) { + return flags & LFS3_t_CKPOINTED; +} + static inline bool lfs3_t_isdirty(uint32_t flags) { return flags & LFS3_t_DIRTY; } @@ -10588,12 +10601,64 @@ eot:; // needed in lfs3_mtree_gc static int lfs3_mdir_mkconsistent(lfs3_t *lfs3, lfs3_mdir_t *mdir); +static inline void lfs3_alloc_ckpoint_(lfs3_t *lfs3); static void lfs3_alloc_markfree(lfs3_t *lfs3, lfs3_block_t known); +static int lfs3_gbmap_remap(lfs3_t *lfs3, lfs3_btree_t *gbmap, + lfs3_tag_t tag, lfs3_tag_t tag_); +static int lfs3_gbmap_setbptr(lfs3_t *lfs3, lfs3_btree_t *gbmap, + lfs3_tag_t tag, const lfs3_bptr_t *bptr, + lfs3_tag_t tag_); +static void lfs3_alloc_adoptgbmap(lfs3_t *lfs3, + const lfs3_btree_t *gbmap, lfs3_block_t known); // high-level mutating traversal, handle extra features that require // mutation here static lfs3_stag_t lfs3_mtree_gc(lfs3_t *lfs3, lfs3_trv_t *trv, lfs3_bptr_t *bptr_) { + // start of traversal? + if (lfs3_t_tstate(trv->b.h.flags) == LFS3_TSTATE_MROOTANCHOR) { + // checkpoint the allocator to maximize any lookahead scans + #ifndef LFS3_RDONLY + if (lfs3_t_islookahead(trv->b.h.flags) + && !lfs3_t_isckpointed(trv->b.h.flags)) { + lfs3_alloc_ckpoint_(lfs3); + // keep our own ckpointed flag clear + trv->b.h.flags &= ~LFS3_t_CKPOINTED; + } + #endif + + #if !defined(LFS3_RDONLY) && defined(LFS3_GBMAP) + // create a new gbmap snapshot + // + // note because we bail as soon as a ckpoint is triggered + // (lfs3_t_isckpointed), we don't need to traverse this + if (lfs3_t_isrebuildgbmap(trv->b.h.flags) + && !lfs3_t_ismtreeonly(trv->b.h.flags) + && lfs3_f_isgbmap(lfs3->flags)) { + // at least checkpoint the lookahead buffer + lfs3_alloc_ckpoint_(lfs3); + + // create a copy of the gbmap + trv->gbmap_ = lfs3->gbmap.b; + + // mark any in-use blocks as free + // + // we do this instead of creating a new gbmap to (1) preserve any + // erased/bad info and (2) try to best use any available + // erased-state + int err = lfs3_gbmap_remap(lfs3, &trv->gbmap_, + LFS3_TAG_BMINUSE, + LFS3_TAG_BMFREE); + if (err) { + return err; + } + + // keep our own ckpointed flag clear + trv->b.h.flags &= ~LFS3_t_CKPOINTED; + } + #endif + } + dropped:; lfs3_stag_t tag = lfs3_mtree_traverse(lfs3, trv, bptr_); @@ -10612,13 +10677,32 @@ dropped:; trv->b.h.flags = lfs3_t_swapdirty(trv->b.h.flags); int err; - // track in-use blocks? + // mark in-use blocks in lookahead? #ifndef LFS3_2BONLY - if (lfs3_t_islookahead(trv->b.h.flags)) { + if (lfs3_t_islookahead(trv->b.h.flags) + && !lfs3_t_ismtreeonly(trv->b.h.flags) + && !lfs3_t_isckpointed(trv->b.h.flags)) { lfs3_alloc_markbptr(lfs3, tag, bptr_); } #endif + // mark in-use blocks in gbmap? + #ifdef LFS3_GBMAP + if (lfs3_t_isrebuildgbmap(trv->b.h.flags) + && !lfs3_t_ismtreeonly(trv->b.h.flags) + && lfs3_f_isgbmap(lfs3->flags) + && !lfs3_t_isckpointed(trv->b.h.flags)) { + err = lfs3_gbmap_setbptr(lfs3, &trv->gbmap_, tag, bptr_, + LFS3_TAG_BMINUSE); + if (err) { + goto failed; + } + + // keep our own ckpointed flag clear + trv->b.h.flags &= ~LFS3_t_CKPOINTED; + } + #endif + // mkconsistencing mdirs? if (lfs3_t_ismkconsistent(trv->b.h.flags) && lfs3_t_ismkconsistent(lfs3->flags) @@ -10674,8 +10758,8 @@ dropped:; #endif return tag; - #ifndef LFS3_RDONLY failed:; + #ifndef LFS3_RDONLY // swap back dirty/mutated flags trv->b.h.flags = lfs3_t_swapdirty(trv->b.h.flags); return err; @@ -10687,12 +10771,21 @@ eot:; #ifndef LFS3_2BONLY if (lfs3_t_islookahead(trv->b.h.flags) && !lfs3_t_ismtreeonly(trv->b.h.flags) - && !lfs3_t_isdirty(trv->b.h.flags) - && !lfs3_t_ismutated(trv->b.h.flags)) { + && !lfs3_t_isckpointed(trv->b.h.flags)) { lfs3_alloc_markfree(lfs3, lfs3->lookahead.ckpoint); } #endif + // was gbmap rebuild successful? + #ifdef LFS3_GBMAP + if (lfs3_t_isrebuildgbmap(trv->b.h.flags) + && !lfs3_t_ismtreeonly(trv->b.h.flags) + && lfs3_f_isgbmap(lfs3->flags) + && !lfs3_t_isckpointed(trv->b.h.flags)) { + lfs3_alloc_adoptgbmap(lfs3, &trv->gbmap_, lfs3->lookahead.ckpoint); + } + #endif + // was mkconsistent successful? if (lfs3_t_ismkconsistent(trv->b.h.flags) && !lfs3_t_isdirty(trv->b.h.flags)) { @@ -10981,6 +11074,36 @@ static int lfs3_gbmap_setbptr(lfs3_t *lfs3, lfs3_btree_t *gbmap, } #endif +#if !defined(LFS3_RDONLY) && defined(LFS3_GBMAP) +// not this is not completely atomic, but worst case we just end up with +// only some ranges remapped +static int lfs3_gbmap_remap(lfs3_t *lfs3, lfs3_btree_t *gbmap, + lfs3_tag_t tag, lfs3_tag_t tag_) { + lfs3_block_t block__ = -1; + while (true) { + lfs3_block_t weight__; + lfs3_stag_t tag__ = lfs3_gbmap_lookupnext(lfs3, gbmap, block__+1, + &block__, &weight__); + if (tag__ < 0) { + if (tag__ == LFS3_ERR_NOENT) { + break; + } + return tag__; + } + + if (tag__ == tag) { + int err = lfs3_gbmap_set_(lfs3, gbmap, block__, weight__, + tag_); + if (err) { + return err; + } + } + } + + return 0; +} +#endif + /// Block allocator /// @@ -10988,7 +11111,16 @@ static int lfs3_gbmap_setbptr(lfs3_t *lfs3, lfs3_btree_t *gbmap, // checkpoint only the lookahead buffer #ifndef LFS3_RDONLY static inline void lfs3_alloc_ckpoint_(lfs3_t *lfs3) { + // set ckpoint = disk size lfs3->lookahead.ckpoint = lfs3->block_count; + + // mark all traversals as ckpointed + // TODO should this be a function? non-clobbering? + for (lfs3_handle_t *h = lfs3->handles; h; h = h->next) { + if (lfs3_o_type(h->flags) == LFS3_type_TRV) { + h->flags |= LFS3_t_CKPOINTED; + } + } } #endif @@ -11137,10 +11269,7 @@ static void lfs3_alloc_markfree(lfs3_t *lfs3, lfs3_block_t known) { 8*lfs3->cfg->lookahead_size, known); - // TODO how does this interact with the gbmap? - // - // signal that lookahead is full, this may be cleared by - // lfs3_alloc_findfree + // signal that lookahead is full, this is cleared on first alloc lfs3->flags &= ~LFS3_I_LOOKAHEAD; // eagerly find the next free block so lookahead scans can make @@ -11180,6 +11309,9 @@ static void lfs3_alloc_inc(lfs3_t *lfs3) { if (lfs3_f_isgbmap(lfs3->flags)) { lfs3->gbmap.window = (lfs3->gbmap.window + 1) % lfs3->block_count; lfs3->gbmap.known = lfs3_smax(lfs3->gbmap.known-1, 0); + + // signal that the gbmap is no longer full + lfs3->flags |= LFS3_I_REBUILDGBMAP; } #endif } @@ -11319,6 +11451,18 @@ static lfs3_sblock_t lfs3_alloc(lfs3_t *lfs3, uint32_t flags) { } #endif +#if !defined(LFS3_RDONLY) && defined(LFS3_GBMAP) +static void lfs3_alloc_adoptgbmap(lfs3_t *lfs3, + const lfs3_btree_t *gbmap, lfs3_block_t known) { + // adopt new gbmap + lfs3->gbmap.known = known; + lfs3->gbmap.b = *gbmap; + + // signal that gbmap is full, this is cleared on first alloc + lfs3->flags &= ~LFS3_I_REBUILDGBMAP; +} +#endif + #if !defined(LFS3_RDONLY) && defined(LFS3_GBMAP) static int lfs3_alloc_rebuildgbmap(lfs3_t *lfs3) { LFS3_INFO("Rebuilding gbmap " @@ -11334,33 +11478,17 @@ static int lfs3_alloc_rebuildgbmap(lfs3_t *lfs3) { // we do this instead of creating a new gbmap to (1) preserve any // erased/bad info and (2) try to best use any available // erased-state - lfs3_block_t block = -1; - int err; - while (true) { - lfs3_block_t weight; - lfs3_stag_t tag = lfs3_gbmap_lookupnext(lfs3, &gbmap_, block+1, - &block, &weight); - if (tag < 0) { - if (tag == LFS3_ERR_NOENT) { - break; - } - err = tag; - goto failed; - } - - if (tag == LFS3_TAG_BMINUSE) { - err = lfs3_gbmap_set_(lfs3, &gbmap_, block, weight, - LFS3_TAG_BMFREE); - if (err) { - goto failed; - } - } + int err = lfs3_gbmap_remap(lfs3, &gbmap_, + LFS3_TAG_BMINUSE, + LFS3_TAG_BMFREE); + if (err) { + goto failed; } // traverse the filesystem, building up knowledge of what blocks are // in-use lfs3_trv_t trv; - lfs3_trv_init(&trv, LFS3_T_RDONLY | LFS3_T_LOOKAHEAD); + lfs3_trv_init(&trv, LFS3_T_RDONLY); while (true) { lfs3_bptr_t bptr; lfs3_stag_t tag = lfs3_mtree_traverse(lfs3, &trv, @@ -11388,8 +11516,7 @@ static int lfs3_alloc_rebuildgbmap(lfs3_t *lfs3) { // this avoids extra writing at a risk of needing to rebuild the // gbmap if we lose power // - lfs3->gbmap.known = lfs3->lookahead.ckpoint; - lfs3->gbmap.b = gbmap_; + lfs3_alloc_adoptgbmap(lfs3, &gbmap_, lfs3->lookahead.ckpoint); return 0; failed:; @@ -15321,6 +15448,7 @@ static int lfs3_init(lfs3_t *lfs3, uint32_t flags, LFS3_ASSERT((lfs3->cfg->gc_flags & ~( LFS3_GC_MKCONSISTENT | LFS3_GC_LOOKAHEAD + | LFS3_IFDEF_GBMAP(LFS3_GC_REBUILDGBMAP, 0) | LFS3_GC_COMPACT | LFS3_GC_CKMETA | LFS3_GC_CKDATA)) == 0); @@ -15342,6 +15470,7 @@ static int lfs3_init(lfs3_t *lfs3, uint32_t flags, LFS3_ASSERT(lfs3->cfg->fragment_size <= lfs3->cfg->block_size/4); #endif + // TODO move this to mount? // setup flags lfs3->flags = flags // assume we contain orphans until proven otherwise @@ -16155,6 +16284,15 @@ static int lfs3_mountinited(lfs3_t *lfs3) { // if we have a gbmap, position our lookahead buffer at the last // known gbmap window lfs3->lookahead.window = lfs3->gbmap.window; + + // and mark our gbmap as rebuildable if known window does not + // include the entire disk + // + // unfortunately the use of block allocation during gbmap + // rebuilds means this almost never happens + if (lfs3->gbmap.known < lfs3->block_count) { + lfs3->flags |= LFS3_I_REBUILDGBMAP; + } #endif } else { @@ -16210,6 +16348,9 @@ int lfs3_mount(lfs3_t *lfs3, uint32_t flags, #ifdef LFS3_YES_LOOKAHEAD flags |= LFS3_M_LOOKAHEAD; #endif + #ifdef LFS3_YES_REBUILDGBMAP + flags |= LFS3_YES_REBUILDGBMAP; + #endif #ifdef LFS3_YES_COMPACT flags |= LFS3_M_COMPACT; #endif @@ -16234,12 +16375,15 @@ int lfs3_mount(lfs3_t *lfs3, uint32_t flags, | LFS3_IFDEF_CKDATACKSUMS(LFS3_M_CKDATACKSUMS, 0) | LFS3_IFDEF_RDONLY(0, LFS3_M_MKCONSISTENT) | LFS3_IFDEF_RDONLY(0, LFS3_M_LOOKAHEAD) + | LFS3_IFDEF_RDONLY(0, + LFS3_IFDEF_GBMAP(LFS3_M_REBUILDGBMAP, 0)) | LFS3_IFDEF_RDONLY(0, LFS3_M_COMPACT) | LFS3_M_CKMETA | LFS3_M_CKDATA)) == 0); // these flags require a writable filesystem LFS3_ASSERT(!lfs3_m_isrdonly(flags) || !lfs3_t_ismkconsistent(flags)); LFS3_ASSERT(!lfs3_m_isrdonly(flags) || !lfs3_t_islookahead(flags)); + LFS3_ASSERT(!lfs3_m_isrdonly(flags) || !lfs3_t_isrebuildgbmap(flags)); LFS3_ASSERT(!lfs3_m_isrdonly(flags) || !lfs3_t_iscompact(flags)); int err = lfs3_init(lfs3, @@ -16268,6 +16412,8 @@ int lfs3_mount(lfs3_t *lfs3, uint32_t flags, if (flags & ( LFS3_IFDEF_RDONLY(0, LFS3_M_MKCONSISTENT) | LFS3_IFDEF_RDONLY(0, LFS3_M_LOOKAHEAD) + | LFS3_IFDEF_RDONLY(0, + LFS3_IFDEF_GBMAP(LFS3_M_REBUILDGBMAP, 0)) | LFS3_IFDEF_RDONLY(0, LFS3_M_COMPACT) | LFS3_M_CKMETA | LFS3_M_CKDATA)) { @@ -16276,6 +16422,8 @@ int lfs3_mount(lfs3_t *lfs3, uint32_t flags, flags & ( LFS3_IFDEF_RDONLY(0, LFS3_M_MKCONSISTENT) | LFS3_IFDEF_RDONLY(0, LFS3_M_LOOKAHEAD) + | LFS3_IFDEF_RDONLY(0, + LFS3_IFDEF_GBMAP(LFS3_M_REBUILDGBMAP, 0)) | LFS3_IFDEF_RDONLY(0, LFS3_M_COMPACT) | LFS3_M_CKMETA | LFS3_M_CKDATA), @@ -16618,6 +16766,8 @@ int lfs3_fs_stat(lfs3_t *lfs3, struct lfs3_fsinfo *fsinfo) { | LFS3_IFDEF_CKDATACKSUMS(LFS3_I_CKDATACKSUMS, 0) | LFS3_IFDEF_RDONLY(0, LFS3_I_MKCONSISTENT) | LFS3_IFDEF_RDONLY(0, LFS3_I_LOOKAHEAD) + | LFS3_IFDEF_RDONLY(0, + LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, 0)) | LFS3_IFDEF_RDONLY(0, LFS3_I_COMPACT) | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -16885,15 +17035,19 @@ static int lfs3_fs_gc_(lfs3_t *lfs3, lfs3_trv_t *trv, LFS3_ASSERT((flags & ~( LFS3_IFDEF_RDONLY(0, LFS3_T_MKCONSISTENT) | LFS3_IFDEF_RDONLY(0, LFS3_T_LOOKAHEAD) + | LFS3_IFDEF_RDONLY(0, + LFS3_IFDEF_GBMAP(LFS3_T_REBUILDGBMAP, 0)) | LFS3_IFDEF_RDONLY(0, LFS3_T_COMPACT) | LFS3_T_CKMETA | LFS3_T_CKDATA)) == 0); // these flags require a writable filesystem LFS3_ASSERT(!lfs3_m_isrdonly(lfs3->flags) || !lfs3_t_ismkconsistent(flags)); LFS3_ASSERT(!lfs3_m_isrdonly(lfs3->flags) || !lfs3_t_islookahead(flags)); + LFS3_ASSERT(!lfs3_m_isrdonly(lfs3->flags) || !lfs3_t_isrebuildgbmap(flags)); LFS3_ASSERT(!lfs3_m_isrdonly(lfs3->flags) || !lfs3_t_iscompact(flags)); // some flags don't make sense when only traversing the mtree LFS3_ASSERT(!lfs3_t_ismtreeonly(flags) || !lfs3_t_islookahead(flags)); + LFS3_ASSERT(!lfs3_t_ismtreeonly(flags) || !lfs3_t_isrebuildgbmap(flags)); LFS3_ASSERT(!lfs3_t_ismtreeonly(flags) || !lfs3_t_isckdata(flags)); // fix pending grms if requested @@ -16912,36 +17066,26 @@ static int lfs3_fs_gc_(lfs3_t *lfs3, lfs3_trv_t *trv, (lfs3->flags & ( LFS3_IFDEF_RDONLY(0, LFS3_I_MKCONSISTENT) | LFS3_IFDEF_RDONLY(0, LFS3_I_LOOKAHEAD) + | LFS3_IFDEF_RDONLY(0, + LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, 0)) | LFS3_IFDEF_RDONLY(0, LFS3_I_COMPACT) | LFS3_I_CKMETA | LFS3_I_CKDATA))); while (pending && (lfs3_off_t)steps > 0) { - // checkpoint the allocator to maximize any lookahead scans - // - // TODO how does the gbmap interact with LFS3_T_LOOKAHEAD? Should - // we populate it? use a different flag? - // - #ifndef LFS3_RDONLY - if (lfs3_t_islookahead(trv->b.h.flags)) { - int err = lfs3_alloc_ckpoint(lfs3); - if (err) { - return err; - } - } - #endif - // start a new traversal? if (!lfs3_handle_isopen(lfs3, &trv->b.h)) { lfs3_trv_init(trv, pending); lfs3_handle_open(lfs3, &trv->b.h); } - // don't bother with lookahead if we've mutated + // don't bother with lookahead/gbmap if we've ckpointed #ifndef LFS3_RDONLY - if (lfs3_t_isdirty(trv->b.h.flags) - || lfs3_t_ismutated(trv->b.h.flags)) { + if (lfs3_t_isckpointed(trv->b.h.flags)) { trv->b.h.flags &= ~LFS3_T_LOOKAHEAD; + #ifdef LFS3_GBMAP + trv->b.h.flags &= ~LFS3_T_REBUILDGBMAP; + #endif } #endif @@ -16949,6 +17093,8 @@ static int lfs3_fs_gc_(lfs3_t *lfs3, lfs3_trv_t *trv, if (!(trv->b.h.flags & ( LFS3_IFDEF_RDONLY(0, LFS3_T_MKCONSISTENT) | LFS3_IFDEF_RDONLY(0, LFS3_T_LOOKAHEAD) + | LFS3_IFDEF_RDONLY(0, + LFS3_IFDEF_GBMAP(LFS3_T_REBUILDGBMAP, 0)) | LFS3_IFDEF_RDONLY(0, LFS3_T_COMPACT) | LFS3_T_CKMETA | LFS3_T_CKDATA))) { @@ -16959,6 +17105,8 @@ static int lfs3_fs_gc_(lfs3_t *lfs3, lfs3_trv_t *trv, // do we really need a full traversal? if (!(trv->b.h.flags & ( LFS3_IFDEF_RDONLY(0, LFS3_T_LOOKAHEAD) + | LFS3_IFDEF_RDONLY(0, + LFS3_IFDEF_GBMAP(LFS3_T_REBUILDGBMAP, 0)) | LFS3_T_CKMETA | LFS3_T_CKDATA))) { trv->b.h.flags |= LFS3_T_MTREEONLY; @@ -16980,6 +17128,8 @@ static int lfs3_fs_gc_(lfs3_t *lfs3, lfs3_trv_t *trv, pending &= lfs3->flags & ( LFS3_IFDEF_RDONLY(0, LFS3_I_MKCONSISTENT) | LFS3_IFDEF_RDONLY(0, LFS3_I_LOOKAHEAD) + | LFS3_IFDEF_RDONLY(0, + LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, 0)) | LFS3_IFDEF_RDONLY(0, LFS3_I_COMPACT) | LFS3_I_CKMETA | LFS3_I_CKDATA); @@ -17013,6 +17163,8 @@ int lfs3_fs_unck(lfs3_t *lfs3, uint32_t flags) { LFS3_ASSERT((flags & ~( LFS3_IFDEF_RDONLY(0, LFS3_I_MKCONSISTENT) | LFS3_IFDEF_RDONLY(0, LFS3_I_LOOKAHEAD) + | LFS3_IFDEF_RDONLY(0, + LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, 0)) | LFS3_IFDEF_RDONLY(0, LFS3_I_COMPACT) | LFS3_I_CKMETA | LFS3_I_CKDATA)) == 0); @@ -17243,6 +17395,8 @@ int lfs3_trv_open(lfs3_t *lfs3, lfs3_trv_t *trv, uint32_t flags) { | LFS3_T_MTREEONLY | LFS3_IFDEF_RDONLY(0, LFS3_T_MKCONSISTENT) | LFS3_IFDEF_RDONLY(0, LFS3_T_LOOKAHEAD) + | LFS3_IFDEF_RDONLY(0, + LFS3_IFDEF_GBMAP(LFS3_T_REBUILDGBMAP, 0)) | LFS3_IFDEF_RDONLY(0, LFS3_T_COMPACT) | LFS3_T_CKMETA | LFS3_T_CKDATA)) == 0); @@ -17251,9 +17405,11 @@ int lfs3_trv_open(lfs3_t *lfs3, lfs3_trv_t *trv, uint32_t flags) { // these flags require a writable traversal LFS3_ASSERT(!lfs3_t_isrdonly(flags) || !lfs3_t_ismkconsistent(flags)); LFS3_ASSERT(!lfs3_t_isrdonly(flags) || !lfs3_t_islookahead(flags)); + LFS3_ASSERT(!lfs3_t_isrdonly(flags) || !lfs3_t_isrebuildgbmap(flags)); LFS3_ASSERT(!lfs3_t_isrdonly(flags) || !lfs3_t_iscompact(flags)); // some flags don't make sense when only traversing the mtree LFS3_ASSERT(!lfs3_t_ismtreeonly(flags) || !lfs3_t_islookahead(flags)); + LFS3_ASSERT(!lfs3_t_ismtreeonly(flags) || !lfs3_t_isrebuildgbmap(flags)); LFS3_ASSERT(!lfs3_t_ismtreeonly(flags) || !lfs3_t_isckdata(flags)); // setup traversal state @@ -17300,20 +17456,6 @@ int lfs3_trv_read(lfs3_t *lfs3, lfs3_trv_t *trv, } #endif - // checkpoint the allocator to maximize any lookahead scans - // - // TODO how does the gbmap interact with LFS3_T_LOOKAHEAD? Should - // we populate it? use a different flag? - // - #ifndef LFS3_RDONLY - if (lfs3_t_islookahead(trv->b.h.flags)) { - int err = lfs3_alloc_ckpoint(lfs3); - if (err) { - return err; - } - } - #endif - while (true) { // some redund blocks left over? if (trv->blocks[0] != -1) { @@ -17409,6 +17551,7 @@ static int lfs3_trv_rewind_(lfs3_t *lfs3, lfs3_trv_t *trv) { // reset traversal lfs3_trv_init(trv, trv->b.h.flags + & ~LFS3_t_CKPOINTED & ~LFS3_t_DIRTY & ~LFS3_t_MUTATED & ~LFS3_t_TSTATE); diff --git a/lfs3.h b/lfs3.h index 4186882b..60284268 100644 --- a/lfs3.h +++ b/lfs3.h @@ -236,6 +236,10 @@ enum lfs3_type { #define LFS3_M_LOOKAHEAD \ 0x00000200 // Populate lookahead buffer #endif +#if !defined(LFS3_RDONLY) && defined(LFS3_GBMAP) +#define LFS3_M_REBUILDGBMAP \ + 0x00000400 // Rebuild the gbmap +#endif #ifndef LFS3_RDONLY #define LFS3_M_COMPACT 0x00000800 // Compact metadata logs #endif @@ -277,6 +281,10 @@ enum lfs3_type { #define LFS3_I_LOOKAHEAD \ 0x00000200 // Lookahead buffer is not full #endif +#if !defined(LFS3_RDONLY) && defined(LFS3_GBMAP) +#define LFS3_I_REBUILDGBMAP \ + 0x00000400 // The gbmap is not full +#endif #ifndef LFS3_RDONLY #define LFS3_I_COMPACT 0x00000800 // Filesystem may have uncompacted metadata #endif @@ -318,6 +326,10 @@ enum lfs3_btype { #define LFS3_T_LOOKAHEAD \ 0x00000200 // Populate lookahead buffer #endif +#if !defined(LFS3_RDONLY) && defined(LFS3_GBMAP) +#define LFS3_T_REBUILDGBMAP \ + 0x00000400 // Rebuild the gbmap +#endif #ifndef LFS3_RDONLY #define LFS3_T_COMPACT 0x00000800 // Compact metadata logs #endif @@ -329,6 +341,8 @@ enum lfs3_btype { #define LFS3_t_TSTATE 0x000f0000 // The current traversal state #define LFS3_t_BTYPE 0x00f00000 // The current block type #define LFS3_t_ZOMBIE 0x08000000 // File has been removed +#define LFS3_t_CKPOINTED \ + 0x04000000 // Filesystem ckpointed during traversal #define LFS3_t_DIRTY 0x02000000 // Filesystem modified during traversal #define LFS3_t_MUTATED 0x01000000 // Filesystem modified by traversal @@ -341,6 +355,10 @@ enum lfs3_btype { #define LFS3_GC_LOOKAHEAD \ 0x00000200 // Populate lookahead buffer #endif +#if !defined(LFS3_RDONLY) && defined(LFS3_GBMAP) +#define LFS3_GC_REBUILDGBMAP \ + 0x00000400 // Rebuild the gbmap +#endif #ifndef LFS3_RDONLY #define LFS3_GC_COMPACT 0x00000800 // Compact metadata logs #endif @@ -810,6 +828,10 @@ typedef struct lfs3_trv { // bshrub/btree traversal state lfs3_sbid_t bid; + // rebuild gbmap when traversing with rebuildgbmap + #ifdef LFS3_GBMAP + lfs3_btree_t gbmap_; + #endif // recalculate gcksum when traversing with ckmeta uint32_t gcksum; // pending blocks, only used in lfs3_trv_read diff --git a/scripts/dbgflags.py b/scripts/dbgflags.py index 2695a0fa..a6eed4ce 100755 --- a/scripts/dbgflags.py +++ b/scripts/dbgflags.py @@ -90,6 +90,7 @@ FLAGS = [ ('M_MKCONSISTENT', 0x00000100, "Make the filesystem consistent" ), ('M_LOOKAHEAD', 0x00000200, "Populate lookahead buffer" ), + ('M_REBUILDGBMAP', 0x00000400, "Rebuild the gbmap" ), ('M_COMPACT', 0x00000800, "Compact metadata logs" ), ('M_CKMETA', 0x00001000, "Check metadata checksums" ), ('M_CKDATA', 0x00002000, "Check metadata + data checksums" ), @@ -97,6 +98,7 @@ FLAGS = [ # GC flags ('GC_MKCONSISTENT',0x00000100, "Make the filesystem consistent" ), ('GC_LOOKAHEAD', 0x00000200, "Populate lookahead buffer" ), + ('GC_REBUILDGBMAP',0x00000400, "Rebuild the gbmap" ), ('GC_COMPACT', 0x00000800, "Compact metadata logs" ), ('GC_CKMETA', 0x00001000, "Check metadata checksums" ), ('GC_CKDATA', 0x00002000, "Check metadata + data checksums" ), @@ -114,6 +116,7 @@ FLAGS = [ ('I_MKCONSISTENT', 0x00000100, "Filesystem needs mkconsistent to write" ), ('I_LOOKAHEAD', 0x00000200, "Lookahead buffer is not full" ), + ('I_REBUILDGBMAP', 0x00000400, "The gbmap is not full" ), ('I_COMPACT', 0x00000800, "Filesystem may have uncompacted metadata" ), ('I_CKMETA', 0x00001000, "Metadata checksums not checked recently" ), ('I_CKDATA', 0x00002000, "Data checksums not checked recently" ), @@ -132,6 +135,7 @@ FLAGS = [ ('T_MKCONSISTENT', 0x00000100, "Make the filesystem consistent" ), ('T_LOOKAHEAD', 0x00000200, "Populate lookahead buffer" ), + ('T_REBUILDGBMAP', 0x00000400, "Rebuild the gbmap" ), ('T_COMPACT', 0x00000800, "Compact metadata logs" ), ('T_CKMETA', 0x00001000, "Check metadata checksums" ), ('T_CKDATA', 0x00002000, "Check metadata + data checksums" ), @@ -149,18 +153,20 @@ FLAGS = [ 0x00000000, "Tstate = mroot-anchor" ), ('^_MROOTCHAIN', 0x00010000, "Tstate = mroot-chain" ), ('^_MTREE', 0x00020000, "Tstate = mtree" ), - ('^_BMAP', 0x00030000, "Tstate = bmap" ), - ('^_MDIRS', 0x00040000, "Tstate = mtree-mdirs" ), - ('^_MDIR', 0x00050000, "Tstate = mdir" ), - ('^_BTREE', 0x00060000, "Tstate = btree" ), - ('^_HANDLES', 0x00070000, "Tstate = open-mdirs" ), - ('^_HBTREE', 0x00080000, "Tstate = open-btree" ), - ('^_DONE', 0x00090000, "Tstate = done" ), + ('^_MDIRS', 0x00030000, "Tstate = mtree-mdirs" ), + ('^_MDIR', 0x00040000, "Tstate = mdir" ), + ('^_BTREE', 0x00050000, "Tstate = btree" ), + ('^_HANDLES', 0x00060000, "Tstate = open-mdirs" ), + ('^_HBTREE', 0x00070000, "Tstate = open-btree" ), + ('^_GBMAP', 0x00080000, "Tstate = gbmap" ), + ('^_GBMAP_P', 0x00090000, "Tstate = gbmap_p" ), + ('^_DONE', 0x000a0000, "Tstate = done" ), ('t_BTYPE', 0x00f00000, "The current block type" ), ('^_MDIR', 0x00100000, "Btype = mdir" ), ('^_BTREE', 0x00200000, "Btype = btree" ), ('^_DATA', 0x00300000, "Btype = data" ), ('t_ZOMBIE', 0x08000000, "File has been removed" ), + ('t_CKPOINTED', 0x04000000, "Filesystem ckpointed during traversal" ), ('t_DIRTY', 0x02000000, "Filesystem modified during traversal" ), ('t_MUTATED', 0x01000000, "Filesystem modified by traversal" ), diff --git a/tests/test_gc.toml b/tests/test_gc.toml index ef385327..6300219e 100644 --- a/tests/test_gc.toml +++ b/tests/test_gc.toml @@ -4,6 +4,15 @@ # GC-API specific things here after = ['test_trvs'] +# Test both with and without the gbmap if available +defines.GBMAP = [false, true] +if = ''' + LFS3_IFDEF_YES_GBMAP( + GBMAP, + LFS3_IFDEF_GBMAP(true, !GBMAP)) +''' + + # test that lookahead can make progress in isolation [cases.test_gc_lookahead_progress] defines.CKMETA = [false, true] @@ -25,7 +34,10 @@ defines.SIZE = [ ifdef = 'LFS3_GC' code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -92,7 +104,10 @@ if = 'CKMETA || CKDATA' ifdef = 'LFS3_GC' code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -147,6 +162,159 @@ code = ''' ''' +# test that rebuildgbmap can make progress in isolation +[cases.test_gc_rebuildgbmap_progress] +defines.LOOKAHEAD = [false, true] +defines.CKMETA = [false, true] +defines.CKDATA = [false, true] +defines.GC_FLAGS = ''' + LFS3_GC_REBUILDGBMAP + | ((LOOKAHEAD) ? LFS3_GC_LOOKAHEAD : 0) + | ((CKMETA) ? LFS3_GC_CKMETA : 0) + | ((CKDATA) ? LFS3_GC_CKDATA : 0) +''' +defines.GC_STEPS = [-1, 1, 2, 10, 100, 1000] +defines.SIZE = [ + 'BLOCK_SIZE/2', + 'BLOCK_SIZE', + '2*BLOCK_SIZE', + '8*BLOCK_SIZE', +] +if = 'GBMAP' +ifdef = ['LFS3_GC', 'LFS3_GBMAP'] +code = ''' + lfs3_t lfs3; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; + lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; + + uint32_t prng = 42; + + // create a file + lfs3_file_t file; + lfs3_file_open(&lfs3, &file, "spider", + LFS3_O_WRONLY | LFS3_O_CREAT | LFS3_O_EXCL) => 0; + uint8_t wbuf[SIZE]; + for (lfs3_size_t j = 0; j < SIZE; j++) { + wbuf[j] = 'a' + (TEST_PRNG(&prng) % 26); + } + lfs3_file_write(&lfs3, &file, wbuf, SIZE) => SIZE; + lfs3_file_close(&lfs3, &file) => 0; + + // expect dirty initial state or else our test doesn't work + struct lfs3_fsinfo fsinfo; + lfs3_fs_stat(&lfs3, &fsinfo) => 0; + assert(fsinfo.flags & LFS3_I_REBUILDGBMAP); + assert(lfs3.handles != &lfs3.gc.trv.b.h); + + // run GC until we make progress + for (lfs3_block_t i = 0;; i++) { + // a bit hacky, but this catches infinite loops + LFS3_ASSERT(i < 2*BLOCK_COUNT); + + lfs3_fs_gc(&lfs3) => 0; + + lfs3_fs_stat(&lfs3, &fsinfo) => 0; + if (!(fsinfo.flags & LFS3_I_REBUILDGBMAP)) { + break; + } + } + + // check the file contents + lfs3_file_open(&lfs3, &file, "spider", LFS3_O_RDONLY) => 0; + uint8_t rbuf[SIZE]; + lfs3_file_read(&lfs3, &file, rbuf, SIZE) => SIZE; + assert(memcmp(rbuf, wbuf, SIZE) == 0); + lfs3_file_close(&lfs3, &file) => 0; + + lfs3_unmount(&lfs3) => 0; +''' + +# test that rebuildgbmap dirtying still works with the GC API +[cases.test_gc_rebuildgbmap_mutation] +defines.LOOKAHEAD = [false, true] +defines.CKMETA = [false, true] +defines.CKDATA = [false, true] +defines.GC_FLAGS = ''' + LFS3_GC_REBUILDGBMAP + | ((LOOKAHEAD) ? LFS3_GC_LOOKAHEAD : 0) + | ((CKMETA) ? LFS3_GC_CKMETA : 0) + | ((CKDATA) ? LFS3_GC_CKDATA : 0) +''' +defines.SIZE = [ + 'BLOCK_SIZE/2', + 'BLOCK_SIZE', + '2*BLOCK_SIZE', + '8*BLOCK_SIZE', +] +if = [ + # we need something to keep the traversal running + 'CKMETA || CKDATA', + 'GBMAP', +] +ifdef = ['LFS3_GC', 'LFS3_GBMAP'] +code = ''' + lfs3_t lfs3; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; + lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; + + uint32_t prng = 42; + + // create a file + lfs3_file_t file; + lfs3_file_open(&lfs3, &file, "spider", + LFS3_O_WRONLY | LFS3_O_CREAT | LFS3_O_EXCL) => 0; + uint8_t wbuf[SIZE]; + for (lfs3_size_t j = 0; j < SIZE; j++) { + wbuf[j] = 'a' + (TEST_PRNG(&prng) % 26); + } + lfs3_file_write(&lfs3, &file, wbuf, SIZE) => SIZE; + lfs3_file_close(&lfs3, &file) => 0; + + // expect dirty initial state or else our test doesn't work + struct lfs3_fsinfo fsinfo; + lfs3_fs_stat(&lfs3, &fsinfo) => 0; + assert(fsinfo.flags & LFS3_I_REBUILDGBMAP); + assert(lfs3.handles != &lfs3.gc.trv.b.h); + + // run GC one step + lfs3_fs_gc(&lfs3) => 0; + assert(lfs3.handles == &lfs3.gc.trv.b.h); + + // mutate the filesystem + lfs3_file_open(&lfs3, &file, "spider", + LFS3_O_WRONLY | LFS3_O_TRUNC) => 0; + for (lfs3_size_t j = 0; j < SIZE; j++) { + wbuf[j] = 'a' + (TEST_PRNG(&prng) % 26); + } + lfs3_file_write(&lfs3, &file, wbuf, SIZE) => SIZE; + lfs3_file_close(&lfs3, &file) => 0; + + // run GC until our traversal is done + while (lfs3.handles == &lfs3.gc.trv.b.h) { + lfs3_fs_gc(&lfs3) => 0; + } + + // we should _not_ make progress + lfs3_fs_stat(&lfs3, &fsinfo) => 0; + assert(fsinfo.flags & LFS3_I_REBUILDGBMAP); + + // check the file contents + lfs3_file_open(&lfs3, &file, "spider", LFS3_O_RDONLY) => 0; + uint8_t rbuf[SIZE]; + lfs3_file_read(&lfs3, &file, rbuf, SIZE) => SIZE; + assert(memcmp(rbuf, wbuf, SIZE) == 0); + lfs3_file_close(&lfs3, &file) => 0; + + lfs3_unmount(&lfs3) => 0; +''' + + # test that compact can make progress in isolation [cases.test_gc_compact_progress] defines.LOOKAHEAD = [false, true] @@ -172,7 +340,10 @@ defines.SIZE = [ ifdef = 'LFS3_GC' code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -261,7 +432,10 @@ if = 'CKMETA || CKDATA' ifdef = 'LFS3_GC' code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -359,7 +533,10 @@ defines.ORPHANS = [1, 2, 3, 100] ifdef = 'LFS3_GC' code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -461,7 +638,10 @@ defines.SIZE = 'FILE_CACHE_SIZE/2' defines.ORPHANS = [1, 2, 3, 100] code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -572,7 +752,10 @@ if = 'CKMETA || CKDATA' ifdef = 'LFS3_GC' code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -699,7 +882,10 @@ code = ''' assert(i < 2*BLOCK_COUNT); lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // create an interesting filesystem @@ -799,7 +985,10 @@ code = ''' assert(i < 2*BLOCK_COUNT); lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // create an interesting filesystem @@ -901,7 +1090,10 @@ code = ''' assert(i < 2*BLOCK_COUNT); lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // create an interesting filesystem @@ -988,7 +1180,10 @@ code = ''' assert(i < 2*BLOCK_COUNT); lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // create an interesting filesystem @@ -1087,7 +1282,10 @@ code = ''' assert(i < 2*BLOCK_COUNT); lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // create an interesting filesystem @@ -1250,7 +1448,10 @@ code = ''' assert(i < 2*BLOCK_COUNT); lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // create an interesting filesystem @@ -1398,12 +1599,14 @@ done:; defines.AFTER = [0, 1, 2, 3] defines.MKCONSISTENT = [false, true] defines.LOOKAHEAD = [false, true] +defines.REBUILDGBMAP = [false, true] defines.COMPACT = [false, true] defines.CKMETA = [false, true] defines.CKDATA = [false, true] defines.GC_FLAGS = ''' ((MKCONSISTENT) ? LFS3_GC_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_GC_LOOKAHEAD : 0) + | ((REBUILDGBMAP) ? LFS3_IFDEF_GBMAP(LFS3_GC_REBUILDGBMAP, -1) : 0) | ((COMPACT) ? LFS3_GC_COMPACT : 0) | ((CKMETA) ? LFS3_GC_CKMETA : 0) | ((CKDATA) ? LFS3_GC_CKDATA : 0) @@ -1422,10 +1625,14 @@ defines.SIZE = [ if = [ '(SIZE*N)/BLOCK_SIZE <= 32', 'LFS3_IFDEF_GC(true, AFTER != 0)', + 'GBMAP || !REBUILDGBMAP', ] code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // create an interesting filesystem @@ -1456,10 +1663,14 @@ code = ''' assert(fsinfo.flags == ( LFS3_I_MKCONSISTENT | LFS3_I_LOOKAHEAD + | ((GBMAP) + ? (LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) + & fsinfo.flags) + : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // run gc if (AFTER == 0) { @@ -1477,6 +1688,9 @@ code = ''' if (!(fsinfo.flags & ( ((MKCONSISTENT) ? LFS3_I_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_I_LOOKAHEAD : 0) + | ((REBUILDGBMAP) + ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) + : 0) | ((COMPACT) ? LFS3_I_COMPACT : 0) | ((CKMETA) ? LFS3_I_CKMETA : 0) | ((CKDATA) ? LFS3_I_CKDATA : 0)))) { @@ -1506,17 +1720,20 @@ code = ''' if (!(fsinfo.flags & ( ((MKCONSISTENT) ? LFS3_I_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_I_LOOKAHEAD : 0) + | ((REBUILDGBMAP) + ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) + : 0) | ((COMPACT) ? LFS3_I_COMPACT : 0) | ((CKMETA) ? LFS3_I_CKMETA : 0) | ((CKDATA) ? LFS3_I_CKDATA : 0)))) { break; } - if (MKCONSISTENT) { + if (MKCONSISTENT && (fsinfo.flags & LFS3_I_MKCONSISTENT)) { lfs3_fs_mkconsistent(&lfs3) => 0; } - if (LOOKAHEAD) { + if (LOOKAHEAD && (fsinfo.flags & LFS3_I_LOOKAHEAD)) { // we need an explicit traversal for this lfs3_trv_t trv; lfs3_trv_open(&lfs3, &trv, @@ -1532,7 +1749,25 @@ code = ''' lfs3_trv_close(&lfs3, &trv) => 0; } - if (COMPACT) { + #ifdef LFS3_GBMAP + if (REBUILDGBMAP && (fsinfo.flags & LFS3_I_REBUILDGBMAP)) { + // we need an explicit traversal for this + lfs3_trv_t trv; + lfs3_trv_open(&lfs3, &trv, + LFS3_T_RDWR | LFS3_T_REBUILDGBMAP) => 0; + while (true) { + struct lfs3_tinfo tinfo; + int err = lfs3_trv_read(&lfs3, &trv, &tinfo); + assert(err == 0 || err == LFS3_ERR_NOENT); + if (err == LFS3_ERR_NOENT) { + break; + } + } + lfs3_trv_close(&lfs3, &trv) => 0; + } + #endif + + if (COMPACT && (fsinfo.flags & LFS3_I_COMPACT)) { // we need an explicit traversal for this lfs3_trv_t trv; lfs3_trv_open(&lfs3, &trv, @@ -1548,11 +1783,11 @@ code = ''' lfs3_trv_close(&lfs3, &trv) => 0; } - if (CKMETA) { + if (CKMETA && (fsinfo.flags & LFS3_I_CKMETA)) { lfs3_fs_ckmeta(&lfs3) => 0; } - if (CKDATA) { + if (CKDATA && (fsinfo.flags & LFS3_I_CKDATA)) { lfs3_fs_ckdata(&lfs3) => 0; } } @@ -1571,11 +1806,17 @@ code = ''' assert(fsinfo.flags == ( ((!MKCONSISTENT) ? LFS3_I_MKCONSISTENT : 0) | ((!LOOKAHEAD) ? LFS3_I_LOOKAHEAD : 0) + | ((!REBUILDGBMAP) + ? ((GBMAP) + ? (LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) + & fsinfo.flags) + : 0) + : 0) | ((!COMPACT) ? LFS3_I_COMPACT : 0) // note ckdata implies ckmeta | ((!CKMETA && !CKDATA) ? LFS3_I_CKMETA : 0) | ((!CKDATA) ? LFS3_I_CKDATA : 0) - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); lfs3_unmount(&lfs3) => 0; ''' @@ -1589,12 +1830,14 @@ code = ''' defines.AFTER = [0, 1, 2, 3] defines.MKCONSISTENT = [false, true] defines.LOOKAHEAD = [false, true] +defines.REBUILDGBMAP = [false, true] defines.COMPACT = [false, true] defines.CKMETA = [false, true] defines.CKDATA = [false, true] defines.GC_FLAGS = ''' ((MKCONSISTENT) ? LFS3_GC_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_GC_LOOKAHEAD : 0) + | ((REBUILDGBMAP) ? LFS3_IFDEF_GBMAP(LFS3_GC_REBUILDGBMAP, -1) : 0) | ((COMPACT) ? LFS3_GC_COMPACT : 0) | ((CKMETA) ? LFS3_GC_CKMETA : 0) | ((CKDATA) ? LFS3_GC_CKDATA : 0) @@ -1613,10 +1856,14 @@ defines.SIZE = [ if = [ '(SIZE*N)/BLOCK_SIZE <= 32', 'LFS3_IFDEF_GC(true, AFTER != 0)', + 'GBMAP || !REBUILDGBMAP', ] code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // create an interesting filesystem @@ -1647,10 +1894,14 @@ code = ''' assert(fsinfo.flags == ( LFS3_I_MKCONSISTENT | LFS3_I_LOOKAHEAD + | ((GBMAP) + ? (LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) + & fsinfo.flags) + : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // run gc if (AFTER == 0) { @@ -1668,6 +1919,9 @@ code = ''' if (!(fsinfo.flags & ( ((MKCONSISTENT) ? LFS3_I_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_I_LOOKAHEAD : 0) + | ((REBUILDGBMAP) + ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) + : 0) | ((COMPACT) ? LFS3_I_COMPACT : 0) | ((CKMETA) ? LFS3_I_CKMETA : 0) | ((CKDATA) ? LFS3_I_CKDATA : 0)))) { @@ -1697,17 +1951,20 @@ code = ''' if (!(fsinfo.flags & ( ((MKCONSISTENT) ? LFS3_I_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_I_LOOKAHEAD : 0) + | ((REBUILDGBMAP) + ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) + : 0) | ((COMPACT) ? LFS3_I_COMPACT : 0) | ((CKMETA) ? LFS3_I_CKMETA : 0) | ((CKDATA) ? LFS3_I_CKDATA : 0)))) { break; } - if (MKCONSISTENT) { + if (MKCONSISTENT && (fsinfo.flags & LFS3_I_MKCONSISTENT)) { lfs3_fs_mkconsistent(&lfs3) => 0; } - if (LOOKAHEAD) { + if (LOOKAHEAD && (fsinfo.flags & LFS3_I_LOOKAHEAD)) { // we need an explicit traversal for this lfs3_trv_t trv; lfs3_trv_open(&lfs3, &trv, @@ -1723,7 +1980,25 @@ code = ''' lfs3_trv_close(&lfs3, &trv) => 0; } - if (COMPACT) { + #ifdef LFS3_GBMAP + if (REBUILDGBMAP && (fsinfo.flags & LFS3_I_REBUILDGBMAP)) { + // we need an explicit traversal for this + lfs3_trv_t trv; + lfs3_trv_open(&lfs3, &trv, + LFS3_T_RDWR | LFS3_T_REBUILDGBMAP) => 0; + while (true) { + struct lfs3_tinfo tinfo; + int err = lfs3_trv_read(&lfs3, &trv, &tinfo); + assert(err == 0 || err == LFS3_ERR_NOENT); + if (err == LFS3_ERR_NOENT) { + break; + } + } + lfs3_trv_close(&lfs3, &trv) => 0; + } + #endif + + if (COMPACT && (fsinfo.flags & LFS3_I_COMPACT)) { // we need an explicit traversal for this lfs3_trv_t trv; lfs3_trv_open(&lfs3, &trv, @@ -1739,11 +2014,11 @@ code = ''' lfs3_trv_close(&lfs3, &trv) => 0; } - if (CKMETA) { + if (CKMETA && (fsinfo.flags & LFS3_I_CKMETA)) { lfs3_fs_ckmeta(&lfs3) => 0; } - if (CKDATA) { + if (CKDATA && (fsinfo.flags & LFS3_I_CKDATA)) { lfs3_fs_ckdata(&lfs3) => 0; } } @@ -1762,11 +2037,17 @@ code = ''' assert(fsinfo.flags == ( ((!MKCONSISTENT) ? LFS3_I_MKCONSISTENT : 0) | ((!LOOKAHEAD) ? LFS3_I_LOOKAHEAD : 0) + | ((!REBUILDGBMAP) + ? ((GBMAP) + ? (LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) + & fsinfo.flags) + : 0) + : 0) | ((!COMPACT) ? LFS3_I_COMPACT : 0) // note ckdata implies ckmeta | ((!CKMETA && !CKDATA) ? LFS3_I_CKMETA : 0) | ((!CKDATA) ? LFS3_I_CKDATA : 0) - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // test that we can reset flags with lfs3_fs_unck lfs3_fs_unck(&lfs3, GC_FLAGS) => 0; @@ -1776,12 +2057,18 @@ code = ''' assert(fsinfo.flags == ( LFS3_I_MKCONSISTENT | LFS3_I_LOOKAHEAD + | ((REBUILDGBMAP) + ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1U) + : (GBMAP) + ? (LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) + & fsinfo.flags) + : 0) | LFS3_I_COMPACT // note ckdata implies ckmeta, but uncking ckdata does // _not_ imply uncking ckmeta | ((!(CKDATA && !CKMETA)) ? LFS3_I_CKMETA : 0) | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // run gc if (AFTER == 0) { @@ -1799,6 +2086,9 @@ code = ''' if (!(fsinfo.flags & ( ((MKCONSISTENT) ? LFS3_I_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_I_LOOKAHEAD : 0) + | ((REBUILDGBMAP) + ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) + : 0) | ((COMPACT) ? LFS3_I_COMPACT : 0) | ((CKMETA) ? LFS3_I_CKMETA : 0) | ((CKDATA) ? LFS3_I_CKDATA : 0)))) { @@ -1828,17 +2118,20 @@ code = ''' if (!(fsinfo.flags & ( ((MKCONSISTENT) ? LFS3_I_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_I_LOOKAHEAD : 0) + | ((REBUILDGBMAP) + ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) + : 0) | ((COMPACT) ? LFS3_I_COMPACT : 0) | ((CKMETA) ? LFS3_I_CKMETA : 0) | ((CKDATA) ? LFS3_I_CKDATA : 0)))) { break; } - if (MKCONSISTENT) { + if (MKCONSISTENT && (fsinfo.flags & LFS3_I_MKCONSISTENT)) { lfs3_fs_mkconsistent(&lfs3) => 0; } - if (LOOKAHEAD) { + if (LOOKAHEAD && (fsinfo.flags & LFS3_I_LOOKAHEAD)) { // we need an explicit traversal for this lfs3_trv_t trv; lfs3_trv_open(&lfs3, &trv, @@ -1854,7 +2147,25 @@ code = ''' lfs3_trv_close(&lfs3, &trv) => 0; } - if (COMPACT) { + #ifdef LFS3_GBMAP + if (REBUILDGBMAP && (fsinfo.flags & LFS3_I_REBUILDGBMAP)) { + // we need an explicit traversal for this + lfs3_trv_t trv; + lfs3_trv_open(&lfs3, &trv, + LFS3_T_RDWR | LFS3_T_REBUILDGBMAP) => 0; + while (true) { + struct lfs3_tinfo tinfo; + int err = lfs3_trv_read(&lfs3, &trv, &tinfo); + assert(err == 0 || err == LFS3_ERR_NOENT); + if (err == LFS3_ERR_NOENT) { + break; + } + } + lfs3_trv_close(&lfs3, &trv) => 0; + } + #endif + + if (COMPACT && (fsinfo.flags & LFS3_I_COMPACT)) { // we need an explicit traversal for this lfs3_trv_t trv; lfs3_trv_open(&lfs3, &trv, @@ -1870,11 +2181,11 @@ code = ''' lfs3_trv_close(&lfs3, &trv) => 0; } - if (CKMETA) { + if (CKMETA && (fsinfo.flags & LFS3_I_CKMETA)) { lfs3_fs_ckmeta(&lfs3) => 0; } - if (CKDATA) { + if (CKDATA && (fsinfo.flags & LFS3_I_CKDATA)) { lfs3_fs_ckdata(&lfs3) => 0; } } @@ -1893,11 +2204,17 @@ code = ''' assert(fsinfo.flags == ( ((!MKCONSISTENT) ? LFS3_I_MKCONSISTENT : 0) | ((!LOOKAHEAD) ? LFS3_I_LOOKAHEAD : 0) + | ((!REBUILDGBMAP) + ? ((GBMAP) + ? (LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) + & fsinfo.flags) + : 0) + : 0) | ((!COMPACT) ? LFS3_I_COMPACT : 0) // note ckdata implies ckmeta | ((!CKMETA && !CKDATA) ? LFS3_I_CKMETA : 0) | ((!CKDATA) ? LFS3_I_CKDATA : 0) - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); lfs3_unmount(&lfs3) => 0; ''' @@ -1908,12 +2225,14 @@ code = ''' defines.N = 100 defines.MKCONSISTENT = [false, true] defines.LOOKAHEAD = [false, true] +defines.REBUILDGBMAP = [false, true] defines.COMPACT = [false, true] defines.CKMETA = [false, true] defines.CKDATA = [false, true] defines.GC_FLAGS = ''' ((MKCONSISTENT) ? LFS3_GC_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_GC_LOOKAHEAD : 0) + | ((REBUILDGBMAP) ? LFS3_IFDEF_GBMAP(LFS3_GC_REBUILDGBMAP, -1) : 0) | ((COMPACT) ? LFS3_GC_COMPACT : 0) | ((CKMETA) ? LFS3_GC_CKMETA : 0) | ((CKDATA) ? LFS3_GC_CKDATA : 0) @@ -1929,10 +2248,14 @@ defines.SIZE = [ '2*BLOCK_SIZE', '8*BLOCK_SIZE', ] +if = 'GBMAP || !REBUILDGBMAP' ifdef = 'LFS3_GC' code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -1977,12 +2300,14 @@ code = ''' defines.N = 100 defines.MKCONSISTENT = [false, true] defines.LOOKAHEAD = [false, true] +defines.REBUILDGBMAP = [false, true] defines.COMPACT = [false, true] defines.CKMETA = [false, true] defines.CKDATA = [false, true] defines.GC_FLAGS = ''' ((MKCONSISTENT) ? LFS3_GC_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_GC_LOOKAHEAD : 0) + | ((REBUILDGBMAP) ? LFS3_IFDEF_GBMAP(LFS3_GC_REBUILDGBMAP, -1) : 0) | ((COMPACT) ? LFS3_GC_COMPACT : 0) | ((CKMETA) ? LFS3_GC_CKMETA : 0) | ((CKDATA) ? LFS3_GC_CKDATA : 0) @@ -1998,10 +2323,14 @@ defines.SIZE = [ '2*BLOCK_SIZE', '8*BLOCK_SIZE', ] +if = 'GBMAP || !REBUILDGBMAP' ifdef = 'LFS3_GC' code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -2053,6 +2382,7 @@ code = ''' [cases.test_gc_spam_dir_many] defines.MKCONSISTENT = [false, true] defines.LOOKAHEAD = [false, true] +defines.REBUILDGBMAP = [false, true] defines.COMPACT = [false, true] defines.CKMETA = [false, true] defines.CKDATA = [false, true] @@ -2060,6 +2390,7 @@ defines.UNCK = [false, true] defines.GC_FLAGS = ''' ((MKCONSISTENT) ? LFS3_GC_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_GC_LOOKAHEAD : 0) + | ((REBUILDGBMAP) ? LFS3_IFDEF_GBMAP(LFS3_GC_REBUILDGBMAP, -1) : 0) | ((COMPACT) ? LFS3_GC_COMPACT : 0) | ((CKMETA) ? LFS3_GC_CKMETA : 0) | ((CKDATA) ? LFS3_GC_CKDATA : 0) @@ -2068,11 +2399,15 @@ defines.GC_STEPS = [-1, 1, 2, 10, 100, 1000] # set compact thresh to minimum defines.GC_COMPACT_THRESH = 'BLOCK_SIZE/2' defines.N = [1, 2, 4, 8, 16, 32, 64, 128, 256] +if = 'GBMAP || !REBUILDGBMAP' ifdef = 'LFS3_GC' code = ''' // test creating directories lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // make this many directories @@ -2157,6 +2492,7 @@ code = ''' [cases.test_gc_spam_dir_fuzz] defines.MKCONSISTENT = [false, true] defines.LOOKAHEAD = [false, true] +defines.REBUILDGBMAP = [false, true] defines.COMPACT = [false, true] defines.CKMETA = [false, true] defines.CKDATA = [false, true] @@ -2164,6 +2500,7 @@ defines.UNCK = [false, true] defines.GC_FLAGS = ''' ((MKCONSISTENT) ? LFS3_GC_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_GC_LOOKAHEAD : 0) + | ((REBUILDGBMAP) ? LFS3_IFDEF_GBMAP(LFS3_GC_REBUILDGBMAP, -1) : 0) | ((COMPACT) ? LFS3_GC_COMPACT : 0) | ((CKMETA) ? LFS3_GC_CKMETA : 0) | ((CKDATA) ? LFS3_GC_CKDATA : 0) @@ -2175,11 +2512,15 @@ defines.N = [1, 2, 4, 8, 16, 32, 64, 128, 256] defines.OPS = '2*N' defines.SEED = 42 fuzz = 'SEED' +if = 'GBMAP || !REBUILDGBMAP' ifdef = 'LFS3_GC' code = ''' // test fuzz with dirs lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // set up a simulation to compare against @@ -2332,6 +2673,7 @@ code = ''' [cases.test_gc_spam_file_many] defines.MKCONSISTENT = [false, true] defines.LOOKAHEAD = [false, true] +defines.REBUILDGBMAP = [false, true] defines.COMPACT = [false, true] defines.CKMETA = [false, true] defines.CKDATA = [false, true] @@ -2339,6 +2681,7 @@ defines.UNCK = [false, true] defines.GC_FLAGS = ''' ((MKCONSISTENT) ? LFS3_GC_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_GC_LOOKAHEAD : 0) + | ((REBUILDGBMAP) ? LFS3_IFDEF_GBMAP(LFS3_GC_REBUILDGBMAP, -1) : 0) | ((COMPACT) ? LFS3_GC_COMPACT : 0) | ((CKMETA) ? LFS3_GC_CKMETA : 0) | ((CKDATA) ? LFS3_GC_CKDATA : 0) @@ -2356,12 +2699,18 @@ defines.SIZE = [ '2*BLOCK_SIZE', '4*BLOCK_SIZE', ] -if = '(SIZE*N)/BLOCK_SIZE <= 32' +if = [ + '(SIZE*N)/BLOCK_SIZE <= 32', + 'GBMAP || !REBUILDGBMAP', +] ifdef = 'LFS3_GC' code = ''' // test creating files lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // create this many files @@ -2430,6 +2779,7 @@ code = ''' [cases.test_gc_spam_file_fuzz] defines.MKCONSISTENT = [false, true] defines.LOOKAHEAD = [false, true] +defines.REBUILDGBMAP = [false, true] defines.COMPACT = [false, true] defines.CKMETA = [false, true] defines.CKDATA = [false, true] @@ -2437,6 +2787,7 @@ defines.UNCK = [false, true] defines.GC_FLAGS = ''' ((MKCONSISTENT) ? LFS3_GC_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_GC_LOOKAHEAD : 0) + | ((REBUILDGBMAP) ? LFS3_IFDEF_GBMAP(LFS3_GC_REBUILDGBMAP, -1) : 0) | ((COMPACT) ? LFS3_GC_COMPACT : 0) | ((CKMETA) ? LFS3_GC_CKMETA : 0) | ((CKDATA) ? LFS3_GC_CKDATA : 0) @@ -2457,12 +2808,18 @@ defines.SIZE = [ ] defines.SEED = 42 fuzz = 'SEED' -if = '(SIZE*N)/BLOCK_SIZE <= 16' +if = [ + '(SIZE*N)/BLOCK_SIZE <= 16', + 'GBMAP || !REBUILDGBMAP', +] ifdef = 'LFS3_GC' code = ''' // test fuzz with files lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // set up a simulation to compare against @@ -2667,6 +3024,7 @@ code = ''' [cases.test_gc_spam_fwrite_fuzz] defines.MKCONSISTENT = [false, true] defines.LOOKAHEAD = [false, true] +defines.REBUILDGBMAP = [false, true] defines.COMPACT = [false, true] defines.CKMETA = [false, true] defines.CKDATA = [false, true] @@ -2674,6 +3032,7 @@ defines.UNCK = [false, true] defines.GC_FLAGS = ''' ((MKCONSISTENT) ? LFS3_GC_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_GC_LOOKAHEAD : 0) + | ((REBUILDGBMAP) ? LFS3_IFDEF_GBMAP(LFS3_GC_REBUILDGBMAP, -1) : 0) | ((COMPACT) ? LFS3_GC_COMPACT : 0) | ((CKMETA) ? LFS3_GC_CKMETA : 0) | ((CKDATA) ? LFS3_GC_CKDATA : 0) @@ -2703,12 +3062,16 @@ if = [ 'CHUNK <= SIZE', # this just saves testing time 'SIZE <= 4*1024*FRAGMENT_SIZE', + 'GBMAP || !REBUILDGBMAP', ] ifdef = 'LFS3_GC' code = ''' // test with complex file writes lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // create a file @@ -2824,6 +3187,7 @@ code = ''' [cases.test_gc_spam_uz_fuzz] defines.MKCONSISTENT = [false, true] defines.LOOKAHEAD = [false, true] +defines.REBUILDGBMAP = [false, true] defines.COMPACT = [false, true] defines.CKMETA = [false, true] defines.CKDATA = [false, true] @@ -2831,6 +3195,7 @@ defines.UNCK = [false, true] defines.GC_FLAGS = ''' ((MKCONSISTENT) ? LFS3_GC_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_GC_LOOKAHEAD : 0) + | ((REBUILDGBMAP) ? LFS3_IFDEF_GBMAP(LFS3_GC_REBUILDGBMAP, -1) : 0) | ((COMPACT) ? LFS3_GC_COMPACT : 0) | ((CKMETA) ? LFS3_GC_CKMETA : 0) | ((CKDATA) ? LFS3_GC_CKDATA : 0) @@ -2851,12 +3216,18 @@ defines.SIZE = [ ] defines.SEED = 42 fuzz = 'SEED' -if = '(SIZE*N)/BLOCK_SIZE <= 16' +if = [ + '(SIZE*N)/BLOCK_SIZE <= 16', + 'GBMAP || !REBUILDGBMAP', +] ifdef = 'LFS3_GC' code = ''' // test with uncreats, zombies, etc lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // set up a simulation to compare against @@ -3268,6 +3639,7 @@ code = ''' [cases.test_gc_spam_uzd_fuzz] defines.MKCONSISTENT = [false, true] defines.LOOKAHEAD = [false, true] +defines.REBUILDGBMAP = [false, true] defines.COMPACT = [false, true] defines.CKMETA = [false, true] defines.CKDATA = [false, true] @@ -3275,6 +3647,7 @@ defines.UNCK = [false, true] defines.GC_FLAGS = ''' ((MKCONSISTENT) ? LFS3_GC_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_GC_LOOKAHEAD : 0) + | ((REBUILDGBMAP) ? LFS3_IFDEF_GBMAP(LFS3_GC_REBUILDGBMAP, -1) : 0) | ((COMPACT) ? LFS3_GC_COMPACT : 0) | ((CKMETA) ? LFS3_GC_CKMETA : 0) | ((CKDATA) ? LFS3_GC_CKDATA : 0) @@ -3295,12 +3668,18 @@ defines.SIZE = [ ] defines.SEED = 42 fuzz = 'SEED' -if = '(SIZE*N)/BLOCK_SIZE <= 16' +if = [ + '(SIZE*N)/BLOCK_SIZE <= 16', + 'GBMAP || !REBUILDGBMAP', +] ifdef = 'LFS3_GC' code = ''' // test with uncreats, zombies, dirs, etc lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // set up a simulation to compare against diff --git a/tests/test_mount.toml b/tests/test_mount.toml index 98cfaa13..698ca9c1 100644 --- a/tests/test_mount.toml +++ b/tests/test_mount.toml @@ -25,6 +25,7 @@ defines.CKMETAPARITY = [false, true] defines.CKDATACKSUMS = [false, true] defines.MKCONSISTENT = [false, true] defines.LOOKAHEAD = [false, true] +defines.REBUILDGBMAP = [false, true] defines.COMPACT = [false, true] defines.CKMETA = [false, true] defines.CKDATA = [false, true] @@ -38,6 +39,8 @@ if = [ 'LFS3_IFDEF_CKDATACKSUMS(true, !CKDATACKSUMS)', '!RDONLY || !MKCONSISTENT', '!RDONLY || !LOOKAHEAD', + 'LFS3_IFDEF_YES_GBMAP(true, !REBUILDGBMAP)', + '!RDONLY || !REBUILDGBMAP', '!RDONLY || !COMPACT', ] code = ''' @@ -59,6 +62,9 @@ code = ''' : 0) | ((MKCONSISTENT) ? LFS3_M_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_M_LOOKAHEAD : 0) + | ((REBUILDGBMAP) + ? LFS3_IFDEF_GBMAP(LFS3_M_REBUILDGBMAP, -1) + : 0) | ((COMPACT) ? LFS3_M_COMPACT : 0) | ((CKMETA) ? LFS3_M_CKMETA : 0) | ((CKDATA) ? LFS3_M_CKDATA : 0), @@ -192,6 +198,77 @@ code = ''' lfs3_unmount(&lfs3) => 0; ''' +[cases.test_mount_t_rebuildgbmap] +ifdef = 'LFS3_GBMAP' +defines.CKMETA = [false, true] +defines.CKDATA = [false, true] +defines.SIZE = [ + 'BLOCK_SIZE/2', + 'BLOCK_SIZE', + '2*BLOCK_SIZE', + '8*BLOCK_SIZE', +] +code = ''' + lfs3_t lfs3; + lfs3_format(&lfs3, LFS3_F_RDWR | LFS3_F_GBMAP, CFG) => 0; + + uint32_t prng = 42; + + // gbmap is persistant, so by default we _don't_ need a gbmap scan + lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; + struct lfs3_fsinfo fsinfo; + lfs3_fs_stat(&lfs3, &fsinfo) => 0; + assert(fsinfo.flags == ( + LFS3_I_MKCONSISTENT + | LFS3_I_LOOKAHEAD + | LFS3_I_COMPACT + | LFS3_I_CKMETA + | LFS3_I_CKDATA + | LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, 0))); + // write to a file + lfs3_file_t file; + lfs3_file_open(&lfs3, &file, "jellyfish", + LFS3_O_WRONLY | LFS3_O_CREAT | LFS3_O_EXCL) => 0; + uint8_t wbuf[SIZE]; + for (lfs3_size_t j = 0; j < SIZE; j++) { + wbuf[j] = 'a' + (TEST_PRNG(&prng) % 26); + } + lfs3_file_write(&lfs3, &file, wbuf, SIZE) => SIZE; + lfs3_file_close(&lfs3, &file) => 0; + lfs3_unmount(&lfs3) => 0; + + // but if we allocated any blocks our gbmap will be inexhaustive + lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; + lfs3_fs_stat(&lfs3, &fsinfo) => 0; + assert(fsinfo.flags == ( + LFS3_I_MKCONSISTENT + | LFS3_I_LOOKAHEAD + | LFS3_I_REBUILDGBMAP + | LFS3_I_COMPACT + | LFS3_I_CKMETA + | LFS3_I_CKDATA + | LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, 0))); + lfs3_unmount(&lfs3) => 0; + + // with LFS3_M_REBUILDGBMAP, mount performs a gbmap rebuild + lfs3_mount(&lfs3, + LFS3_M_RDWR + | LFS3_M_LOOKAHEAD + | LFS3_M_REBUILDGBMAP + | ((CKMETA) ? LFS3_M_CKMETA : 0) + | ((CKDATA) ? LFS3_M_CKDATA : 0), + CFG) => 0; + lfs3_fs_stat(&lfs3, &fsinfo) => 0; + assert(fsinfo.flags == ( + LFS3_I_MKCONSISTENT + | LFS3_I_COMPACT + // note ckdata implies ckmeta + | ((!CKMETA && !CKDATA) ? LFS3_I_CKMETA : 0) + | ((!CKDATA) ? LFS3_I_CKDATA : 0) + | LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, 0))); + lfs3_unmount(&lfs3) => 0; +''' + [cases.test_mount_t_compact] defines.LOOKAHEAD = [false, true] defines.CKMETA = [false, true] @@ -241,6 +318,9 @@ code = ''' assert(fsinfo.flags == ( LFS3_I_MKCONSISTENT | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_YES_GBMAP( + (SIZE >= BLOCK_SIZE/4) ? LFS3_I_REBUILDGBMAP : 0, + 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -259,6 +339,9 @@ code = ''' assert(fsinfo.flags == ( LFS3_I_MKCONSISTENT | ((!LOOKAHEAD) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_YES_GBMAP( + (SIZE >= BLOCK_SIZE/4) ? LFS3_I_REBUILDGBMAP : 0, + 0) // note ckdata implies ckmeta | ((!CKMETA && !CKDATA) ? LFS3_I_CKMETA : 0) | ((!CKDATA) ? LFS3_I_CKDATA : 0) @@ -345,6 +428,9 @@ code = ''' assert(fsinfo.flags == ( LFS3_I_MKCONSISTENT | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_YES_GBMAP( + (ORPHANS >= 100) ? LFS3_I_REBUILDGBMAP : 0, + 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -363,6 +449,9 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( ((!LOOKAHEAD) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_YES_GBMAP( + (ORPHANS >= 100) ? LFS3_I_REBUILDGBMAP : 0, + 0) | ((!COMPACT) ? LFS3_I_COMPACT : 0) // note ckdata implies ckmeta | ((!CKMETA && !CKDATA) ? LFS3_I_CKMETA : 0) diff --git a/tests/test_trvs.toml b/tests/test_trvs.toml index e9b7ddf5..076b701e 100644 --- a/tests/test_trvs.toml +++ b/tests/test_trvs.toml @@ -7,16 +7,30 @@ after = [ 'test_alloc' ] +# Test both with and without the gbmap if available +defines.GBMAP = [false, true] +if = ''' + LFS3_IFDEF_YES_GBMAP( + GBMAP, + LFS3_IFDEF_GBMAP(true, !GBMAP)) +''' + + # a simple traversal test [cases.test_trvs_simple] defines.MKCONSISTENT = [false, true] defines.LOOKAHEAD = [false, true] +defines.REBUILDGBMAP = [false, true] defines.COMPACT = [false, true] defines.CKMETA = [false, true] defines.CKDATA = [false, true] +if = 'GBMAP || !REBUILDGBMAP' code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // try traversing @@ -25,6 +39,9 @@ code = ''' LFS3_T_RDWR | ((MKCONSISTENT) ? LFS3_T_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_T_LOOKAHEAD : 0) + | ((REBUILDGBMAP) + ? LFS3_IFDEF_GBMAP(LFS3_T_REBUILDGBMAP, -1) + : 0) | ((COMPACT) ? LFS3_T_COMPACT : 0) | ((CKMETA) ? LFS3_T_CKMETA : 0) | ((CKDATA) ? LFS3_T_CKDATA : 0)) => 0; @@ -35,11 +52,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_MDIR); assert(tinfo.block == 0 || tinfo.block == 1); - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -55,7 +72,10 @@ defines.CKMETA = [false, true] defines.CKDATA = [false, true] code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // try traversing @@ -64,6 +84,9 @@ code = ''' LFS3_T_RDWR | ((MKCONSISTENT) ? LFS3_T_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_T_LOOKAHEAD : 0) + | ((REBUILDGBMAP) + ? LFS3_IFDEF_GBMAP(LFS3_T_REBUILDGBMAP, -1) + : 0) | ((COMPACT) ? LFS3_T_COMPACT : 0) | ((CKMETA) ? LFS3_T_CKMETA : 0) | ((CKDATA) ? LFS3_T_CKDATA : 0)) => 0; @@ -74,11 +97,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_MDIR); assert(tinfo.block == 0 || tinfo.block == 1); - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_rewind(&lfs3, &trv) => 0; @@ -88,11 +111,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_MDIR); assert(tinfo.block == 0 || tinfo.block == 1); - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -103,12 +126,17 @@ code = ''' [cases.test_trvs_idempotent] defines.MKCONSISTENT = [false, true] defines.LOOKAHEAD = [false, true] +defines.REBUILDGBMAP = [false, true] defines.COMPACT = [false, true] defines.CKMETA = [false, true] defines.CKDATA = [false, true] +if = 'GBMAP || !REBUILDGBMAP' code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // try traversing @@ -117,6 +145,9 @@ code = ''' LFS3_T_RDWR | ((MKCONSISTENT) ? LFS3_T_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_T_LOOKAHEAD : 0) + | ((REBUILDGBMAP) + ? LFS3_IFDEF_GBMAP(LFS3_T_REBUILDGBMAP, -1) + : 0) | ((COMPACT) ? LFS3_T_COMPACT : 0) | ((CKMETA) ? LFS3_T_CKMETA : 0) | ((CKDATA) ? LFS3_T_CKDATA : 0)) => 0; @@ -127,11 +158,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_MDIR); assert(tinfo.block == 0 || tinfo.block == 1); - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; @@ -155,7 +186,10 @@ defines.CKMETA = [false, true] defines.CKDATA = [false, true] code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // create this many directories @@ -266,7 +300,10 @@ defines.CKDATA = [false, true] if = '(SIZE*N)/BLOCK_SIZE <= 32' code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // create this many files @@ -382,7 +419,10 @@ defines.CKDATA = [false, true] if = '(SIZE*N)/BLOCK_SIZE <= 32' code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // create this many files @@ -509,7 +549,10 @@ defines.CKMETA = [false, true] defines.CKDATA = [false, true] code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // create this many directories @@ -629,7 +672,10 @@ defines.CKDATA = [false, true] if = '(SIZE*N)/BLOCK_SIZE <= 32' code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // create this many files @@ -754,7 +800,10 @@ defines.CKDATA = [false, true] if = '(SIZE*N)/BLOCK_SIZE <= 32' code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // create this many files @@ -892,7 +941,10 @@ code = ''' assert(i < 2*BLOCK_COUNT); lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // create this many directories @@ -977,7 +1029,10 @@ code = ''' assert(i < 2*BLOCK_COUNT); lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // create this many files @@ -1073,7 +1128,10 @@ code = ''' assert(i < 2*BLOCK_COUNT); lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // create this many files @@ -1166,7 +1224,10 @@ code = ''' assert(i < 2*BLOCK_COUNT); lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // create this many directories @@ -1249,7 +1310,10 @@ code = ''' assert(i < 2*BLOCK_COUNT); lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // create this many files @@ -1343,7 +1407,10 @@ code = ''' assert(i < 2*BLOCK_COUNT); lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // create this many files @@ -1434,7 +1501,10 @@ code = ''' assert(i < 2*BLOCK_COUNT); lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // create this many directories @@ -1517,7 +1587,10 @@ code = ''' assert(i < 2*BLOCK_COUNT); lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // create this many files @@ -1611,7 +1684,10 @@ code = ''' assert(i < 2*BLOCK_COUNT); lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // create this many files @@ -1697,12 +1773,17 @@ done:; [cases.test_trvs_flags] defines.MKCONSISTENT = [false, true] defines.LOOKAHEAD = [false, true] +defines.REBUILDGBMAP = [false, true] defines.COMPACT = [false, true] defines.CKMETA = [false, true] defines.CKDATA = [false, true] +if = 'GBMAP || !REBUILDGBMAP' code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // check flags before @@ -1714,7 +1795,7 @@ code = ''' | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // try traversing lfs3_trv_t trv; @@ -1722,6 +1803,9 @@ code = ''' LFS3_T_RDWR | ((MKCONSISTENT) ? LFS3_T_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_T_LOOKAHEAD : 0) + | ((REBUILDGBMAP) + ? LFS3_IFDEF_GBMAP(LFS3_T_REBUILDGBMAP, -1) + : 0) | ((COMPACT) ? LFS3_T_COMPACT : 0) | ((CKMETA) ? LFS3_T_CKMETA : 0) | ((CKDATA) ? LFS3_T_CKDATA : 0)) => 0; @@ -1732,11 +1816,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_MDIR); assert(tinfo.block == 0 || tinfo.block == 1); - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -1749,7 +1833,7 @@ code = ''' // note ckdata implies ckmeta | ((!CKMETA && !CKDATA) ? LFS3_I_CKMETA : 0) | ((!CKDATA) ? LFS3_I_CKDATA : 0) - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); lfs3_unmount(&lfs3) => 0; ''' @@ -1762,7 +1846,10 @@ defines.CKMETA = [false, true] defines.CKDATA = [false, true] code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // try traversing @@ -1803,11 +1890,11 @@ code = ''' lfs3_file_close(&lfs3, &file) => 0; } - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -1819,7 +1906,7 @@ code = ''' | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); lfs3_unmount(&lfs3) => 0; ''' @@ -1831,7 +1918,10 @@ defines.CKMETA = [false, true] defines.CKDATA = [false, true] code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // try traversing @@ -1855,11 +1945,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_MDIR); assert(tinfo.block == 0 || tinfo.block == 1); - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; @@ -1877,7 +1967,7 @@ code = ''' | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // try another mutation just for good measure lfs3_file_open(&lfs3, &file, "tarantula", @@ -1898,7 +1988,7 @@ code = ''' | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); lfs3_trv_close(&lfs3, &trv) => 0; @@ -1912,7 +2002,10 @@ defines.CKMETA = [false, true] defines.CKDATA = [false, true] code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // try traversing @@ -1944,11 +2037,11 @@ code = ''' lfs3_mkdir(&lfs3, "spider") => 0; } - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -1960,7 +2053,7 @@ code = ''' | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); lfs3_unmount(&lfs3) => 0; ''' @@ -1972,7 +2065,10 @@ defines.CKMETA = [false, true] defines.CKDATA = [false, true] code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // make a file @@ -2010,11 +2106,11 @@ code = ''' lfs3_remove(&lfs3, "spider") => 0; } - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -2026,7 +2122,7 @@ code = ''' | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); lfs3_unmount(&lfs3) => 0; ''' @@ -2038,7 +2134,10 @@ defines.CKMETA = [false, true] defines.CKDATA = [false, true] code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // make a file @@ -2071,11 +2170,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_MDIR); assert(tinfo.block == 0 || tinfo.block == 1); - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } if (WHEN == 2) { lfs3_rename(&lfs3, "spider", "scorpion") => 0; @@ -2092,7 +2191,7 @@ code = ''' | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); lfs3_unmount(&lfs3) => 0; ''' @@ -2112,7 +2211,10 @@ defines.SIZE = [ ] code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -2162,10 +2264,13 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( LFS3_I_LOOKAHEAD + | ((GBMAP && SIZE >= BLOCK_SIZE/4) + ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) + : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // check the file contents lfs3_file_open(&lfs3, &file, "spider", LFS3_O_RDONLY) => 0; @@ -2192,7 +2297,10 @@ defines.SIZE = [ defines.SYNC = [false, true] code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -2245,11 +2353,16 @@ code = ''' struct lfs3_fsinfo fsinfo; lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( - LFS3_I_LOOKAHEAD + // ok we might've updated lookahead if write stayed in cache + ((!LOOKAHEAD || SIZE > FILE_CACHE_SIZE || SYNC) + ? LFS3_I_LOOKAHEAD : 0) + | ((GBMAP && SIZE >= BLOCK_SIZE/4) + ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) + : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // check the file contents lfs3_file_rewind(&lfs3, &file) => 0; @@ -2280,7 +2393,10 @@ defines.SIZE = 'FILE_CACHE_SIZE/2' defines.TRUNC = [false, true] code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -2333,11 +2449,11 @@ code = ''' lfs3_file_close(&lfs3, &file) => 0; // we should be at end of traversal now - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -2349,7 +2465,7 @@ code = ''' | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // check the file contents lfs3_file_open(&lfs3, &file, "spider", LFS3_O_RDONLY) => 0; @@ -2375,7 +2491,10 @@ defines.INLINE_SIZE = 0 defines.TRUNC = [false, true] code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -2442,11 +2561,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_DATA); // we should be at end of traversal now - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -2455,10 +2574,11 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( LFS3_I_LOOKAHEAD + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // check the file contents lfs3_file_open(&lfs3, &file, "spider", LFS3_O_RDONLY) => 0; @@ -2483,7 +2603,10 @@ defines.SIZE = '2*BLOCK_SIZE' defines.TRUNC = [false, true] code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -2544,11 +2667,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_DATA); // we should be at end of traversal now - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -2557,10 +2680,11 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( LFS3_I_LOOKAHEAD + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // check the file contents lfs3_file_open(&lfs3, &file, "spider", LFS3_O_RDONLY) => 0; @@ -2584,7 +2708,10 @@ defines.CKDATA = [false, true] defines.SIZE = 'FILE_CACHE_SIZE/2' code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -2636,11 +2763,11 @@ code = ''' lfs3_file_flush(&lfs3, &file1) => 0; // we should be at end of traversal now - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -2652,7 +2779,7 @@ code = ''' | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); lfs3_file_close(&lfs3, &file1) => 0; lfs3_file_close(&lfs3, &file2) => 0; @@ -2681,7 +2808,10 @@ defines.SIZE = '2*BLOCK_SIZE' defines.INLINE_SIZE = 0 code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -2747,11 +2877,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_DATA); // we should be at end of traversal now - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -2760,10 +2890,11 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( LFS3_I_LOOKAHEAD + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); lfs3_file_close(&lfs3, &file1) => 0; lfs3_file_close(&lfs3, &file2) => 0; @@ -2791,7 +2922,10 @@ defines.CKDATA = [false, true] defines.SIZE = '2*BLOCK_SIZE' code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -2851,11 +2985,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_DATA); // we should be at end of traversal now - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -2864,10 +2998,11 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( LFS3_I_LOOKAHEAD + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); lfs3_file_close(&lfs3, &file1) => 0; lfs3_file_close(&lfs3, &file2) => 0; @@ -2896,7 +3031,10 @@ defines.SIZE = 'FILE_CACHE_SIZE/2' defines.DESYNC = [false, true] code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -2946,11 +3084,11 @@ code = ''' lfs3_file_close(&lfs3, &file1) => 0; // we should be at end of traversal now - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -2966,7 +3104,7 @@ code = ''' ? LFS3_I_CKMETA : 0) | ((!(CKDATA && DESYNC)) ? LFS3_I_CKDATA : 0) - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); lfs3_file_close(&lfs3, &file2) => 0; @@ -3000,7 +3138,10 @@ defines.INLINE_SIZE = 0 defines.DESYNC = [false, true] code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -3064,11 +3205,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_DATA); // we should be at end of traversal now - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -3078,13 +3219,14 @@ code = ''' assert(fsinfo.flags == ( ((DESYNC) ? LFS3_I_MKCONSISTENT : 0) | ((!(LOOKAHEAD && DESYNC)) ? LFS3_I_LOOKAHEAD : 0) + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT // note ckdata implies ckmeta | ((!(CKMETA && DESYNC) && !(CKDATA && DESYNC)) ? LFS3_I_CKMETA : 0) | ((!(CKDATA && DESYNC)) ? LFS3_I_CKDATA : 0) - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); lfs3_file_close(&lfs3, &file2) => 0; @@ -3117,7 +3259,10 @@ defines.SIZE = '2*BLOCK_SIZE' defines.DESYNC = [false, true] code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -3175,11 +3320,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_DATA); // we should be at end of traversal now - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -3189,13 +3334,14 @@ code = ''' assert(fsinfo.flags == ( ((DESYNC) ? LFS3_I_MKCONSISTENT : 0) | ((!(LOOKAHEAD && DESYNC)) ? LFS3_I_LOOKAHEAD : 0) + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT // note ckdata implies ckmeta | ((!(CKMETA && DESYNC) && !(CKDATA && DESYNC)) ? LFS3_I_CKMETA : 0) | ((!(CKDATA && DESYNC)) ? LFS3_I_CKDATA : 0) - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); lfs3_file_close(&lfs3, &file2) => 0; @@ -3227,7 +3373,10 @@ defines.CKDATA = [false, true] defines.SIZE = '2*BLOCK_SIZE' code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -3281,11 +3430,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_DATA); // we should be at end of traversal now - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -3295,13 +3444,14 @@ code = ''' assert(fsinfo.flags == ( ((DESYNC) ? LFS3_I_MKCONSISTENT : 0) | ((!(LOOKAHEAD && DESYNC)) ? LFS3_I_LOOKAHEAD : 0) + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT // note ckdata implies ckmeta | ((!(CKMETA && DESYNC) && !(CKDATA && DESYNC)) ? LFS3_I_CKMETA : 0) | ((!(CKDATA && DESYNC)) ? LFS3_I_CKDATA : 0) - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // check the file contents lfs3_file_open(&lfs3, &file, "spider", LFS3_O_RDONLY) => LFS3_ERR_NOENT; @@ -3322,7 +3472,10 @@ defines.CKDATA = [false, true] defines.SIZE = '2*BLOCK_SIZE' code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -3390,11 +3543,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_DATA); // we should be at end of traversal now - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -3403,10 +3556,11 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( LFS3_I_LOOKAHEAD + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // check the file contents lfs3_file_open(&lfs3, &file, "spider", LFS3_O_RDONLY) => LFS3_ERR_NOENT; @@ -3432,7 +3586,10 @@ defines.CKDATA = [false, true] defines.SIZE = '2*BLOCK_SIZE' code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -3495,11 +3652,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_DATA); // we should be at end of traversal now - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -3508,10 +3665,11 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( LFS3_I_LOOKAHEAD + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // check the file contents lfs3_file_open(&lfs3, &file, "spider", LFS3_O_RDONLY) => 0; @@ -3537,7 +3695,10 @@ defines.CKDATA = [false, true] defines.SIZE = '2*BLOCK_SIZE' code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -3608,11 +3769,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_DATA); // we should be at end of traversal now - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -3621,10 +3782,11 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( LFS3_I_LOOKAHEAD + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // check the file contents lfs3_file_open(&lfs3, &file, "spider", LFS3_O_RDONLY) => 0; @@ -3648,7 +3810,10 @@ defines.CKDATA = [false, true] defines.SIZE = '2*BLOCK_SIZE' code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -3732,11 +3897,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_DATA); // we should be at end of traversal now - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -3745,10 +3910,11 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( LFS3_I_LOOKAHEAD + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // check the file contents lfs3_file_open(&lfs3, &file, "spider", LFS3_O_RDONLY) => 0; @@ -3777,7 +3943,10 @@ defines.CKDATA = [false, true] defines.SIZE = '2*BLOCK_SIZE' code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -3856,11 +4025,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_DATA); // we should be at end of traversal now - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -3869,10 +4038,11 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( LFS3_I_LOOKAHEAD + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // check the file contents lfs3_file_open(&lfs3, &file, "spider", LFS3_O_RDONLY) => 0; @@ -3903,7 +4073,10 @@ defines.SIZE = '2*BLOCK_SIZE' defines.BLOCK_RECYCLES = 0 code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -3967,11 +4140,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_DATA); // we should be at end of traversal now - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -3980,10 +4153,11 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( LFS3_I_LOOKAHEAD + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // check the file contents lfs3_file_open(&lfs3, &file, "spider", LFS3_O_RDONLY) => 0; @@ -4009,7 +4183,10 @@ defines.SIZE = '2*BLOCK_SIZE' defines.BLOCK_RECYCLES = 0 code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -4072,11 +4249,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_DATA); // we should be at end of traversal now - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -4085,10 +4262,11 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( LFS3_I_LOOKAHEAD + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // check the file contents lfs3_file_open(&lfs3, &file, "spider", LFS3_O_RDONLY) => 0; @@ -4114,7 +4292,10 @@ defines.SIZE = '2*BLOCK_SIZE' defines.BLOCK_RECYCLES = 0 code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -4192,11 +4373,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_DATA); // we should be at end of traversal now - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -4205,10 +4386,11 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( LFS3_I_LOOKAHEAD + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // check the file contents lfs3_file_open(&lfs3, &file, "spider", LFS3_O_RDONLY) => 0; @@ -4234,7 +4416,10 @@ defines.SIZE = '2*BLOCK_SIZE' defines.BLOCK_RECYCLES = 0 code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -4311,11 +4496,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_DATA); // we should be at end of traversal now - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -4324,10 +4509,11 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( LFS3_I_LOOKAHEAD + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // check the file contents lfs3_file_open(&lfs3, &file, "spider", LFS3_O_RDONLY) => 0; @@ -4351,7 +4537,10 @@ defines.CKDATA = [false, true] defines.SIZE = '2*BLOCK_SIZE' code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -4483,11 +4672,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_DATA); // we should be at end of traversal now - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -4496,10 +4685,11 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( LFS3_I_LOOKAHEAD + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // check the file contents lfs3_file_open(&lfs3, &file, "spider", LFS3_O_RDONLY) => 0; @@ -4533,7 +4723,10 @@ defines.CKDATA = [false, true] defines.SIZE = '2*BLOCK_SIZE' code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -4672,11 +4865,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_DATA); // we should be at end of traversal now - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -4685,10 +4878,11 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( LFS3_I_LOOKAHEAD + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // check the file contents lfs3_file_open(&lfs3, &file, "spider", LFS3_O_RDONLY) => 0; @@ -4722,7 +4916,10 @@ defines.CKDATA = [false, true] defines.SIZE = '2*BLOCK_SIZE' code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -4855,11 +5052,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_DATA); // we should be at end of traversal now - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -4868,10 +5065,11 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( LFS3_I_LOOKAHEAD + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // check the file contents lfs3_file_open(&lfs3, &file, "spider", LFS3_O_RDONLY) => 0; @@ -4905,7 +5103,10 @@ defines.CKDATA = [false, true] defines.SIZE = '2*BLOCK_SIZE' code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -5035,11 +5236,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_DATA); // we should be at end of traversal now - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -5048,10 +5249,11 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( LFS3_I_LOOKAHEAD + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // check the file contents lfs3_file_open(&lfs3, &file, "spider", LFS3_O_RDONLY) => 0; @@ -5085,7 +5287,10 @@ defines.CKDATA = [false, true] defines.SIZE = '2*BLOCK_SIZE' code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -5222,11 +5427,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_DATA); // we should be at end of traversal now - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -5235,10 +5440,11 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( LFS3_I_LOOKAHEAD + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // check the file contents lfs3_file_open(&lfs3, &file, "spider", LFS3_O_RDONLY) => 0; @@ -5274,7 +5480,10 @@ defines.SIZE = '2*BLOCK_SIZE' defines.BLOCK_RECYCLES = 0 code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -5408,11 +5617,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_DATA); // we should be at end of traversal now - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -5421,10 +5630,11 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( LFS3_I_LOOKAHEAD + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // check the file contents lfs3_file_open(&lfs3, &file, "spider", LFS3_O_RDONLY) => 0; @@ -5460,7 +5670,10 @@ defines.SIZE = '2*BLOCK_SIZE' defines.BLOCK_RECYCLES = 0 code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -5605,11 +5818,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_DATA); // we should be at end of traversal now - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -5618,10 +5831,11 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( LFS3_I_LOOKAHEAD + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // check the file contents lfs3_file_open(&lfs3, &file, "spider", LFS3_O_RDONLY) => 0; @@ -5660,7 +5874,10 @@ defines.SIZE = 'FILE_CACHE_SIZE/2' defines.GC_COMPACT_THRESH = 'BLOCK_SIZE/2' code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -5689,7 +5906,7 @@ code = ''' | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // try traversing and compacting lfs3_trv_t trv; @@ -5707,11 +5924,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_MDIR); assert(tinfo.block == 0 || tinfo.block == 1); - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; // mdir should have been compacted @@ -5724,7 +5941,7 @@ code = ''' | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // running another traversal should clear the uncompacted flag lfs3_trv_rewind(&lfs3, &trv) => 0; @@ -5747,7 +5964,7 @@ code = ''' // note ckdata implies ckmeta | ((!CKMETA && !CKDATA) ? LFS3_I_CKMETA : 0) | ((!CKDATA) ? LFS3_I_CKDATA : 0) - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // check we can still read the file for (int remount = 0; remount < 2; remount++) { @@ -5781,7 +5998,10 @@ defines.BLOCK_RECYCLES = 0 in = 'lfs3.c' code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -5825,10 +6045,11 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( LFS3_I_LOOKAHEAD + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // try traversing and compacting lfs3_trv_t trv; @@ -5851,11 +6072,11 @@ code = ''' assert(tinfo.btype == LFS3_BTYPE_MDIR); lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_MDIR); - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; // mrootanchor should have been compacted @@ -5868,10 +6089,11 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( LFS3_I_LOOKAHEAD + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // running another traversal should clear the uncompacted flag lfs3_trv_rewind(&lfs3, &trv) => 0; @@ -5893,10 +6115,11 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( ((!LOOKAHEAD) ? LFS3_I_LOOKAHEAD : 0) + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) // note ckdata implies ckmeta | ((!CKMETA && !CKDATA) ? LFS3_I_CKMETA : 0) | ((!CKDATA) ? LFS3_I_CKDATA : 0) - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // check we can still read the file for (int remount = 0; remount < 2; remount++) { @@ -5930,7 +6153,10 @@ defines.BLOCK_RECYCLES = 0 in = 'lfs3.c' code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -5959,7 +6185,7 @@ code = ''' | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // try traversing and compacting lfs3_trv_t trv; @@ -5979,11 +6205,11 @@ code = ''' assert(tinfo.btype == LFS3_BTYPE_MDIR); lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_MDIR); - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; // mdir should have been compacted @@ -5993,10 +6219,11 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( LFS3_I_LOOKAHEAD + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // running another traversal should clear the uncompacted flag lfs3_trv_rewind(&lfs3, &trv) => 0; @@ -6016,10 +6243,11 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( ((!LOOKAHEAD) ? LFS3_I_LOOKAHEAD : 0) + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) // note ckdata implies ckmeta | ((!CKMETA && !CKDATA) ? LFS3_I_CKMETA : 0) | ((!CKDATA) ? LFS3_I_CKDATA : 0) - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // check we can still read the file for (int remount = 0; remount < 2; remount++) { @@ -6051,7 +6279,10 @@ defines.GC_COMPACT_THRESH = 'BLOCK_SIZE/2' in = 'lfs3.c' code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -6109,7 +6340,7 @@ code = ''' | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // try traversing and compacting lfs3_trv_t trv; @@ -6140,11 +6371,11 @@ code = ''' assert(tinfo.btype == LFS3_BTYPE_MDIR); lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_MDIR); - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; // mdirs should have been compacted @@ -6155,10 +6386,11 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( LFS3_I_LOOKAHEAD + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // running another traversal should clear the uncompacted flag lfs3_trv_rewind(&lfs3, &trv) => 0; @@ -6179,10 +6411,11 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( ((!LOOKAHEAD) ? LFS3_I_LOOKAHEAD : 0) + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) // note ckdata implies ckmeta | ((!CKMETA && !CKDATA) ? LFS3_I_CKMETA : 0) | ((!CKDATA) ? LFS3_I_CKDATA : 0) - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // check we can still read the files for (int remount = 0; remount < 2; remount++) { @@ -6221,7 +6454,10 @@ defines.GC_COMPACT_THRESH = 'BLOCK_SIZE/2' defines.COMPACTSET = 'range(0x8)' code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -6323,10 +6559,11 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( LFS3_I_LOOKAHEAD + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // try traversing and compacting lfs3_trv_t trv; @@ -6362,11 +6599,11 @@ code = ''' assert(tinfo.btype == LFS3_BTYPE_MDIR); lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_MDIR); - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; if (COMPACTSET) { @@ -6379,10 +6616,11 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( LFS3_I_LOOKAHEAD + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // running another traversal should clear the uncompacted flag lfs3_trv_rewind(&lfs3, &trv) => 0; @@ -6405,10 +6643,11 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( ((!LOOKAHEAD) ? LFS3_I_LOOKAHEAD : 0) + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) // note ckdata implies ckmeta | ((!CKMETA && !CKDATA) ? LFS3_I_CKMETA : 0) | ((!CKDATA) ? LFS3_I_CKDATA : 0) - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // check we can still read the files for (int remount = 0; remount < 2; remount++) { @@ -6454,7 +6693,10 @@ defines.GC_COMPACT_THRESH = 'BLOCK_SIZE/2' in = 'lfs3.c' code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -6554,10 +6796,11 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( LFS3_I_LOOKAHEAD + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // try traversing and compacting lfs3_trv_t trv; @@ -6598,11 +6841,11 @@ code = ''' assert(tinfo.btype == LFS3_BTYPE_MDIR); lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_MDIR); - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; // mdirs should have been compacted @@ -6615,10 +6858,11 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( LFS3_I_LOOKAHEAD + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // running another traversal should clear the uncompacted flag lfs3_trv_rewind(&lfs3, &trv) => 0; @@ -6641,10 +6885,11 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( ((!LOOKAHEAD) ? LFS3_I_LOOKAHEAD : 0) + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) // note ckdata implies ckmeta | ((!CKMETA && !CKDATA) ? LFS3_I_CKMETA : 0) | ((!CKDATA) ? LFS3_I_CKDATA : 0) - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // check we can still read the files for (int remount = 0; remount < 2; remount++) { @@ -6703,7 +6948,10 @@ defines.SIZE = 'FILE_CACHE_SIZE/2' defines.ORPHANS = [0, 1, 2, 3, 100] code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -6756,10 +7004,13 @@ code = ''' assert(fsinfo.flags == ( ((ORPHANS > 0) ? LFS3_I_MKCONSISTENT : 0) | LFS3_I_LOOKAHEAD + | ((GBMAP && ORPHANS >= 100) + ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) + : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // try traversing with mkconsistent lfs3_trv_t trv; @@ -6791,11 +7042,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_MDIR); } - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -6813,11 +7064,14 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( ((!LOOKAHEAD || ORPHANS > 0) ? LFS3_I_LOOKAHEAD : 0) + | ((GBMAP && ORPHANS >= 100) + ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) + : 0) | LFS3_I_COMPACT // note ckdata implies ckmeta | (((!CKMETA && !CKDATA) || ORPHANS > 0) ? LFS3_I_CKMETA : 0) | ((!CKDATA || ORPHANS > 0) ? LFS3_I_CKDATA : 0) - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // check we can still read the files for (int remount = 0; remount < 2; remount++) { @@ -6856,7 +7110,10 @@ defines.SIZE = 'FILE_CACHE_SIZE/2' defines.ORPHANS = [0, 1, 2, 3, 100] code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -6890,7 +7147,7 @@ code = ''' | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // try traversing with mkconsistent lfs3_trv_t trv; @@ -6944,11 +7201,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_MDIR); } - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -6965,11 +7222,14 @@ code = ''' assert(fsinfo.flags == ( ((ORPHANS >= 3) ? LFS3_I_MKCONSISTENT : 0) | ((!LOOKAHEAD || ORPHANS > 0) ? LFS3_I_LOOKAHEAD : 0) + | ((GBMAP && ORPHANS >= 100) + ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) + : 0) | LFS3_I_COMPACT // note ckdata implies ckmeta | (((!CKMETA && !CKDATA) || ORPHANS > 0) ? LFS3_I_CKMETA : 0) | ((!CKDATA || ORPHANS > 0) ? LFS3_I_CKDATA : 0) - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // check we can still read the files for (int remount = 0; remount < 2; remount++) { @@ -7012,7 +7272,10 @@ defines.SIZE = '2*FRAGMENT_SIZE' defines.ORPHANS = [0, 1, 2, 3, 100] code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -7065,10 +7328,11 @@ code = ''' assert(fsinfo.flags == ( ((ORPHANS > 0) ? LFS3_I_MKCONSISTENT : 0) | LFS3_I_LOOKAHEAD + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // try traversing with mkconsistent lfs3_trv_t trv; @@ -7114,11 +7378,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_BTREE); } - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -7136,11 +7400,12 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( ((!LOOKAHEAD || ORPHANS > 0) ? LFS3_I_LOOKAHEAD : 0) + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT // note ckdata implies ckmeta | (((!CKMETA && !CKDATA) || ORPHANS > 0) ? LFS3_I_CKMETA : 0) | ((!CKDATA || ORPHANS > 0) ? LFS3_I_CKDATA : 0) - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // check we can still read the files for (int remount = 0; remount < 2; remount++) { @@ -7183,7 +7448,10 @@ defines.SIZE = '2*FRAGMENT_SIZE' defines.ORPHANS = [0, 1, 2, 3, 100] code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -7236,10 +7504,11 @@ code = ''' assert(fsinfo.flags == ( ((ORPHANS > 0) ? LFS3_I_MKCONSISTENT : 0) | LFS3_I_LOOKAHEAD + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // try traversing with mkconsistent lfs3_trv_t trv; @@ -7285,11 +7554,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_BTREE); } - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -7307,11 +7576,12 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( ((!LOOKAHEAD || ORPHANS > 0) ? LFS3_I_LOOKAHEAD : 0) + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT // note ckdata implies ckmeta | (((!CKMETA && !CKDATA) || ORPHANS > 0) ? LFS3_I_CKMETA : 0) | ((!CKDATA || ORPHANS > 0) ? LFS3_I_CKDATA : 0) - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // check we can still read the files for (int remount = 0; remount < 2; remount++) { @@ -7355,7 +7625,10 @@ defines.SIZE = 'BLOCK_SIZE' defines.ORPHANS = [0, 1, 2, 3, 100] code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -7408,10 +7681,11 @@ code = ''' assert(fsinfo.flags == ( ((ORPHANS > 0) ? LFS3_I_MKCONSISTENT : 0) | LFS3_I_LOOKAHEAD + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // try traversing with mkconsistent lfs3_trv_t trv; @@ -7465,11 +7739,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_BTREE); } - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -7487,11 +7761,12 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( ((!LOOKAHEAD || ORPHANS > 0) ? LFS3_I_LOOKAHEAD : 0) + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT // note ckdata implies ckmeta | (((!CKMETA && !CKDATA) || ORPHANS > 0) ? LFS3_I_CKMETA : 0) | ((!CKDATA || ORPHANS > 0) ? LFS3_I_CKDATA : 0) - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // check we can still read the files for (int remount = 0; remount < 2; remount++) { @@ -7535,7 +7810,10 @@ defines.SIZE = 'BLOCK_SIZE' defines.ORPHANS = [0, 1, 2, 3, 100] code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -7588,10 +7866,11 @@ code = ''' assert(fsinfo.flags == ( ((ORPHANS > 0) ? LFS3_I_MKCONSISTENT : 0) | LFS3_I_LOOKAHEAD + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // try traversing with mkconsistent lfs3_trv_t trv; @@ -7645,11 +7924,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_BTREE); } - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -7667,11 +7946,12 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( ((!LOOKAHEAD || ORPHANS > 0) ? LFS3_I_LOOKAHEAD : 0) + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) : 0) | LFS3_I_COMPACT // note ckdata implies ckmeta | (((!CKMETA && !CKDATA) || ORPHANS > 0) ? LFS3_I_CKMETA : 0) | ((!CKDATA || ORPHANS > 0) ? LFS3_I_CKDATA : 0) - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // check we can still read the files for (int remount = 0; remount < 2; remount++) { @@ -7712,7 +7992,10 @@ defines.ORPHANS = [0, 1, 2, 3, 100] defines.GC_COMPACT_THRESH = 'BLOCK_SIZE/2' code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -7786,10 +8069,13 @@ code = ''' assert(fsinfo.flags == ( ((ORPHANS > 0) ? LFS3_I_MKCONSISTENT : 0) | LFS3_I_LOOKAHEAD + | ((GBMAP && ORPHANS >= 100) + ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) + : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // try traversing with mkconsistent lfs3_trv_t trv; @@ -7822,11 +8108,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_MDIR); } - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; // we should have cleaned up all grms/orphans @@ -7848,10 +8134,13 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( LFS3_I_LOOKAHEAD + | ((GBMAP && ORPHANS >= 100) + ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) + : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // running another traversal should clear the uncompacted flag lfs3_trv_rewind(&lfs3, &trv) => 0; @@ -7872,10 +8161,13 @@ code = ''' lfs3_fs_stat(&lfs3, &fsinfo) => 0; assert(fsinfo.flags == ( ((!LOOKAHEAD) ? LFS3_I_LOOKAHEAD : 0) + | ((GBMAP && ORPHANS >= 100) + ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) + : 0) // note ckdata implies ckmeta | ((!CKMETA && !CKDATA) ? LFS3_I_CKMETA : 0) | ((!CKDATA) ? LFS3_I_CKDATA : 0) - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // check we can still read the files for (int remount = 0; remount < 2; remount++) { @@ -7916,7 +8208,10 @@ defines.ORPHANS = [0, 1, 2, 3, 100] defines.GC_COMPACT_THRESH = 'BLOCK_SIZE/2' code = ''' lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; uint32_t prng = 42; @@ -7971,7 +8266,7 @@ code = ''' | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // try traversing with mkconsistent lfs3_trv_t trv; @@ -8026,11 +8321,11 @@ code = ''' lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; assert(tinfo.btype == LFS3_BTYPE_MDIR); } - #ifdef LFS3_YES_GBMAP - lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; - assert(tinfo.btype == LFS3_BTYPE_BTREE); - assert(tinfo.block == 2); - #endif + if (GBMAP) { + lfs3_trv_read(&lfs3, &trv, &tinfo) => 0; + assert(tinfo.btype == LFS3_BTYPE_BTREE); + assert(tinfo.block == 2); + } lfs3_trv_read(&lfs3, &trv, &tinfo) => LFS3_ERR_NOENT; lfs3_trv_close(&lfs3, &trv) => 0; @@ -8051,10 +8346,13 @@ code = ''' assert(fsinfo.flags == ( ((ORPHANS >= 3) ? LFS3_I_MKCONSISTENT : 0) | LFS3_I_LOOKAHEAD + | ((GBMAP && ORPHANS >= 100) + ? LFS3_IFDEF_GBMAP(LFS3_I_REBUILDGBMAP, -1) + : 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA - | LFS3_IFDEF_YES_GBMAP(LFS3_I_GBMAP, 0))); + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_I_GBMAP, -1) : 0))); // check we can still read the files for (int remount = 0; remount < 2; remount++) { @@ -8098,16 +8396,21 @@ code = ''' defines.STEPS = [1, 2, 4, 8, 16, 32, 64, 128] defines.MKCONSISTENT = [false, true] defines.LOOKAHEAD = [false, true] +defines.REBUILDGBMAP = [false, true] defines.COMPACT = [false, true] defines.CKMETA = [true] defines.CKDATA = [true] # set compact thresh to minimum defines.GC_COMPACT_THRESH = 'BLOCK_SIZE/2' defines.N = [1, 2, 4, 8, 16, 32, 64, 128, 256] +if = 'GBMAP || !REBUILDGBMAP' code = ''' // test creating directories lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // open a traversal @@ -8116,6 +8419,9 @@ code = ''' LFS3_T_RDWR | ((MKCONSISTENT) ? LFS3_T_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_T_LOOKAHEAD : 0) + | ((REBUILDGBMAP) + ? LFS3_IFDEF_GBMAP(LFS3_T_REBUILDGBMAP, -1) + : 0) | ((COMPACT) ? LFS3_T_COMPACT : 0) | ((CKMETA) ? LFS3_T_CKMETA : 0) | ((CKDATA) ? LFS3_T_CKDATA : 0)) => 0; @@ -8209,6 +8515,7 @@ code = ''' defines.STEPS = [1, 2, 4, 8, 16, 32, 64, 128] defines.MKCONSISTENT = [false, true] defines.LOOKAHEAD = [false, true] +defines.REBUILDGBMAP = [false, true] defines.COMPACT = [false, true] defines.CKMETA = [true] defines.CKDATA = [true] @@ -8218,10 +8525,14 @@ defines.N = [1, 2, 4, 8, 16, 32, 64, 128, 256] defines.OPS = '2*N' defines.SEED = 42 fuzz = 'SEED' +if = 'GBMAP || !REBUILDGBMAP' code = ''' // test fuzz with dirs lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // set up a simulation to compare against @@ -8234,6 +8545,9 @@ code = ''' LFS3_T_RDWR | ((MKCONSISTENT) ? LFS3_T_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_T_LOOKAHEAD : 0) + | ((REBUILDGBMAP) + ? LFS3_IFDEF_GBMAP(LFS3_T_REBUILDGBMAP, -1) + : 0) | ((COMPACT) ? LFS3_T_COMPACT : 0) | ((CKMETA) ? LFS3_T_CKMETA : 0) | ((CKDATA) ? LFS3_T_CKDATA : 0)) => 0; @@ -8391,6 +8705,7 @@ code = ''' defines.STEPS = [1, 2, 4, 8, 16, 32, 64, 128] defines.MKCONSISTENT = [false, true] defines.LOOKAHEAD = [false, true] +defines.REBUILDGBMAP = [false, true] defines.COMPACT = [false, true] defines.CKMETA = [true] defines.CKDATA = [true] @@ -8406,11 +8721,17 @@ defines.SIZE = [ '2*BLOCK_SIZE', '4*BLOCK_SIZE', ] -if = '(SIZE*N)/BLOCK_SIZE <= 32' +if = [ + '(SIZE*N)/BLOCK_SIZE <= 32', + 'GBMAP || !REBUILDGBMAP', +] code = ''' // test creating files lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // open a traversal @@ -8419,6 +8740,9 @@ code = ''' LFS3_T_RDWR | ((MKCONSISTENT) ? LFS3_T_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_T_LOOKAHEAD : 0) + | ((REBUILDGBMAP) + ? LFS3_IFDEF_GBMAP(LFS3_T_REBUILDGBMAP, -1) + : 0) | ((COMPACT) ? LFS3_T_COMPACT : 0) | ((CKMETA) ? LFS3_T_CKMETA : 0) | ((CKDATA) ? LFS3_T_CKDATA : 0)) => 0; @@ -8496,6 +8820,7 @@ code = ''' defines.STEPS = [1, 2, 4, 8, 16, 32, 64, 128] defines.MKCONSISTENT = [false, true] defines.LOOKAHEAD = [false, true] +defines.REBUILDGBMAP = [false, true] defines.COMPACT = [false, true] defines.CKMETA = [true] defines.CKDATA = [true] @@ -8514,11 +8839,17 @@ defines.SIZE = [ ] defines.SEED = 42 fuzz = 'SEED' -if = '(SIZE*N)/BLOCK_SIZE <= 16' +if = [ + '(SIZE*N)/BLOCK_SIZE <= 16', + 'GBMAP || !REBUILDGBMAP', +] code = ''' // test fuzz with files lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // set up a simulation to compare against @@ -8532,6 +8863,9 @@ code = ''' LFS3_T_RDWR | ((MKCONSISTENT) ? LFS3_T_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_T_LOOKAHEAD : 0) + | ((REBUILDGBMAP) + ? LFS3_IFDEF_GBMAP(LFS3_T_REBUILDGBMAP, -1) + : 0) | ((COMPACT) ? LFS3_T_COMPACT : 0) | ((CKMETA) ? LFS3_T_CKMETA : 0) | ((CKDATA) ? LFS3_T_CKDATA : 0)) => 0; @@ -8740,6 +9074,7 @@ code = ''' defines.STEPS = [1, 2, 4, 8, 16, 32, 64, 128] defines.MKCONSISTENT = [false, true] defines.LOOKAHEAD = [false, true] +defines.REBUILDGBMAP = [false, true] defines.COMPACT = [false, true] defines.CKMETA = [true] defines.CKDATA = [true] @@ -8767,11 +9102,15 @@ if = [ 'CHUNK <= SIZE', # this just saves testing time 'SIZE <= 4*1024*FRAGMENT_SIZE', + 'GBMAP || !REBUILDGBMAP', ] code = ''' // test with complex file writes lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // create a file @@ -8808,6 +9147,9 @@ code = ''' LFS3_T_RDWR | ((MKCONSISTENT) ? LFS3_T_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_T_LOOKAHEAD : 0) + | ((REBUILDGBMAP) + ? LFS3_IFDEF_GBMAP(LFS3_T_REBUILDGBMAP, -1) + : 0) | ((COMPACT) ? LFS3_T_COMPACT : 0) | ((CKMETA) ? LFS3_T_CKMETA : 0) | ((CKDATA) ? LFS3_T_CKDATA : 0)) => 0; @@ -8904,6 +9246,7 @@ code = ''' defines.STEPS = [1, 2, 4, 8, 16, 32, 64, 128] defines.MKCONSISTENT = [false, true] defines.LOOKAHEAD = [false, true] +defines.REBUILDGBMAP = [false, true] defines.COMPACT = [false, true] defines.CKMETA = [true] defines.CKDATA = [true] @@ -8922,11 +9265,17 @@ defines.SIZE = [ ] defines.SEED = 42 fuzz = 'SEED' -if = '(SIZE*N)/BLOCK_SIZE <= 16' +if = [ + '(SIZE*N)/BLOCK_SIZE <= 16', + 'GBMAP || !REBUILDGBMAP', +] code = ''' // test with uncreats, zombies, etc lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // set up a simulation to compare against @@ -8951,6 +9300,9 @@ code = ''' LFS3_T_RDWR | ((MKCONSISTENT) ? LFS3_T_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_T_LOOKAHEAD : 0) + | ((REBUILDGBMAP) + ? LFS3_IFDEF_GBMAP(LFS3_T_REBUILDGBMAP, -1) + : 0) | ((COMPACT) ? LFS3_T_COMPACT : 0) | ((CKMETA) ? LFS3_T_CKMETA : 0) | ((CKDATA) ? LFS3_T_CKDATA : 0)) => 0; @@ -9355,6 +9707,7 @@ code = ''' defines.STEPS = [1, 2, 4, 8, 16, 32, 64, 128] defines.MKCONSISTENT = [false, true] defines.LOOKAHEAD = [false, true] +defines.REBUILDGBMAP = [false, true] defines.COMPACT = [false, true] defines.CKMETA = [true] defines.CKDATA = [true] @@ -9373,11 +9726,17 @@ defines.SIZE = [ ] defines.SEED = 42 fuzz = 'SEED' -if = '(SIZE*N)/BLOCK_SIZE <= 16' +if = [ + '(SIZE*N)/BLOCK_SIZE <= 16', + 'GBMAP || !REBUILDGBMAP', +] code = ''' // test with uncreats, zombies, dirs, etc lfs3_t lfs3; - lfs3_format(&lfs3, LFS3_F_RDWR, CFG) => 0; + lfs3_format(&lfs3, + LFS3_F_RDWR + | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), + CFG) => 0; lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0; // set up a simulation to compare against @@ -9403,6 +9762,9 @@ code = ''' LFS3_T_RDWR | ((MKCONSISTENT) ? LFS3_T_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_T_LOOKAHEAD : 0) + | ((REBUILDGBMAP) + ? LFS3_IFDEF_GBMAP(LFS3_T_REBUILDGBMAP, -1) + : 0) | ((COMPACT) ? LFS3_T_COMPACT : 0) | ((CKMETA) ? LFS3_T_CKMETA : 0) | ((CKDATA) ? LFS3_T_CKDATA : 0)) => 0;