bmap: Split known into ctrled+unctrled

This commit is contained in:
Christopher Haster
2025-07-26 10:37:59 -05:00
parent 732d6079e3
commit e7c3755e21
5 changed files with 42 additions and 20 deletions
+20 -4
View File
@@ -10552,8 +10552,10 @@ static lfs3_data_t lfs3_data_fromgbmap(const lfs3_t *lfs3,
uint8_t buffer[static LFS3_GBMAP_DSIZE]) { uint8_t buffer[static LFS3_GBMAP_DSIZE]) {
// cursor should not exceed 31-bits // cursor should not exceed 31-bits
LFS3_ASSERT(lfs3->gbmap.cursor <= 0x7fffffff); LFS3_ASSERT(lfs3->gbmap.cursor <= 0x7fffffff);
// known should not exceed 31-bits // ctrled should not exceed 31-bits
LFS3_ASSERT(lfs3->gbmap.known <= 0x7fffffff); 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 // make sure to zero so we don't leak any info
lfs3_memset(buffer, 0, LFS3_GBMAP_DSIZE); 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 += 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) { if (d_ < 0) {
LFS3_UNREACHABLE(); LFS3_UNREACHABLE();
} }
@@ -10585,11 +10593,18 @@ static int lfs3_data_readgbmap(lfs3_t *lfs3, lfs3_data_t *data) {
return err; return err;
} }
err = lfs3_data_readleb128(lfs3, data, &lfs3->gbmap.known); err = lfs3_data_readleb128(lfs3, data, &lfs3->gbmap.ctrled);
if (err) { if (err) {
return 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, err = lfs3_data_readbranch(lfs3, data, lfs3->block_count,
&lfs3->gbmap.b.r); &lfs3->gbmap.b.r);
if (err) { if (err) {
@@ -15139,6 +15154,7 @@ static int lfs3_init(lfs3_t *lfs3, uint32_t flags,
#ifdef LFS3_BMAP #ifdef LFS3_BMAP
lfs3_btree_init(&lfs3->gbmap.b); lfs3_btree_init(&lfs3->gbmap.b);
lfs3->gbmap.cursor = 0; lfs3->gbmap.cursor = 0;
lfs3->gbmap.ctrled = 0;
lfs3->gbmap.known = 0; lfs3->gbmap.known = 0;
lfs3_btree_init(&lfs3->bmap.gbatc); lfs3_btree_init(&lfs3->bmap.gbatc);
lfs3->bmap.known = 0; lfs3->bmap.known = 0;
+10 -7
View File
@@ -843,21 +843,24 @@ typedef struct lfs3_grm {
} lfs3_grm_t; } lfs3_grm_t;
// gbmap encoding: // gbmap encoding:
// .---+- -+- -+- -+- -. cursor: 1 leb128 <=5 bytes // .---+- -+- -+- -+- -. cursor: 1 leb128 <=5 bytes
// | cursor | known: 1 leb128 <=5 bytes // | cursor | ctrled: 1 leb128 <=5 bytes
// +---+- -+- -+- -+- -+ block: 1 leb128 <=5 bytes // +---+- -+- -+- -+- -+ unctrled: 1 leb128 <=5 bytes
// | known | trunk: 1 leb128 <=4 bytes // | ctrled | block: 1 leb128 <=5 bytes
// +---+- -+- -+- -+- -+ cksum: 1 le32 4 bytes // +---+- -+- -+- -+- -+ trunk: 1 leb128 <=4 bytes
// | block | total: 23 bytes // | unctrled | cksum: 1 le32 4 bytes
// +---+- -+- -+- -+- -+ total: 28 bytes
// | block |
// +---+- -+- -+- -+- -' // +---+- -+- -+- -+- -'
// | trunk | // | trunk |
// +---+- -+- -+- -+ // +---+- -+- -+- -+
// | cksum | // | cksum |
// '---+---+---+---' // '---+---+---+---'
#define LFS3_GBMAP_DSIZE (5+5+5+4+4) #define LFS3_GBMAP_DSIZE (5+5+5+5+4+4)
typedef struct lfs3_gbmap { typedef struct lfs3_gbmap {
lfs3_block_t cursor; lfs3_block_t cursor;
lfs3_block_t ctrled;
lfs3_block_t known; lfs3_block_t known;
lfs3_btree_t b; lfs3_btree_t b;
} lfs3_gbmap_t; } lfs3_gbmap_t;
+4 -3
View File
@@ -2774,7 +2774,8 @@ class Gstate:
super().__init__(mtree, config, tag, gdeltas) super().__init__(mtree, config, tag, gdeltas)
d = 0 d = 0
self.cursor, d_ = fromleb128(self.data, d); d += d_ 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_ block, trunk, cksum, d_ = frombranch(self.data, d); d += d_
self.btree = Btree.fetchck( self.btree = Btree.fetchck(
mtree.bd, block, trunk, mtree.bd, block, trunk,
@@ -2782,9 +2783,9 @@ class Gstate:
cksum) cksum)
def repr(self): def repr(self):
return 'gbmap %s k%s+%s' % ( return 'gbmap %s %d+%d' % (
self.btree.addr(), self.btree.addr(),
self.known, self.cursor) self.ctrled, self.unctrled)
# keep track of known gstate # keep track of known gstate
_known = [g for g in Gstate.__subclasses__() if g.tag is not None] _known = [g for g in Gstate.__subclasses__() if g.tag is not None]
+4 -3
View File
@@ -2804,7 +2804,8 @@ class Gstate:
super().__init__(mtree, config, tag, gdeltas) super().__init__(mtree, config, tag, gdeltas)
d = 0 d = 0
self.cursor, d_ = fromleb128(self.data, d); d += d_ 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_ block, trunk, cksum, d_ = frombranch(self.data, d); d += d_
self.btree = Btree.fetchck( self.btree = Btree.fetchck(
mtree.bd, block, trunk, mtree.bd, block, trunk,
@@ -2812,9 +2813,9 @@ class Gstate:
cksum) cksum)
def repr(self): def repr(self):
return 'gbmap %s k%s+%s' % ( return 'gbmap %s %d+%d' % (
self.btree.addr(), self.btree.addr(),
self.known, self.cursor) self.ctrled, self.unctrled)
# keep track of known gstate # keep track of known gstate
_known = [g for g in Gstate.__subclasses__() if g.tag is not None] _known = [g for g in Gstate.__subclasses__() if g.tag is not None]
+4 -3
View File
@@ -2731,7 +2731,8 @@ class Gstate:
super().__init__(mtree, config, tag, gdeltas) super().__init__(mtree, config, tag, gdeltas)
d = 0 d = 0
self.cursor, d_ = fromleb128(self.data, d); d += d_ 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_ block, trunk, cksum, d_ = frombranch(self.data, d); d += d_
self.btree = Btree.fetchck( self.btree = Btree.fetchck(
mtree.bd, block, trunk, mtree.bd, block, trunk,
@@ -2739,9 +2740,9 @@ class Gstate:
cksum) cksum)
def repr(self): def repr(self):
return 'gbmap %s 0x%x %d' % ( return 'gbmap %s %d+%d' % (
self.btree.addr(), self.btree.addr(),
self.cursor, self.known) self.ctrled, self.unctrled)
# keep track of known gstate # keep track of known gstate
_known = [g for g in Gstate.__subclasses__() if g.tag is not None] _known = [g for g in Gstate.__subclasses__() if g.tag is not None]