From e7c3755e21dd5ebfb6abd5fddfaf34fdbaf0d67d Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Sat, 26 Jul 2025 10:37:59 -0500 Subject: [PATCH] bmap: Split known into ctrled+unctrled --- lfs3.c | 24 ++++++++++++++++++++---- lfs3.h | 17 ++++++++++------- scripts/dbgbmap.py | 7 ++++--- scripts/dbgbmapsvg.py | 7 ++++--- scripts/dbglfs3.py | 7 ++++--- 5 files changed, 42 insertions(+), 20 deletions(-) diff --git a/lfs3.c b/lfs3.c index 5e9d2fe9..6077ae4d 100644 --- a/lfs3.c +++ b/lfs3.c @@ -10552,8 +10552,10 @@ static lfs3_data_t lfs3_data_fromgbmap(const lfs3_t *lfs3, uint8_t buffer[static LFS3_GBMAP_DSIZE]) { // cursor should not exceed 31-bits LFS3_ASSERT(lfs3->gbmap.cursor <= 0x7fffffff); - // known should not exceed 31-bits - LFS3_ASSERT(lfs3->gbmap.known <= 0x7fffffff); + // ctrled should not exceed 31-bits + LFS3_ASSERT(lfs3->gbmap.ctrled <= 0x7fffffff); + // unctrled should not exceed 31-bits + LFS3_ASSERT(lfs3->gbmap.known - lfs3->gbmap.ctrled <= 0x7fffffff); // make sure to zero so we don't leak any info lfs3_memset(buffer, 0, LFS3_GBMAP_DSIZE); @@ -10565,7 +10567,13 @@ static lfs3_data_t lfs3_data_fromgbmap(const lfs3_t *lfs3, } d += d_; - d_ = lfs3_toleb128(lfs3->gbmap.known, &buffer[d], 5); + d_ = lfs3_toleb128(lfs3->gbmap.ctrled, &buffer[d], 5); + if (d_ < 0) { + LFS3_UNREACHABLE(); + } + d += d_; + + d_ = lfs3_toleb128(lfs3->gbmap.known - lfs3->gbmap.ctrled, &buffer[d], 5); if (d_ < 0) { LFS3_UNREACHABLE(); } @@ -10585,11 +10593,18 @@ static int lfs3_data_readgbmap(lfs3_t *lfs3, lfs3_data_t *data) { return err; } - err = lfs3_data_readleb128(lfs3, data, &lfs3->gbmap.known); + err = lfs3_data_readleb128(lfs3, data, &lfs3->gbmap.ctrled); if (err) { return err; } + lfs3_block_t unctrled; + err = lfs3_data_readleb128(lfs3, data, &unctrled); + if (err) { + return err; + } + lfs3->gbmap.known = lfs3->gbmap.ctrled + unctrled; + err = lfs3_data_readbranch(lfs3, data, lfs3->block_count, &lfs3->gbmap.b.r); if (err) { @@ -15139,6 +15154,7 @@ static int lfs3_init(lfs3_t *lfs3, uint32_t flags, #ifdef LFS3_BMAP lfs3_btree_init(&lfs3->gbmap.b); lfs3->gbmap.cursor = 0; + lfs3->gbmap.ctrled = 0; lfs3->gbmap.known = 0; lfs3_btree_init(&lfs3->bmap.gbatc); lfs3->bmap.known = 0; diff --git a/lfs3.h b/lfs3.h index c0713e90..d00049f6 100644 --- a/lfs3.h +++ b/lfs3.h @@ -843,21 +843,24 @@ typedef struct lfs3_grm { } lfs3_grm_t; // gbmap encoding: -// .---+- -+- -+- -+- -. cursor: 1 leb128 <=5 bytes -// | cursor | known: 1 leb128 <=5 bytes -// +---+- -+- -+- -+- -+ block: 1 leb128 <=5 bytes -// | known | trunk: 1 leb128 <=4 bytes -// +---+- -+- -+- -+- -+ cksum: 1 le32 4 bytes -// | block | total: 23 bytes +// .---+- -+- -+- -+- -. cursor: 1 leb128 <=5 bytes +// | cursor | ctrled: 1 leb128 <=5 bytes +// +---+- -+- -+- -+- -+ unctrled: 1 leb128 <=5 bytes +// | ctrled | block: 1 leb128 <=5 bytes +// +---+- -+- -+- -+- -+ trunk: 1 leb128 <=4 bytes +// | unctrled | cksum: 1 le32 4 bytes +// +---+- -+- -+- -+- -+ total: 28 bytes +// | block | // +---+- -+- -+- -+- -' // | trunk | // +---+- -+- -+- -+ // | cksum | // '---+---+---+---' -#define LFS3_GBMAP_DSIZE (5+5+5+4+4) +#define LFS3_GBMAP_DSIZE (5+5+5+5+4+4) typedef struct lfs3_gbmap { lfs3_block_t cursor; + lfs3_block_t ctrled; lfs3_block_t known; lfs3_btree_t b; } lfs3_gbmap_t; diff --git a/scripts/dbgbmap.py b/scripts/dbgbmap.py index 5a802e4a..ece22ba3 100755 --- a/scripts/dbgbmap.py +++ b/scripts/dbgbmap.py @@ -2774,7 +2774,8 @@ class Gstate: super().__init__(mtree, config, tag, gdeltas) d = 0 self.cursor, d_ = fromleb128(self.data, d); d += d_ - self.known, d_ = fromleb128(self.data, d); d += d_ + self.ctrled, d_ = fromleb128(self.data, d); d += d_ + self.unctrled, d_ = fromleb128(self.data, d); d += d_ block, trunk, cksum, d_ = frombranch(self.data, d); d += d_ self.btree = Btree.fetchck( mtree.bd, block, trunk, @@ -2782,9 +2783,9 @@ class Gstate: cksum) def repr(self): - return 'gbmap %s k%s+%s' % ( + return 'gbmap %s %d+%d' % ( self.btree.addr(), - self.known, self.cursor) + self.ctrled, self.unctrled) # keep track of known gstate _known = [g for g in Gstate.__subclasses__() if g.tag is not None] diff --git a/scripts/dbgbmapsvg.py b/scripts/dbgbmapsvg.py index b8264bf1..c8613363 100755 --- a/scripts/dbgbmapsvg.py +++ b/scripts/dbgbmapsvg.py @@ -2804,7 +2804,8 @@ class Gstate: super().__init__(mtree, config, tag, gdeltas) d = 0 self.cursor, d_ = fromleb128(self.data, d); d += d_ - self.known, d_ = fromleb128(self.data, d); d += d_ + self.ctrled, d_ = fromleb128(self.data, d); d += d_ + self.unctrled, d_ = fromleb128(self.data, d); d += d_ block, trunk, cksum, d_ = frombranch(self.data, d); d += d_ self.btree = Btree.fetchck( mtree.bd, block, trunk, @@ -2812,9 +2813,9 @@ class Gstate: cksum) def repr(self): - return 'gbmap %s k%s+%s' % ( + return 'gbmap %s %d+%d' % ( self.btree.addr(), - self.known, self.cursor) + self.ctrled, self.unctrled) # keep track of known gstate _known = [g for g in Gstate.__subclasses__() if g.tag is not None] diff --git a/scripts/dbglfs3.py b/scripts/dbglfs3.py index 5af36289..959beda2 100755 --- a/scripts/dbglfs3.py +++ b/scripts/dbglfs3.py @@ -2731,7 +2731,8 @@ class Gstate: super().__init__(mtree, config, tag, gdeltas) d = 0 self.cursor, d_ = fromleb128(self.data, d); d += d_ - self.known, d_ = fromleb128(self.data, d); d += d_ + self.ctrled, d_ = fromleb128(self.data, d); d += d_ + self.unctrled, d_ = fromleb128(self.data, d); d += d_ block, trunk, cksum, d_ = frombranch(self.data, d); d += d_ self.btree = Btree.fetchck( mtree.bd, block, trunk, @@ -2739,9 +2740,9 @@ class Gstate: cksum) def repr(self): - return 'gbmap %s 0x%x %d' % ( + return 'gbmap %s %d+%d' % ( self.btree.addr(), - self.cursor, self.known) + self.ctrled, self.unctrled) # keep track of known gstate _known = [g for g in Gstate.__subclasses__() if g.tag is not None]