From 60ef118dcd540c3adf7fa4de962e1bec379dfe39 Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Tue, 5 Aug 2025 11:37:26 -0500 Subject: [PATCH] rdonly: Got LFS3_RDONLY compiling again Just a few alloc/eoff references slipped through in the bmap work. Current rdonly code size: code stack ctx default: 37024 2352 684 rdonly: 10616 (-71.3%) 896 (-61.9%) 532 (-22.2%) This biggest change was tweaking our mtortoise again to use the unused trunk field for the power-of-two bound. The original intention of using eoff was an extra precaution to avoid the mtortoise looking like a valid shrub at any point, but eoff is not available in LFS3_RDONLY. And we definitely want our mtortoise in LFS3_RDONLY! --- Note I haven't actually tested LFS3_RDONLY + LFS3_BMAP. Does this config even make sense? I guess ckmeta/ckdata will need to traverse the bmap, so, counterintuitively, yes? --- lfs3.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/lfs3.c b/lfs3.c index 78e50cd4..33e5d7ac 100644 --- a/lfs3.c +++ b/lfs3.c @@ -2590,6 +2590,7 @@ static int lfs3_data_readbptr(lfs3_t *lfs3, lfs3_data_t *data, // allocate a bptr +#ifndef LFS3_RDONLY static int lfs3_bptr_alloc(lfs3_t *lfs3, lfs3_bptr_t *bptr) { lfs3_sblock_t block = lfs3_alloc(lfs3, LFS3_ALLOC_ERASE); if (block < 0) { @@ -2603,6 +2604,7 @@ static int lfs3_bptr_alloc(lfs3_t *lfs3, lfs3_bptr_t *bptr) { 0); return 0; } +#endif // needed in lfs3_bptr_fetch #ifdef LFS3_CKFETCHES @@ -10052,7 +10054,9 @@ static void lfs3_trv_init(lfs3_trv_t *trv, uint32_t flags) { trv->b.shrub.r.blocks[0] = -1; trv->b.shrub.r.blocks[1] = -1; trv->b.shrub.r.weight = 0; + #ifndef LFS3_RDONLY trv->b.shrub.r.eoff = 0; + #endif trv->h = NULL; trv->gcksum = 0; } @@ -10122,7 +10126,7 @@ static lfs3_stag_t lfs3_mtree_traverse_(lfs3_t *lfs3, lfs3_trv_t *trv, // // - shrub.blocks => tortoise blocks // - shrub.weight => cycle distance - // - shrub.eoff => power-of-two bound + // - shrub.trunk => power-of-two bound // if (lfs3_mptr_cmp( trv->b.h.mdir.r.blocks, @@ -10133,11 +10137,11 @@ static lfs3_stag_t lfs3_mtree_traverse_(lfs3_t *lfs3, lfs3_trv_t *trv, trv->b.h.mdir.r.blocks[1]); return LFS3_ERR_CORRUPT; } - if (trv->b.shrub.r.weight == (1U << trv->b.shrub.r.eoff)) { + if (trv->b.shrub.r.weight == (1U << trv->b.shrub.r.trunk)) { trv->b.shrub.r.blocks[0] = trv->b.h.mdir.r.blocks[0]; trv->b.shrub.r.blocks[1] = trv->b.h.mdir.r.blocks[1]; trv->b.shrub.r.weight = 0; - trv->b.shrub.r.eoff += 1; + trv->b.shrub.r.trunk += 1; } trv->b.shrub.r.weight += 1; @@ -15586,8 +15590,10 @@ static int lfs3_init(lfs3_t *lfs3, uint32_t flags, lfs3->handles = NULL; // zero in-flight graft state + #ifndef LFS3_RDONLY lfs3->graft = NULL; lfs3->graft_count = 0; + #endif // TODO are these zeros accomplished by flushgdelta in mountinited? // should the flushgdelta be dropped?