Implemented lfs_rbyd_lookup

Though maybe this should not require exact matches?
This commit is contained in:
Christopher Haster
2022-12-21 19:54:44 -06:00
parent 024aaeba56
commit 168977ffad
2 changed files with 344 additions and 60 deletions
+115 -8
View File
@@ -452,7 +452,7 @@ static inline bool lfs_rtag_isalt(lfs_rtag_t tag) {
}
static inline bool lfs_rtag_intree(lfs_rtag_t tag) {
return !(tag & 0x6);
return (tag & 0x6) != 0x2;
}
static inline uint8_t lfs_rtag_type1(lfs_rtag_t tag) {
@@ -463,6 +463,10 @@ static inline uint8_t lfs_rtag_type2(lfs_rtag_t tag) {
return (tag >> 7) & 0xff;
}
static inline uint16_t lfs_rtag_type3(lfs_rtag_t tag) {
return tag & 0x7fff;
}
static inline uint16_t lfs_rtag_id(lfs_rtag_t tag) {
return (tag >> 15) & 0xffff;
}
@@ -944,6 +948,7 @@ static int lfs_rbyd_fetch(lfs_t *lfs,
}
// found trunk of tree?
printf("%x: %08x => %d %d\n", off, tag, wastrunk, lfs_rtag_intree(tag));
if (!wastrunk && lfs_rtag_intree(tag)) {
trunk = off;
wastrunk = true;
@@ -1025,6 +1030,7 @@ static int lfs_rbyd_fetch(lfs_t *lfs,
lfs->seed = lfs_crc32c(lfs->seed, &crc, sizeof(uint32_t));
// save what we've found so far
printf("trunk => %x\n", trunk);
rbyd->trunk = trunk;
rbyd->noff = off;
rbyd->crc = crc;
@@ -1059,11 +1065,112 @@ static int lfs_rbyd_fetch(lfs_t *lfs,
return 0;
}
//static lfs_ssize_t lfs_rbyd_lookup(lfs_t *lfs, lfs_rbyd_t *rbyd,
// lfs_rtag_t tag, lfs_off_t *off, lfs_rtag_t *ntag) {
// // TODO
// return 0;
// TODO make these rtag functions?
static inline bool lfs_rbyd_follow(lfs_rtag_t alt,
lfs_rtag_t lo, lfs_rtag_t hi) {
if (lfs_rtag_islt(alt)) {
return lfs_rtag_weight(alt) > lo;
} else {
return lfs_rtag_weight(alt) > hi;
}
}
static inline void lfs_rbyd_trim(lfs_rtag_t alt,
lfs_rtag_t *lo, lfs_rtag_t *hi) {
lfs_rtag_t lo_ = *lo;
lfs_rtag_t hi_ = *hi;
if (lfs_rtag_islt(alt)) {
if (lfs_rbyd_follow(alt, lo_, hi_)) {
*hi = lfs_rtag_weight(alt)-1 - *lo;
} else {
*lo = *lo - lfs_rtag_weight(alt);
}
} else {
if (lfs_rbyd_follow(alt, lo_, hi_)) {
*lo = lfs_rtag_weight(alt)-1 - *hi;
} else {
*hi = *hi - lfs_rtag_weight(alt);
}
}
}
//static inline void lfs_rbyd_trim(lfs_rtag_t alt,
// lfs_rtag_t *lo, lfs_rtag_t *hi) {
// if (lfs_rtag_islt(alt)) {
// *lo = *lo - lfs_rtag_weight(alt);
// } else {
// *hi = *hi - lfs_rtag_weight(alt);
// }
//}
//
//static inline void lfs_rbyd_trimf(lfs_rtag_t alt,
// lfs_rtag_t *lo, lfs_rtag_t *hi) {
// if (lfs_rtag_islt(alt)) {
// *hi = lfs_rtag_weight(alt)-1 - *lo;
// } else {
// *lo = lfs_rtag_weight(alt)-1 - *hi;
// }
//}
static lfs_ssize_t lfs_rbyd_lookup(lfs_t *lfs, const lfs_rbyd_t *rbyd,
lfs_rtag_t tag, lfs_off_t *off, lfs_rtag_t *ntag) {
// no trunk yet?
lfs_off_t branch = rbyd->trunk;
if (!branch) {
return LFS_ERR_NOENT;
}
// weights for pruning
lfs_rtag_t lo = lfs_rtag_weight(tag);
lfs_rtag_t hi = (((lfs_rtag_t)rbyd->count << 12) + 0xff8)-1
- lfs_rtag_weight(tag);
printf("lo, hi = (%x, %x)\n", lo, hi);
// descend down tree, building alt pointers
while (true) {
lfs_rtag_t alt;
lfs_off_t jump;
lfs_ssize_t delta = lfs_rbyd_readtag(lfs,
&lfs->pcache, &lfs->rcache, lfs->cfg->block_size,
rbyd->block, branch, &alt, &jump, NULL);
if (delta < 0) {
return delta;
}
// found an alt?
if (lfs_rtag_isalt(alt)) {
printf("follow %x (%x, %x)? => %d\n", alt, lo, hi, lfs_rbyd_follow(alt, lo, hi));
if (lfs_rbyd_follow(alt, lo, hi)) {
lfs_rbyd_trim(alt, &lo, &hi);
branch = branch - jump;
} else {
lfs_rbyd_trim(alt, &lo, &hi);
branch += delta;
}
// found end of tree?
} else {
// different tag => not found
if (lfs_rtag_type3(alt) != lfs_rtag_type3(tag)) {
return LFS_ERR_NOENT;
}
// update with what we found
if (ntag) {
lfs_rtag_t ntag_ = tag + ((hi+1) << 3);
if (lfs_rtag_weight(ntag_)
== ((lfs_rtag_t)rbyd->count << 12) + 0xff8) {
ntag_ = 0;
}
*ntag = ntag_;
}
*off = branch;
return jump;
}
}
}
static int lfs_rbyd_prog(lfs_t *lfs,
lfs_cache_t *pcache, lfs_cache_t *rcache,
@@ -1276,13 +1383,13 @@ static int lfs_rbyd_commit(lfs_t *lfs, lfs_rbyd_t *rbyd,
return delta;
}
// make jump absolute
jump = branch - jump;
// found an alt?
if (lfs_rtag_isalt(alt)) {
LFS_ASSERT(false); // TODO
// make jump absolute
jump = branch - jump;
// // prune?
// if (lfs_rtag_weight(alt) >= lo+hi+1) {
// LFS_ASSERT(p_alts[0]);
+229 -52
View File
@@ -8,7 +8,7 @@ code = '''
lfs_t lfs;
lfs_init(&lfs, cfg) => 0;
lfs_rbyd_t rbyd = {
lfs_rbyd_t rbyd_init = {
.block = 0,
.trunk = 0,
.noff = 0,
@@ -19,36 +19,36 @@ code = '''
};
// try an empty commit
lfs_rbyd_t rbyd_ = rbyd;
lfs_bd_erase(&lfs, rbyd_.block) => 0;
lfs_rbyd_commit(&lfs, &rbyd_, NULL) => 0;
lfs_rbyd_fetch(&lfs, &rbyd_, rbyd.block, NULL) => 0;
lfs_rbyd_t rbyd = rbyd_init;
lfs_bd_erase(&lfs, rbyd.block) => 0;
lfs_rbyd_commit(&lfs, &rbyd, NULL) => 0;
lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0;
// commit with one attribute
rbyd_ = rbyd;
lfs_bd_erase(&lfs, rbyd_.block) => 0;
lfs_rbyd_commit(&lfs, &rbyd_,
LFS_MKRATTR(UATTR, 1, 0, &(uint32_t){0xaaaaaaaa}, 4, NULL)) => 0;
lfs_rbyd_fetch(&lfs, &rbyd_, rbyd.block, NULL) => 0;
rbyd = rbyd_init;
lfs_bd_erase(&lfs, rbyd.block) => 0;
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4, NULL)) => 0;
lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0;
// commit with two attributes
rbyd_ = rbyd;
lfs_bd_erase(&lfs, rbyd_.block) => 0;
lfs_rbyd_commit(&lfs, &rbyd_,
LFS_MKRATTR(UATTR, 1, 0, &(uint32_t){0xaaaaaaaa}, 4,
LFS_MKRATTR(UATTR, 2, 0, &(uint32_t){0xbbbbbbbb}, 4,
rbyd = rbyd_init;
lfs_bd_erase(&lfs, rbyd.block) => 0;
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4,
LFS_MKRATTR(GSTATE, 2, 0, &(uint32_t){0xbbbbbbbb}, 4,
NULL))) => 0;
lfs_rbyd_fetch(&lfs, &rbyd_, rbyd.block, NULL) => 0;
lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0;
// // commit with three attributes
// rbyd_ = rbyd;
// lfs_bd_erase(&lfs, rbyd_.block) => 0;
// lfs_rbyd_commit(&lfs, &rbyd_,
// LFS_MKRATTR(UATTR, 1, 0, &(uint32_t){0xaaaaaaaa}, 4,
// LFS_MKRATTR(UATTR, 2, 0, &(uint32_t){0xbbbbbbbb}, 4,
// LFS_MKRATTR(UATTR, 3, 0, &(uint32_t){0xcccccccc}, 4,
// rbyd = rbyd_init;
// lfs_bd_erase(&lfs, rbyd.block) => 0;
// lfs_rbyd_commit(&lfs, &rbyd,
// LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4,
// LFS_MKRATTR(GSTATE, 2, 0, &(uint32_t){0xbbbbbbbb}, 4,
// LFS_MKRATTR(GSTATE, 3, 0, &(uint32_t){0xcccccccc}, 4,
// NULL)))) => 0;
// lfs_rbyd_fetch(&lfs, &rbyd_, rbyd.block) => 0;
// lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block) => 0;
// TODO more?
'''
@@ -60,7 +60,7 @@ code = '''
lfs_t lfs;
lfs_init(&lfs, cfg) => 0;
lfs_rbyd_t rbyd = {
lfs_rbyd_t rbyd_init = {
.block = 0,
.trunk = 0,
.noff = 0,
@@ -71,46 +71,223 @@ code = '''
};
// try an empty commit
lfs_rbyd_t rbyd_ = rbyd;
lfs_bd_erase(&lfs, rbyd_.block) => 0;
lfs_rbyd_commit(&lfs, &rbyd_, NULL) => 0;
lfs_rbyd_fetch(&lfs, &rbyd_, rbyd.block, NULL) => 0;
lfs_rbyd_t rbyd = rbyd_init;
lfs_bd_erase(&lfs, rbyd.block) => 0;
lfs_rbyd_commit(&lfs, &rbyd, NULL) => 0;
lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0;
// commit with one attribute
rbyd_ = rbyd;
lfs_bd_erase(&lfs, rbyd_.block) => 0;
lfs_rbyd_commit(&lfs, &rbyd_, NULL) => 0;
lfs_rbyd_commit(&lfs, &rbyd_,
LFS_MKRATTR(UATTR, 1, 0, &(uint32_t){0xaaaaaaaa}, 4, NULL)) => 0;
lfs_rbyd_fetch(&lfs, &rbyd_, rbyd.block, NULL) => 0;
rbyd = rbyd_init;
lfs_bd_erase(&lfs, rbyd.block) => 0;
lfs_rbyd_commit(&lfs, &rbyd, NULL) => 0;
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4, NULL)) => 0;
lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0;
// commit with two attributes
rbyd_ = rbyd;
lfs_bd_erase(&lfs, rbyd_.block) => 0;
lfs_rbyd_commit(&lfs, &rbyd_,
LFS_MKRATTR(UATTR, 1, 0, &(uint32_t){0xaaaaaaaa}, 4, NULL)) => 0;
lfs_rbyd_commit(&lfs, &rbyd_,
LFS_MKRATTR(UATTR, 2, 0, &(uint32_t){0xbbbbbbbb}, 4, NULL)) => 0;
lfs_rbyd_fetch(&lfs, &rbyd_, rbyd.block, NULL) => 0;
rbyd = rbyd_init;
lfs_bd_erase(&lfs, rbyd.block) => 0;
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4, NULL)) => 0;
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(GSTATE, 2, 0, &(uint32_t){0xbbbbbbbb}, 4, NULL)) => 0;
lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0;
// // commit with three attributes
// rbyd_ = rbyd;
// lfs_bd_erase(&lfs, rbyd_.block) => 0;
// lfs_rbyd_commit(&lfs, &rbyd_,
// LFS_MKRATTR(UATTR, 1, 0, &(uint32_t){0xaaaaaaaa}, 4, NULL)) => 0;
// lfs_rbyd_commit(&lfs, &rbyd_,
// LFS_MKRATTR(UATTR, 2, 0, &(uint32_t){0xbbbbbbbb}, 4, NULL)) => 0;
// lfs_rbyd_commit(&lfs, &rbyd_,
// LFS_MKRATTR(UATTR, 3, 0, &(uint32_t){0xcccccccc}, 4, NULL)) => 0;
// lfs_rbyd_fetch(&lfs, &rbyd_, rbyd.block) => 0;
// rbyd = rbyd_init;
// lfs_bd_erase(&lfs, rbyd.block) => 0;
// lfs_rbyd_commit(&lfs, &rbyd,
// LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4, NULL)) => 0;
// lfs_rbyd_commit(&lfs, &rbyd,
// LFS_MKRATTR(GSTATE, 2, 0, &(uint32_t){0xbbbbbbbb}, 4, NULL)) => 0;
// lfs_rbyd_commit(&lfs, &rbyd,
// LFS_MKRATTR(GSTATE, 3, 0, &(uint32_t){0xcccccccc}, 4, NULL)) => 0;
// lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block) => 0;
// TODO more?
'''
[cases.rbyd_commit_lookup]
in = 'lfs.c'
defines.ERASE_VALUE = [0xff, 0x00, 0x1b, -1]
code = '''
lfs_t lfs;
lfs_init(&lfs, cfg) => 0;
lfs_rbyd_t rbyd_init = {
.block = 0,
.trunk = 0,
.noff = 0,
.rev = 1,
.crc = 0,
.count = 0,
.erased = true,
};
// try an empty commit
lfs_rbyd_t rbyd = rbyd_init;
lfs_rtag_t ntag; // TODO assert on ntag?
lfs_bd_erase(&lfs, rbyd.block) => 0;
lfs_rbyd_commit(&lfs, &rbyd, NULL) => 0;
lfs_rbyd_lookup(&lfs, &rbyd,
LFS_MKRTAG(GSTATE, 1, 0), &(lfs_off_t){0}, &ntag) => LFS_ERR_NOENT;
lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0;
lfs_rbyd_lookup(&lfs, &rbyd,
LFS_MKRTAG(GSTATE, 1, 0), &(lfs_off_t){0}, &ntag) => LFS_ERR_NOENT;
// commit with one attribute
rbyd = rbyd_init;
lfs_bd_erase(&lfs, rbyd.block) => 0;
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4, NULL)) => 0;
lfs_rbyd_lookup(&lfs, &rbyd,
LFS_MKRTAG(GSTATE, 1, 0), &(lfs_off_t){0}, &ntag) => 4;
assert(ntag == 0);
lfs_rbyd_lookup(&lfs, &rbyd,
LFS_MKRTAG(GSTATE, 2, 0), &(lfs_off_t){0}, &ntag) => LFS_ERR_NOENT;
lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0;
lfs_rbyd_lookup(&lfs, &rbyd,
LFS_MKRTAG(GSTATE, 1, 0), &(lfs_off_t){0}, &ntag) => 4;
assert(ntag == 0);
lfs_rbyd_lookup(&lfs, &rbyd,
LFS_MKRTAG(GSTATE, 2, 0), &(lfs_off_t){0}, &ntag) => LFS_ERR_NOENT;
// commit with two attributes
rbyd = rbyd_init;
lfs_bd_erase(&lfs, rbyd.block) => 0;
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4,
LFS_MKRATTR(GSTATE, 2, 0, &(uint32_t){0xbbbbbbbb}, 4,
NULL))) => 0;
lfs_rbyd_lookup(&lfs, &rbyd,
LFS_MKRTAG(GSTATE, 1, 0), &(lfs_off_t){0}, &ntag) => 4;
assert(ntag == LFS_MKRTAG(GSTATE, 2, 0));
lfs_rbyd_lookup(&lfs, &rbyd,
LFS_MKRTAG(GSTATE, 2, 0), &(lfs_off_t){0}, &ntag) => 4;
assert(ntag == 0);
lfs_rbyd_lookup(&lfs, &rbyd,
LFS_MKRTAG(GSTATE, 3, 0), &(lfs_off_t){0}, &ntag) => LFS_ERR_NOENT;
lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0;
lfs_rbyd_lookup(&lfs, &rbyd,
LFS_MKRTAG(GSTATE, 1, 0), &(lfs_off_t){0}, &ntag) => 4;
assert(ntag == LFS_MKRTAG(GSTATE, 2, 0));
lfs_rbyd_lookup(&lfs, &rbyd,
LFS_MKRTAG(GSTATE, 2, 0), &(lfs_off_t){0}, &ntag) => 4;
assert(ntag == 0);
lfs_rbyd_lookup(&lfs, &rbyd,
LFS_MKRTAG(GSTATE, 3, 0), &(lfs_off_t){0}, &ntag) => LFS_ERR_NOENT;
// // commit with three attributes
// rbyd = rbyd_init;
// lfs_bd_erase(&lfs, rbyd.block) => 0;
// lfs_rbyd_commit(&lfs, &rbyd,
// LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4,
// LFS_MKRATTR(GSTATE, 2, 0, &(uint32_t){0xbbbbbbbb}, 4,
// LFS_MKRATTR(GSTATE, 3, 0, &(uint32_t){0xcccccccc}, 4,
// NULL)))) => 0;
// lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block) => 0;
// TODO more?
'''
# TODO we should make sure lookup always returns <= the requested tag,
# this may require fixing in lfs_rbyd_commit to make sure the weights lean
# one way
[cases.rbyd_multi_commit_lookup]
in = 'lfs.c'
defines.ERASE_VALUE = [0xff, 0x00, 0x1b, -1]
code = '''
lfs_t lfs;
lfs_init(&lfs, cfg) => 0;
lfs_rbyd_t rbyd_init = {
.block = 0,
.trunk = 0,
.noff = 0,
.rev = 1,
.crc = 0,
.count = 0,
.erased = true,
};
// try an empty commit
lfs_rbyd_t rbyd = rbyd_init;
lfs_rtag_t ntag; // TODO assert on ntag?
lfs_bd_erase(&lfs, rbyd.block) => 0;
lfs_rbyd_commit(&lfs, &rbyd, NULL) => 0;
lfs_rbyd_lookup(&lfs, &rbyd,
LFS_MKRTAG(GSTATE, 1, 0), &(lfs_off_t){0}, &ntag) => LFS_ERR_NOENT;
lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0;
lfs_rbyd_lookup(&lfs, &rbyd,
LFS_MKRTAG(GSTATE, 1, 0), &(lfs_off_t){0}, &ntag) => LFS_ERR_NOENT;
// commit with one attribute
rbyd = rbyd_init;
lfs_bd_erase(&lfs, rbyd.block) => 0;
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4, NULL)) => 0;
lfs_rbyd_lookup(&lfs, &rbyd,
LFS_MKRTAG(GSTATE, 1, 0), &(lfs_off_t){0}, &ntag) => 4;
assert(ntag == 0);
lfs_rbyd_lookup(&lfs, &rbyd,
LFS_MKRTAG(GSTATE, 2, 0), &(lfs_off_t){0}, &ntag) => LFS_ERR_NOENT;
lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0;
lfs_rbyd_lookup(&lfs, &rbyd,
LFS_MKRTAG(GSTATE, 1, 0), &(lfs_off_t){0}, &ntag) => 4;
assert(ntag == 0);
lfs_rbyd_lookup(&lfs, &rbyd,
LFS_MKRTAG(GSTATE, 2, 0), &(lfs_off_t){0}, &ntag) => LFS_ERR_NOENT;
// commit with two attributes
rbyd = rbyd_init;
lfs_bd_erase(&lfs, rbyd.block) => 0;
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4, NULL)) => 0;
lfs_rbyd_commit(&lfs, &rbyd,
LFS_MKRATTR(GSTATE, 2, 0, &(uint32_t){0xbbbbbbbb}, 4, NULL)) => 0;
lfs_rbyd_lookup(&lfs, &rbyd,
LFS_MKRTAG(GSTATE, 1, 0), &(lfs_off_t){0}, &ntag) => 4;
assert(ntag == LFS_MKRTAG(GSTATE, 2, 0));
lfs_rbyd_lookup(&lfs, &rbyd,
LFS_MKRTAG(GSTATE, 2, 0), &(lfs_off_t){0}, &ntag) => 4;
assert(ntag == 0);
lfs_rbyd_lookup(&lfs, &rbyd,
LFS_MKRTAG(GSTATE, 3, 0), &(lfs_off_t){0}, &ntag) => LFS_ERR_NOENT;
lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0;
lfs_rbyd_lookup(&lfs, &rbyd,
LFS_MKRTAG(GSTATE, 1, 0), &(lfs_off_t){0}, &ntag) => 4;
assert(ntag == LFS_MKRTAG(GSTATE, 2, 0));
lfs_rbyd_lookup(&lfs, &rbyd,
LFS_MKRTAG(GSTATE, 2, 0), &(lfs_off_t){0}, &ntag) => 4;
assert(ntag == 0);
lfs_rbyd_lookup(&lfs, &rbyd,
LFS_MKRTAG(GSTATE, 3, 0), &(lfs_off_t){0}, &ntag) => LFS_ERR_NOENT;
// // commit with three attributes
// rbyd = rbyd_init;
// lfs_bd_erase(&lfs, rbyd.block) => 0;
// lfs_rbyd_commit(&lfs, &rbyd,
// LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4,
// LFS_MKRATTR(GSTATE, 2, 0, &(uint32_t){0xbbbbbbbb}, 4,
// LFS_MKRATTR(GSTATE, 3, 0, &(uint32_t){0xcccccccc}, 4,
// NULL)))) => 0;
// lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block) => 0;
// TODO more?
'''
# [cases.rbyd_commit_lookup]
# [cases.rbyd_multi_commit_lookup]
# [cases.rbyd_commit_fetchmatch]
# [cases.rbyd_multi_commit_fetchmatch]
# [cases.rbyd_commit_traverse]