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]) {
// 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;
+9 -6
View File
@@ -844,20 +844,23 @@ typedef struct lfs3_grm {
// 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 | 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;
+4 -3
View File
@@ -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]
+4 -3
View File
@@ -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]
+4 -3
View File
@@ -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]