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]) {
|
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;
|
||||||
|
|||||||
@@ -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
@@ -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]
|
||||||
|
|||||||
@@ -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
@@ -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]
|
||||||
|
|||||||
Reference in New Issue
Block a user