From 35a1ac93fa7e9960b57ca565d6cfaf81ad85c8cb Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Fri, 2 Jan 2026 13:28:47 -0600 Subject: [PATCH] preerase: Adopted PREERASE in tests, fixes, relaxed gbmap zeroing Still needs testing with LFS3_GC=1, and tests that intentionally test preerasing, but this should at least fix most fsinfo.flag related issues. Despite no intentional preerase testing, this already found a number of issues. Most importantly: our ckpoint-agnostic gbmap zeroing was never going to work with preerasing! Main fixes: - Adopted conservative zeroing of gbmap during rebuilds This was the biggest change. Our previous lfs3_gbmap_zero impl was never going to work with preerasing because it unconditionally cleared BMERASED ranges. Not entirely wrong, but a big waste of any preerase work. It also causes the whole system to lock up when LFS3_GC_LOOKAHEAD and LFS3_GC_PREERASE fight to make progress. With LFS3_GC_LOOKAHEAD clearing BMERASED ranges, and LFS3_GC_PREERASE clearing the lookahead flag, nothing gets done! --- The fix was to rewrite lfs3_gbmap_zero[unknown] to only zero BMERASED (and BMINUSE, though this isn't strictly necessary) ranges in the unknown window. This keeps any known-preerased blocks around and avoids throwing that information away. This is also slightly different from BMBAD ranges, which we want to keep around forever, even if in the unknown window. Whether or not was should limit zeroing BMINUSE ranges is an interesting question. If we already need this logic, I think extending it to BMINUSE is a good idea because of how it limits gbmap commits during rebuilds: - Unfortunately, gbmap rebuilds require quite a few commits to both (1) zero gbmap state, and (2) set all the in-use blocks to BMINUSE. This is especially concerning when relying on aggressive gc, such as gc_lookgbmap=-1, which may trigger rebuilds when only a couple blocks are allocated. Limiting zeroing limits gbmap commits in two ways: 1. We only need to update ranges in the unknown window, which shrinks with more aggressive gbmap rebuilds. 2. By not clearing BMINUSE ranges in the known window, populating those blocks during the lookgbmap scan should be a noop. Together, this hopefully makes aggressive gbmap rebuilds relatively cheap, at least in terms of progs/erases. - It's slightly simpler if BMINUSE and BMERASED are handled the same. - Actually increment the preeraser known window in lfs3_alloc_inc. Otherwise our estimated preeraser.count only ever increases! There was some trickiness to make sure preeraser.count is only ever decremented when allocating erased blocks, but fortunately lfs3->gbmap.ecksum's existence can tell us that information. - Reset preeraser state during gbmap rebuilds. Also necessary to avoid unbounded preeraser.count. The simplest solution is to zero the preeraser, which forces it to rescan the gbmap for BMERASED ranges. The preeraser strictly avoids redundant erases. This does require extra gbmap lookups during LFS3_GC_PREERASE, but that's not the end of the world. - Avoid erasing corrupted preerased blocks in case there's other preerased blocks available in our gbmap. This happens when the ecksum check fails, implying a prog was attempted, but power was lost. Before this change (the continue in lfs3_alloc_:11244), we were erasing corrupt ecksums, which is not _wrong_, but sort of defeats the purpose of prerasing. Skipping the block and trying another: 1. Is better in terms of wear-leveling (try not to double erase!) 2. Minimizes latency if we have other preerased blocks we can use - Made lfs3_fs_gc_ preerasing actually conditional on the LFS3_GC_PREERASE flag. Before, lfs3_fs_gc_ was unconditionally preerasing, which is wrong! --- Currently passing: LFS3_YES_GBMAP=1 \ LFS3_YES_REVPERTURB=1 \ LFS3_PREERASE=1 \ make test-runner -j \ & ./scripts/test.py -j -b Other test fixes: - Mostly just adding the necessary LFS3_I_PREERASE flags for all lfs3_fs_stat calls. - LFS3_I_PREERASE and LFS3_I_LOOKAHEAD can interact in funny ways. Just needed testing. - lfs3_trv_t doesn't actually do anything with LFS3_T_PREERASE, so we shouldn't try to test it. - Adopted lfs3_fs_ck instead of explicit traversals where possible. - test_badblocks_*_btree_many was still running with LFS3_YES_GBMAP, but it shouldn't be. The gbmap state is undefined during internal btree tests. Code changes: code stack ctx before: 35260 2136 660 after: 35260 (+0.0%) 2136 (+0.0%) 660 (+0.0%) code stack ctx gbmap before: 38492 2144 776 gbmap after: 38560 (+0.2%) 2144 (+0.0%) 776 (+0.0%) code stack ctx preerase before: 39036 2168 796 preerase after: 39168 (+0.3%) 2168 (+0.0%) 796 (+0.0%) --- lfs3.c | 99 +++++++++++++++++--------- tests/test_badblocks.toml | 6 ++ tests/test_gc.toml | 146 ++++++++++++++++++-------------------- tests/test_mount.toml | 30 +++++++- tests/test_trvs.toml | 82 +++++++++++++++++++++ 5 files changed, 249 insertions(+), 114 deletions(-) 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