diff --git a/lfs3.c b/lfs3.c index 882bf58d..78b237bd 100644 --- a/lfs3.c +++ b/lfs3.c @@ -10185,7 +10185,8 @@ static inline void lfs3_alloc_ckpoint_(lfs3_t *lfs3); static inline bool lfs3_alloc_canlookahead(const lfs3_t *lfs3); static inline bool lfs3_alloc_canlookgbmap(const lfs3_t *lfs3); static void lfs3_alloc_adopt(lfs3_t *lfs3, lfs3_block_t known); -static int lfs3_gbmap_zero(lfs3_t *lfs3, lfs3_btree_t *gbmap); +static int lfs3_gbmap_zerounknown(lfs3_t *lfs3, lfs3_btree_t *gbmap, + lfs3_block_t window, lfs3_block_t size); 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_); @@ -10236,8 +10237,8 @@ static lfs3_stag_t lfs3_mtree_gc(lfs3_t *lfs3, lfs3_mgc_t *mgc, && !lfs3_alloc_canlookahead(lfs3), false)) { #ifdef LFS3_GBMAP - // lfs3_gbmap_zero may allocate, so checkpoint the - // lookahead buffer + // lfs3_gbmap_zerounknown may allocate, so checkpoint + // the lookahead buffer lfs3_alloc_ckpoint_(lfs3); // create a copy of the gbmap @@ -10246,9 +10247,12 @@ static lfs3_stag_t lfs3_mtree_gc(lfs3_t *lfs3, lfs3_mgc_t *mgc, // 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_zero(lfs3, &mgc->gbmap_); + // (1) preserve any known erased/bad info and (2) try to + // best use any in-btree erased-state + LFS3_ASSERT(lfs3->lookahead.ckpoint >= lfs3->gbmap.known); + int err = lfs3_gbmap_zerounknown(lfs3, &mgc->gbmap_, + lfs3->gbmap.window + lfs3->gbmap.known, + lfs3->lookahead.ckpoint - lfs3->gbmap.known); if (err) { return err; } @@ -10666,8 +10670,7 @@ static const lfs3_ecksum_t lfs3_gbmap_defaultecksum = {.cksize=-1}; static int lfs3_gbmap_set_(lfs3_t *lfs3, lfs3_btree_t *gbmap, lfs3_block_t block, lfs3_block_t weight, lfs3_tag_t tag, const lfs3_ecksum_t *ecksum) { - return lfs3_gbmap_set__(lfs3, gbmap, - block, weight, tag, + return lfs3_gbmap_set__(lfs3, gbmap, block, weight, tag, // default to not-ecksum if NULL (ecksum) ? ecksum : &lfs3_gbmap_defaultecksum); } @@ -10718,27 +10721,33 @@ static int lfs3_gbmap_setbptr(lfs3_t *lfs3, lfs3_btree_t *gbmap, #if !defined(LFS3_RDONLY) && defined(LFS3_GBMAP) // note this is not completely atomic, but worst case we just end up with // only some ranges zeroed -static int lfs3_gbmap_zero(lfs3_t *lfs3, lfs3_btree_t *gbmap) { - lfs3_block_t block__ = -1; - while (true) { - lfs3_block_t weight__; - lfs3_stag_t tag__ = lfs3_gbmap_lookupnext(lfs3, gbmap, block__+1, - &block__, &weight__, NULL); +static int lfs3_gbmap_zerounknown(lfs3_t *lfs3, lfs3_btree_t *gbmap, + lfs3_block_t window, lfs3_block_t size) { + lfs3_block_t window_ = window % lfs3->block_count; + lfs3_block_t size_ = size; + while (size_ > 0) { + lfs3_block_t block__; + lfs3_stag_t tag__ = lfs3_gbmap_lookupnext(lfs3, gbmap, window_, + &block__, NULL, NULL); if (tag__ < 0) { - if (tag__ == LFS3_ERR_NOENT) { - break; - } + LFS3_ASSERT(tag__ != LFS3_ERR_NOENT); return tag__; } + lfs3_sblock_t d = lfs3_min( + block__+1 - window_, + size_); // mark in-use/erased ranges as free if (tag__ == LFS3_TAG_BMINUSE || tag__ == LFS3_TAG_BMERASED) { - int err = lfs3_gbmap_set_(lfs3, gbmap, - block__, weight__, LFS3_TAG_BMFREE, NULL); + int err = lfs3_gbmap_set_(lfs3, gbmap, window_+d-1, d, + LFS3_TAG_BMFREE, NULL); if (err) { return err; } } + + window_ = (window_ + d) % lfs3->block_count; + size_ -= d; } return 0; @@ -10849,7 +10858,7 @@ static inline bool lfs3_alloc_canpreerase(const lfs3_t *lfs3) { return lfs3_f_isgbmap(lfs3->flags) // have we pre-erased enough blocks? && lfs3->gbmap.preeraser.count - < lfs3->cfg->gc_preerase_count + < (lfs3_block_t)lfs3->cfg->gc_preerase_count // are there any more blocks in our known window? && lfs3->gbmap.preeraser.known < lfs3->gbmap.known; @@ -10963,6 +10972,12 @@ static int lfs3_alloc_adoptgbmap(lfs3_t *lfs3, // adopt new gbmap lfs3->gbmap.known = known; lfs3->gbmap.b = *gbmap; + // reset preeraser, don't worry this should rediscover any + // erased ranges in the gbmap + #ifdef LFS3_PREERASE + lfs3->gbmap.preeraser.known = 0; + lfs3->gbmap.preeraser.count = 0; + #endif // eagerly find the next free block so lookgbmap scans can make // the most progress @@ -10998,8 +11013,18 @@ 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_min(1, lfs3->gbmap.known); + #ifdef LFS3_PREERASE + lfs3->gbmap.preeraser.known + -= lfs3_min(1, lfs3->gbmap.preeraser.known); + #endif if (lfs3->gbmap.next > 0) { lfs3->gbmap.next -= 1; + #ifdef LFS3_PREERASE + if (lfs3_ecksum_isecksum(&lfs3->gbmap.ecksum)) { + lfs3->gbmap.preeraser.count + -= lfs3_min(1, lfs3->gbmap.preeraser.count); + } + #endif } else if (lfs3->gbmap.next < 0) { lfs3->gbmap.next += 1; } @@ -11035,6 +11060,9 @@ static lfs3_sblock_t lfs3_alloc_findfree(lfs3_t *lfs3, if (tag < 0) { return tag; } + lfs3_block_t d = lfs3_min( + (block+1) - lfs3->gbmap.window, + lfs3->gbmap.known); // free? erased? // @@ -11045,15 +11073,11 @@ static lfs3_sblock_t lfs3_alloc_findfree(lfs3_t *lfs3, tag == LFS3_TAG_BMERASED && lfs3_m_isrevperturb(lfs3->flags), false)) { - lfs3->gbmap.next = lfs3_min( - (block+1) - lfs3->gbmap.window, - lfs3->gbmap.known); + lfs3->gbmap.next = +d; // in-use? bad? erased? treat as in-use } else { - lfs3->gbmap.next = -lfs3_min( - (block+1) - lfs3->gbmap.window, - lfs3->gbmap.known); + lfs3->gbmap.next = -d; } } @@ -11215,6 +11239,9 @@ static lfs3_sblock_t lfs3_alloc_(lfs3_t *lfs3, uint32_t flags, #endif return block; } + + // try another block in case we have other preerased blocks + continue; #endif } @@ -11305,9 +11332,12 @@ static int lfs3_alloc_lookgbmap(lfs3_t *lfs3) { // 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 + // known erased/bad info and (2) try to best use any in-btree // erased-state - int err = lfs3_gbmap_zero(lfs3, &gbmap_); + LFS3_ASSERT(lfs3->lookahead.ckpoint >= lfs3->gbmap.known); + int err = lfs3_gbmap_zerounknown(lfs3, &gbmap_, + lfs3->gbmap.window + lfs3->gbmap.known, + lfs3->lookahead.ckpoint - lfs3->gbmap.known); if (err) { return err; } @@ -11360,12 +11390,12 @@ static int lfs3_alloc_preerase(lfs3_t *lfs3) { LFS3_ASSERT(tag__ != LFS3_ERR_NOENT); return tag__; } + lfs3_block_t d = lfs3_min( + block__+1 - block, + lfs3->gbmap.known - lfs3->gbmap.preeraser.known); // not free? if (tag__ != LFS3_TAG_BMFREE) { - lfs3_sblock_t d = lfs3_min( - block__+1 - block, - lfs3->gbmap.known - lfs3->gbmap.preeraser.known); // wait, already erased? if (tag__ == LFS3_TAG_BMERASED) { lfs3->gbmap.preeraser.count += d; @@ -11390,8 +11420,8 @@ static int lfs3_alloc_preerase(lfs3_t *lfs3) { // commit into gbmap // // this relies on lfs3_gbmap_commit being atomic - err = lfs3_gbmap_set(lfs3, &lfs3->gbmap.b, - block, LFS3_TAG_BMERASED, &ecksum); + err = lfs3_gbmap_set(lfs3, &lfs3->gbmap.b, block, + LFS3_TAG_BMERASED, &ecksum); if (err) { return err; } @@ -16669,7 +16699,8 @@ static int lfs3_fs_gc_(lfs3_t *lfs3, lfs3_mgc_t *mgc, } else if (LFS3_IFDEF_RDONLY( false, LFS3_IFDEF_PREERASE( - lfs3_alloc_canpreerase(lfs3), + lfs3_t_ispreerase(flags) + && lfs3_alloc_canpreerase(lfs3), false))) { #if !defined(LFS3_RDONLY) && defined(LFS3_PREERASE) int err = lfs3_alloc_preerase(lfs3); diff --git a/tests/test_badblocks.toml b/tests/test_badblocks.toml index 1adfc2af..d604c60c 100644 --- a/tests/test_badblocks.toml +++ b/tests/test_badblocks.toml @@ -37,6 +37,8 @@ defines.LOOKAHEAD_SIZE = '(BLOCK_COUNT+8-1) / 8' defines.SEED = 42 fuzz = 'SEED' if = 'LFS3_IFDEF_CKPROGS(true, !CKPROGS)' +# don't bother testing with more complicated block allocators +ifndef = 'LFS3_YES_GBMAP' in = 'lfs3.c' code = ''' // test all possible bad blocks @@ -1999,6 +2001,8 @@ defines.LOOKAHEAD_SIZE = '(BLOCK_COUNT+8-1) / 8' defines.SEED = 42 fuzz = 'SEED' if = 'LFS3_IFDEF_CKPROGS(true, !CKPROGS)' +# don't bother testing with more complicated block allocators +ifndef = 'LFS3_YES_GBMAP' in = 'lfs3.c' code = ''' // test a large region of bad blocks @@ -3964,6 +3968,8 @@ defines.LOOKAHEAD_SIZE = '(BLOCK_COUNT+8-1) / 8' defines.SEED = 42 fuzz = 'SEED' if = 'LFS3_IFDEF_CKPROGS(true, !CKPROGS)' +# don't bother testing with more complicated block allocators +ifndef = 'LFS3_YES_GBMAP' in = 'lfs3.c' code = ''' // test a large region of bad blocks diff --git a/tests/test_gc.toml b/tests/test_gc.toml index aee66dbd..d1e130c6 100644 --- a/tests/test_gc.toml +++ b/tests/test_gc.toml @@ -1818,12 +1818,14 @@ done:; defines.AFTER = [0, 1, 2, 3] defines.MKCONSISTENT = [false, true] defines.LOOKAHEAD = [false, true] +defines.PREERASE = [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) + | ((PREERASE) ? LFS3_IFDEF_PREERASE(LFS3_GC_PREERASE, -1) : 0) | ((COMPACT) ? LFS3_GC_COMPACT : 0) | ((CKMETA) ? LFS3_GC_CKMETA : 0) | ((CKDATA) ? LFS3_GC_CKDATA : 0) @@ -1842,6 +1844,10 @@ defines.SIZE = [ if = [ '(SIZE*N)/BLOCK_SIZE <= 32', 'LFS3_IFDEF_GC(true, AFTER != 0)', + 'LFS3_IFDEF_PREERASE(true, !PREERASE)', + 'GBMAP || !PREERASE', + # lfs3_trv_t doesn't make progress on this + '!PREERASE || AFTER != 1', ] code = ''' lfs3_t lfs3; @@ -1883,6 +1889,7 @@ code = ''' | ((!GBMAP || (fsinfo.flags & LFS3_I_LOOKAHEAD)) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -1904,6 +1911,9 @@ code = ''' if (!(fsinfo.flags & ( ((MKCONSISTENT) ? LFS3_I_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_I_LOOKAHEAD : 0) + | ((PREERASE) + ? LFS3_IFDEF_PREERASE(LFS3_I_PREERASE, -1) + : 0) | ((COMPACT) ? LFS3_I_COMPACT : 0) | ((CKMETA) ? LFS3_I_CKMETA : 0) | ((CKDATA) ? LFS3_I_CKDATA : 0)))) { @@ -1933,6 +1943,9 @@ code = ''' if (!(fsinfo.flags & ( ((MKCONSISTENT) ? LFS3_I_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_I_LOOKAHEAD : 0) + | ((PREERASE) + ? LFS3_IFDEF_PREERASE(LFS3_I_PREERASE, -1) + : 0) | ((COMPACT) ? LFS3_I_COMPACT : 0) | ((CKMETA) ? LFS3_I_CKMETA : 0) | ((CKDATA) ? LFS3_I_CKDATA : 0)))) { @@ -1944,35 +1957,17 @@ code = ''' } if (LOOKAHEAD && (fsinfo.flags & LFS3_I_LOOKAHEAD)) { - // we need an explicit traversal for this - lfs3_trv_t trv; - lfs3_trv_open(&lfs3, &trv, - LFS3_T_RDWR | LFS3_T_LOOKAHEAD) => 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; + lfs3_fs_ck(&lfs3, LFS3_CK_LOOKAHEAD) => 0; } + #ifdef LFS3_PREERASE + if (PREERASE && (fsinfo.flags & LFS3_I_PREERASE)) { + lfs3_fs_ck(&lfs3, LFS3_CK_PREERASE) => 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, - LFS3_T_RDWR | LFS3_T_COMPACT) => 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; + lfs3_fs_ck(&lfs3, LFS3_CK_COMPACT) => 0; } if (CKMETA && (fsinfo.flags & LFS3_I_CKMETA)) { @@ -2003,6 +1998,9 @@ code = ''' && (!GBMAP || (fsinfo.flags & LFS3_I_LOOKAHEAD))) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE( + (GBMAP && !PREERASE) ? LFS3_I_PREERASE : 0, + 0) | ((!COMPACT) ? LFS3_I_COMPACT : 0) // note ckdata implies ckmeta | ((!CKMETA && !CKDATA) ? LFS3_I_CKMETA : 0) @@ -2021,12 +2019,14 @@ code = ''' defines.AFTER = [0, 1, 2, 3] defines.MKCONSISTENT = [false, true] defines.LOOKAHEAD = [false, true] +defines.PREERASE = [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) + | ((PREERASE) ? LFS3_IFDEF_PREERASE(LFS3_GC_PREERASE, -1) : 0) | ((COMPACT) ? LFS3_GC_COMPACT : 0) | ((CKMETA) ? LFS3_GC_CKMETA : 0) | ((CKDATA) ? LFS3_GC_CKDATA : 0) @@ -2045,6 +2045,10 @@ defines.SIZE = [ if = [ '(SIZE*N)/BLOCK_SIZE <= 32', 'LFS3_IFDEF_GC(true, AFTER != 0)', + 'LFS3_IFDEF_PREERASE(true, !PREERASE)', + 'GBMAP || !PREERASE', + # lfs3_trv_t doesn't make progress on this + '!PREERASE || AFTER != 1', ] code = ''' lfs3_t lfs3; @@ -2086,6 +2090,7 @@ code = ''' | ((!GBMAP || (fsinfo.flags & LFS3_I_LOOKAHEAD)) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -2107,6 +2112,9 @@ code = ''' if (!(fsinfo.flags & ( ((MKCONSISTENT) ? LFS3_I_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_I_LOOKAHEAD : 0) + | ((PREERASE) + ? LFS3_IFDEF_PREERASE(LFS3_I_PREERASE, -1) + : 0) | ((COMPACT) ? LFS3_I_COMPACT : 0) | ((CKMETA) ? LFS3_I_CKMETA : 0) | ((CKDATA) ? LFS3_I_CKDATA : 0)))) { @@ -2136,6 +2144,9 @@ code = ''' if (!(fsinfo.flags & ( ((MKCONSISTENT) ? LFS3_I_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_I_LOOKAHEAD : 0) + | ((PREERASE) + ? LFS3_IFDEF_PREERASE(LFS3_I_PREERASE, -1) + : 0) | ((COMPACT) ? LFS3_I_COMPACT : 0) | ((CKMETA) ? LFS3_I_CKMETA : 0) | ((CKDATA) ? LFS3_I_CKDATA : 0)))) { @@ -2147,35 +2158,17 @@ code = ''' } if (LOOKAHEAD && (fsinfo.flags & LFS3_I_LOOKAHEAD)) { - // we need an explicit traversal for this - lfs3_trv_t trv; - lfs3_trv_open(&lfs3, &trv, - LFS3_T_RDWR | LFS3_T_LOOKAHEAD) => 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; + lfs3_fs_ck(&lfs3, LFS3_CK_LOOKAHEAD) => 0; } + #ifdef LFS3_PREERASE + if (PREERASE && (fsinfo.flags & LFS3_I_PREERASE)) { + lfs3_fs_ck(&lfs3, LFS3_CK_PREERASE) => 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, - LFS3_T_RDWR | LFS3_T_COMPACT) => 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; + lfs3_fs_ck(&lfs3, LFS3_CK_COMPACT) => 0; } if (CKMETA && (fsinfo.flags & LFS3_I_CKMETA)) { @@ -2206,6 +2199,9 @@ code = ''' && (!GBMAP || (fsinfo.flags & LFS3_I_LOOKAHEAD))) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE( + (GBMAP && !PREERASE) ? LFS3_I_PREERASE : 0, + 0) | ((!COMPACT) ? LFS3_I_COMPACT : 0) // note ckdata implies ckmeta | ((!CKMETA && !CKDATA) ? LFS3_I_CKMETA : 0) @@ -2224,6 +2220,9 @@ code = ''' | ((!GBMAP || (fsinfo.flags & LFS3_I_LOOKAHEAD)) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE( + (GBMAP && !PREERASE) ? LFS3_I_PREERASE : 0, + 0) | LFS3_I_COMPACT // note ckdata implies ckmeta, but uncking ckdata does // _not_ imply uncking ckmeta @@ -2247,6 +2246,9 @@ code = ''' if (!(fsinfo.flags & ( ((MKCONSISTENT) ? LFS3_I_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_I_LOOKAHEAD : 0) + | ((PREERASE) + ? LFS3_IFDEF_PREERASE(LFS3_I_PREERASE, -1) + : 0) | ((COMPACT) ? LFS3_I_COMPACT : 0) | ((CKMETA) ? LFS3_I_CKMETA : 0) | ((CKDATA) ? LFS3_I_CKDATA : 0)))) { @@ -2276,6 +2278,9 @@ code = ''' if (!(fsinfo.flags & ( ((MKCONSISTENT) ? LFS3_I_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_I_LOOKAHEAD : 0) + | ((PREERASE) + ? LFS3_IFDEF_PREERASE(LFS3_I_PREERASE, -1) + : 0) | ((COMPACT) ? LFS3_I_COMPACT : 0) | ((CKMETA) ? LFS3_I_CKMETA : 0) | ((CKDATA) ? LFS3_I_CKDATA : 0)))) { @@ -2287,35 +2292,17 @@ code = ''' } if (LOOKAHEAD && (fsinfo.flags & LFS3_I_LOOKAHEAD)) { - // we need an explicit traversal for this - lfs3_trv_t trv; - lfs3_trv_open(&lfs3, &trv, - LFS3_T_RDWR | LFS3_T_LOOKAHEAD) => 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; + lfs3_fs_ck(&lfs3, LFS3_CK_LOOKAHEAD) => 0; } + #ifdef LFS3_PREERASE + if (PREERASE && (fsinfo.flags & LFS3_I_PREERASE)) { + lfs3_fs_ck(&lfs3, LFS3_CK_PREERASE) => 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, - LFS3_T_RDWR | LFS3_T_COMPACT) => 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; + lfs3_fs_ck(&lfs3, LFS3_CK_COMPACT) => 0; } if (CKMETA && (fsinfo.flags & LFS3_I_CKMETA)) { @@ -2346,6 +2333,9 @@ code = ''' && (!GBMAP || (fsinfo.flags & LFS3_I_LOOKAHEAD))) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE( + (GBMAP && !PREERASE) ? LFS3_I_PREERASE : 0, + 0) | ((!COMPACT) ? LFS3_I_COMPACT : 0) // note ckdata implies ckmeta | ((!CKMETA && !CKDATA) ? LFS3_I_CKMETA : 0) diff --git a/tests/test_mount.toml b/tests/test_mount.toml index 095c6c4a..6431f2a3 100644 --- a/tests/test_mount.toml +++ b/tests/test_mount.toml @@ -32,6 +32,7 @@ defines.CKMETAPARITY = [false, true] defines.CKDATACKSUMS = [false, true] defines.MKCONSISTENT = [false, true] defines.LOOKAHEAD = [false, true] +defines.PREERASE = [false, true] defines.COMPACT = [false, true] defines.CKMETA = [false, true] defines.CKDATA = [false, true] @@ -44,6 +45,9 @@ if = [ 'LFS3_IFDEF_CKDATACKSUMS(true, !CKDATACKSUMS)', '!RDONLY || !MKCONSISTENT', '!RDONLY || !LOOKAHEAD', + 'LFS3_IFDEF_PREERASE(true, !PREERASE)', + 'GBMAP || !PREERASE', + '!RDONLY || !PREERASE', '!RDONLY || !COMPACT', ] code = ''' @@ -70,6 +74,7 @@ code = ''' : 0) | ((MKCONSISTENT) ? LFS3_M_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_M_LOOKAHEAD : 0) + | ((PREERASE) ? LFS3_IFDEF_PREERASE(LFS3_M_PREERASE, -1) : 0) | ((COMPACT) ? LFS3_M_COMPACT : 0) | ((CKMETA) ? LFS3_M_CKMETA : 0) | ((CKDATA) ? LFS3_M_CKDATA : 0), @@ -95,7 +100,12 @@ code = ''' ? LFS3_IFDEF_CKDATACKSUMS(LFS3_I_CKDATACKSUMS, -1) : 0) | ((!MKCONSISTENT) ? LFS3_I_MKCONSISTENT : 0) - | ((!LOOKAHEAD && !GBMAP) ? LFS3_I_LOOKAHEAD : 0) + | ((!LOOKAHEAD && (!GBMAP || PREERASE)) + ? LFS3_I_LOOKAHEAD + : 0) + | LFS3_IFDEF_PREERASE( + (GBMAP && !PREERASE) ? LFS3_I_PREERASE : 0, + 0) | ((!COMPACT) ? LFS3_I_COMPACT : 0) // note ckdata implies ckmeta | ((!CKMETA && !CKDATA) ? LFS3_I_CKMETA : 0) @@ -117,6 +127,7 @@ defines.CKMETAPARITY = [false, true] defines.CKDATACKSUMS = [false, true] defines.MKCONSISTENT = [false, true] defines.LOOKAHEAD = [false, true] +defines.PREERASE = [false, true] defines.COMPACT = [false, true] defines.CKMETA = [false, true] defines.CKDATA = [false, true] @@ -127,6 +138,8 @@ if = [ 'LFS3_IFDEF_CKFETCHES(true, !CKFETCHES)', 'LFS3_IFDEF_CKMETAPARITY(true, !CKMETAPARITY)', 'LFS3_IFDEF_CKDATACKSUMS(true, !CKDATACKSUMS)', + 'LFS3_IFDEF_PREERASE(true, !PREERASE)', + 'GBMAP || !PREERASE', ] code = ''' lfs3_t lfs3; @@ -146,6 +159,7 @@ code = ''' : 0) | ((MKCONSISTENT) ? LFS3_F_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_F_LOOKAHEAD : 0) + | ((PREERASE) ? LFS3_IFDEF_PREERASE(LFS3_F_PREERASE, -1) : 0) | ((COMPACT) ? LFS3_F_COMPACT : 0) | ((CKMETA) ? LFS3_F_CKMETA : 0) | ((CKDATA) ? LFS3_F_CKDATA : 0) @@ -160,7 +174,10 @@ code = ''' LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_MKCONSISTENT - | ((!GBMAP) ? LFS3_I_LOOKAHEAD : 0) + | ((!GBMAP || (PREERASE && !LOOKAHEAD)) + ? LFS3_I_LOOKAHEAD + : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -194,6 +211,7 @@ code = ''' | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_MKCONSISTENT | ((!GBMAP) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -212,6 +230,7 @@ code = ''' LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_MKCONSISTENT + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT // note ckdata implies ckmeta | ((!CKMETA && !CKDATA) ? LFS3_I_CKMETA : 0) @@ -248,6 +267,7 @@ code = ''' LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_MKCONSISTENT + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -272,6 +292,7 @@ code = ''' | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_MKCONSISTENT | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -290,6 +311,7 @@ code = ''' LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_MKCONSISTENT + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT // note ckdata implies ckmeta | ((!CKMETA && !CKDATA) ? LFS3_I_CKMETA : 0) @@ -354,6 +376,7 @@ code = ''' | ((!GBMAP || SIZE >= BLOCK_SIZE/4) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -376,6 +399,7 @@ code = ''' | ((!LOOKAHEAD && (!GBMAP || SIZE >= BLOCK_SIZE/4)) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) // note ckdata implies ckmeta | ((!CKMETA && !CKDATA) ? LFS3_I_CKMETA : 0) | ((!CKDATA) ? LFS3_I_CKDATA : 0) @@ -469,6 +493,7 @@ code = ''' | ((!GBMAP || ORPHANS >= 100) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -491,6 +516,7 @@ code = ''' | ((!LOOKAHEAD && (!GBMAP || ORPHANS >= 100)) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 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 72207c4c..37e3d7fc 100644 --- a/tests/test_trvs.toml +++ b/tests/test_trvs.toml @@ -1760,9 +1760,14 @@ done:; [cases.test_trvs_flags] defines.MKCONSISTENT = [false, true] defines.LOOKAHEAD = [false, true] +defines.PREERASE = [false, true] defines.COMPACT = [false, true] defines.CKMETA = [false, true] defines.CKDATA = [false, true] +if = [ + 'LFS3_IFDEF_PREERASE(true, !PREERASE)', + 'GBMAP || !PREERASE', +] code = ''' lfs3_t lfs3; lfs3_format(&lfs3, @@ -1779,6 +1784,7 @@ code = ''' | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_MKCONSISTENT | ((!GBMAP) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -1790,6 +1796,9 @@ code = ''' LFS3_T_RDWR | ((MKCONSISTENT) ? LFS3_T_MKCONSISTENT : 0) | ((LOOKAHEAD) ? LFS3_T_LOOKAHEAD : 0) + | ((PREERASE) + ? LFS3_IFDEF_PREERASE(LFS3_T_PREERASE, -1) + : 0) | ((COMPACT) ? LFS3_T_COMPACT : 0) | ((CKMETA) ? LFS3_T_CKMETA : 0) | ((CKDATA) ? LFS3_T_CKDATA : 0)) => 0; @@ -1816,6 +1825,7 @@ code = ''' | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | ((!MKCONSISTENT) ? LFS3_I_MKCONSISTENT : 0) | ((!LOOKAHEAD && !GBMAP) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | ((!COMPACT) ? LFS3_I_COMPACT : 0) // note ckdata implies ckmeta | ((!CKMETA && !CKDATA) ? LFS3_I_CKMETA : 0) @@ -1916,6 +1926,7 @@ done:; LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | ((!GBMAP) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -1991,6 +2002,7 @@ code = ''' LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | ((!GBMAP) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -2024,6 +2036,7 @@ code = ''' LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | ((!GBMAP) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -2115,6 +2128,7 @@ done:; LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | ((!GBMAP) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -2210,6 +2224,7 @@ done:; LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | ((!GBMAP) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -2313,6 +2328,7 @@ done:; LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | ((!GBMAP) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -2399,6 +2415,7 @@ code = ''' | ((!GBMAP || SIZE >= BLOCK_SIZE/4) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -2499,6 +2516,7 @@ code = ''' && (!GBMAP || SIZE >= BLOCK_SIZE/4)) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT // and maybe ckmeta/ckdata, note ckdata implies ckmeta | (((!CKMETA && !CKDATA) || SIZE > FCACHE_SIZE || SYNC) @@ -2619,6 +2637,7 @@ done:; LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | ((!GBMAP) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -2751,6 +2770,7 @@ done:; LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -2873,6 +2893,7 @@ done:; LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -2980,6 +3001,7 @@ done:; LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | ((!GBMAP) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -3114,6 +3136,7 @@ done:; LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -3238,6 +3261,7 @@ done:; LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -3358,6 +3382,7 @@ done:; | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | ((DESYNC) ? LFS3_I_MKCONSISTENT : 0) | ((!(LOOKAHEAD && DESYNC) && !GBMAP) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT // note ckdata implies ckmeta | ((!(CKMETA && DESYNC) && !(CKDATA && DESYNC)) @@ -3503,6 +3528,7 @@ done:; | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | ((DESYNC) ? LFS3_I_MKCONSISTENT : 0) | ((!(LOOKAHEAD && DESYNC)) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT // note ckdata implies ckmeta | ((!(CKMETA && DESYNC) && !(CKDATA && DESYNC)) @@ -3638,6 +3664,7 @@ done:; | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | ((DESYNC) ? LFS3_I_MKCONSISTENT : 0) | ((!(LOOKAHEAD && DESYNC)) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT // note ckdata implies ckmeta | ((!(CKMETA && DESYNC) && !(CKDATA && DESYNC)) @@ -3759,6 +3786,7 @@ done:; | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | ((DESYNC) ? LFS3_I_MKCONSISTENT : 0) | ((!(LOOKAHEAD && DESYNC)) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT // note ckdata implies ckmeta | ((!(CKMETA && DESYNC) && !(CKDATA && DESYNC)) @@ -3882,6 +3910,7 @@ done:; LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -4007,6 +4036,7 @@ done:; LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -4138,6 +4168,7 @@ done:; LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -4279,6 +4310,7 @@ done:; LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -4420,6 +4452,7 @@ done:; LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -4541,6 +4574,7 @@ done:; LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -4663,6 +4697,7 @@ done:; LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -4793,6 +4828,7 @@ done:; LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -4929,6 +4965,7 @@ done:; LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -5119,6 +5156,7 @@ done:; LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -5325,6 +5363,7 @@ done:; LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -5526,6 +5565,7 @@ done:; LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -5724,6 +5764,7 @@ done:; LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -5928,6 +5969,7 @@ done:; LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -6132,6 +6174,7 @@ done:; LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -6346,6 +6389,7 @@ done:; LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -6419,6 +6463,7 @@ code = ''' LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | ((!GBMAP) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -6457,6 +6502,7 @@ code = ''' LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | ((!GBMAP) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -6482,6 +6528,7 @@ code = ''' LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | ((!LOOKAHEAD && !GBMAP) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) // note ckdata implies ckmeta | ((!CKMETA && !CKDATA) ? LFS3_I_CKMETA : 0) | ((!CKDATA) ? LFS3_I_CKDATA : 0) @@ -6569,6 +6616,7 @@ code = ''' LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -6615,6 +6663,7 @@ code = ''' LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -6642,6 +6691,7 @@ code = ''' LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | ((!LOOKAHEAD) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) // note ckdata implies ckmeta | ((!CKMETA && !CKDATA) ? LFS3_I_CKMETA : 0) | ((!CKDATA) ? LFS3_I_CKDATA : 0) @@ -6728,6 +6778,7 @@ code = ''' LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -6774,6 +6825,7 @@ code = ''' LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -6801,6 +6853,7 @@ code = ''' LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | ((!LOOKAHEAD) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) // note ckdata implies ckmeta | ((!CKMETA && !CKDATA) ? LFS3_I_CKMETA : 0) | ((!CKDATA) ? LFS3_I_CKDATA : 0) @@ -6869,6 +6922,7 @@ code = ''' LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | ((!GBMAP) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -6909,6 +6963,7 @@ code = ''' LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -6934,6 +6989,7 @@ code = ''' LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | ((!LOOKAHEAD) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) // note ckdata implies ckmeta | ((!CKMETA && !CKDATA) ? LFS3_I_CKMETA : 0) | ((!CKDATA) ? LFS3_I_CKDATA : 0) @@ -7029,6 +7085,7 @@ code = ''' LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | ((!GBMAP) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -7081,6 +7138,7 @@ code = ''' LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -7107,6 +7165,7 @@ code = ''' LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | ((!LOOKAHEAD) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) // note ckdata implies ckmeta | ((!CKMETA && !CKDATA) ? LFS3_I_CKMETA : 0) | ((!CKDATA) ? LFS3_I_CKDATA : 0) @@ -7256,6 +7315,7 @@ code = ''' LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -7315,6 +7375,7 @@ code = ''' LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -7343,6 +7404,7 @@ code = ''' LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | ((!LOOKAHEAD) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) // note ckdata implies ckmeta | ((!CKMETA && !CKDATA) ? LFS3_I_CKMETA : 0) | ((!CKDATA) ? LFS3_I_CKDATA : 0) @@ -7497,6 +7559,7 @@ code = ''' LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -7561,6 +7624,7 @@ code = ''' LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -7589,6 +7653,7 @@ code = ''' LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | ((!LOOKAHEAD) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) // note ckdata implies ckmeta | ((!CKMETA && !CKDATA) ? LFS3_I_CKMETA : 0) | ((!CKDATA) ? LFS3_I_CKDATA : 0) @@ -7709,6 +7774,7 @@ code = ''' | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | ((ORPHANS > 0) ? LFS3_I_MKCONSISTENT : 0) | ((!GBMAP || ORPHANS >= 100) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -7779,6 +7845,7 @@ code = ''' && (!GBMAP || ORPHANS >= 100)) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT // note ckdata implies ckmeta | (((!CKMETA && !CKDATA) || ORPHANS > 0) ? LFS3_I_CKMETA : 0) @@ -7858,6 +7925,7 @@ code = ''' LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | ((!GBMAP) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -7953,6 +8021,7 @@ code = ''' && (!GBMAP || ORPHANS >= 100)) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT // note ckdata implies ckmeta | (((!CKMETA && !CKDATA) || ORPHANS > 0) ? LFS3_I_CKMETA : 0) @@ -8058,6 +8127,7 @@ code = ''' | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | ((ORPHANS > 0) ? LFS3_I_MKCONSISTENT : 0) | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -8138,6 +8208,7 @@ code = ''' LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | ((!LOOKAHEAD || ORPHANS > 0) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT // note ckdata implies ckmeta | (((!CKMETA && !CKDATA) || ORPHANS > 0) ? LFS3_I_CKMETA : 0) @@ -8243,6 +8314,7 @@ code = ''' | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | ((ORPHANS > 0) ? LFS3_I_MKCONSISTENT : 0) | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -8323,6 +8395,7 @@ code = ''' LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | ((!LOOKAHEAD || ORPHANS > 0) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT // note ckdata implies ckmeta | (((!CKMETA && !CKDATA) || ORPHANS > 0) ? LFS3_I_CKMETA : 0) @@ -8429,6 +8502,7 @@ code = ''' | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | ((ORPHANS > 0) ? LFS3_I_MKCONSISTENT : 0) | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -8517,6 +8591,7 @@ code = ''' LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | ((!LOOKAHEAD || ORPHANS > 0) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT // note ckdata implies ckmeta | (((!CKMETA && !CKDATA) || ORPHANS > 0) ? LFS3_I_CKMETA : 0) @@ -8623,6 +8698,7 @@ code = ''' | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | ((ORPHANS > 0) ? LFS3_I_MKCONSISTENT : 0) | LFS3_I_LOOKAHEAD + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -8711,6 +8787,7 @@ code = ''' LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | ((!LOOKAHEAD || ORPHANS > 0) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT // note ckdata implies ckmeta | (((!CKMETA && !CKDATA) || ORPHANS > 0) ? LFS3_I_CKMETA : 0) @@ -8837,6 +8914,7 @@ code = ''' | ((!GBMAP || ORPHANS >= 100) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -8911,6 +8989,7 @@ code = ''' | ((!GBMAP || ORPHANS >= 100) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -8939,6 +9018,7 @@ code = ''' | ((!LOOKAHEAD && (!GBMAP || ORPHANS >= 100)) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) // note ckdata implies ckmeta | ((!CKMETA && !CKDATA) ? LFS3_I_CKMETA : 0) | ((!CKDATA) ? LFS3_I_CKDATA : 0) @@ -9040,6 +9120,7 @@ code = ''' LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0) | LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0) | ((!GBMAP) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA @@ -9139,6 +9220,7 @@ code = ''' | ((!GBMAP || ORPHANS >= 100) ? LFS3_I_LOOKAHEAD : 0) + | LFS3_IFDEF_PREERASE((GBMAP) ? LFS3_I_PREERASE : 0, 0) | LFS3_I_COMPACT | LFS3_I_CKMETA | LFS3_I_CKDATA