bmap: Split known into ctrled+unctrled
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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
@@ -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]
|
||||
|
||||
@@ -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
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user