Tweaked mchildroot propagation again, adopted "mblocks" more consistently

This commit is contained in:
Christopher Haster
2023-09-09 15:28:58 -05:00
parent 610d290797
commit 2b98d62637
2 changed files with 34 additions and 39 deletions
+33 -38
View File
@@ -4475,7 +4475,7 @@ static int lfsr_btree_traversal_next(lfs_t *lfs,
/// Metadata pair operations ///
// the mroot anchor, mdir 0x{0,1} is the entry point into the filesystem
#define LFSR_MROOTANCHOR ((const lfs_block_t[2]){0, 1})
#define LFSR_MBLOCKS_MROOTANCHOR ((const lfs_block_t[2]){0, 1})
static inline int lfsr_mblocks_cmp(
const lfs_block_t a[static 2],
@@ -4507,7 +4507,7 @@ static inline bool lfsr_mdir_ismrootanchor(const lfsr_mdir_t *mdir) {
// 2 leb128 => 10 bytes (worst case)
#define LFSR_MDIR_DSIZE (5+5)
static lfs_ssize_t lfsr_mdir_todisk(lfs_t *lfs,
static lfs_ssize_t lfsr_mblocks_todisk(lfs_t *lfs,
const lfs_block_t blocks[static 2],
uint8_t buffer[static LFSR_MDIR_DSIZE]) {
(void)lfs;
@@ -4523,7 +4523,7 @@ static lfs_ssize_t lfsr_mdir_todisk(lfs_t *lfs,
return d;
}
static int lfsr_data_readmdir(lfs_t *lfs, lfsr_data_t *data,
static int lfsr_data_readmblocks(lfs_t *lfs, lfsr_data_t *data,
lfs_block_t blocks[static 2]) {
for (int i = 0; i < 2; i++) {
int err = lfsr_data_readleb128(lfs, data, (int32_t*)&blocks[i]);
@@ -4717,7 +4717,7 @@ static int lfsr_mtree_lookup(lfs_t *lfs, lfs_ssize_t mid, lfsr_mdir_t *mdir_) {
LFS_ASSERT(tag == LFSR_TAG_MDIR);
// decode mdir
err = lfsr_data_readmdir(lfs, &data, mdir_->u.m.blocks);
err = lfsr_data_readmblocks(lfs, &data, mdir_->u.m.blocks);
if (err) {
return err;
}
@@ -4736,8 +4736,8 @@ static int lfsr_mtree_parent(lfs_t *lfs, const lfs_block_t blocks[static 2],
// scan list of mroots for our requested pair
lfs_block_t blocks_[2] = {
LFSR_MROOTANCHOR[0],
LFSR_MROOTANCHOR[1]};
LFSR_MBLOCKS_MROOTANCHOR[0],
LFSR_MBLOCKS_MROOTANCHOR[1]};
while (true) {
// fetch next possible superblock
lfsr_mdir_t mdir;
@@ -4755,7 +4755,7 @@ static int lfsr_mtree_parent(lfs_t *lfs, const lfs_block_t blocks[static 2],
}
// decode mdir
err = lfsr_data_readmdir(lfs, &data, blocks_);
err = lfsr_data_readmblocks(lfs, &data, blocks_);
if (err) {
return err;
}
@@ -5300,13 +5300,13 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
}
uint8_t mdir_buf[LFSR_MDIR_DSIZE];
lfs_ssize_t mdir_dsize = lfsr_mdir_todisk(lfs,
lfs_ssize_t mdir_dsize = lfsr_mblocks_todisk(lfs,
mdir_.u.m.blocks, mdir_buf);
if (mdir_dsize < 0) {
return mdir_dsize;
}
uint8_t msibling_buf[LFSR_MDIR_DSIZE];
lfs_ssize_t msibling_dsize = lfsr_mdir_todisk(lfs,
lfs_ssize_t msibling_dsize = lfsr_mblocks_todisk(lfs,
msibling_.u.m.blocks, msibling_buf);
if (msibling_dsize < 0) {
return msibling_dsize;
@@ -5370,7 +5370,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
relocate:;
// update our mtree
uint8_t mdir_buf[LFSR_MDIR_DSIZE];
lfs_ssize_t mdir_dsize = lfsr_mdir_todisk(lfs,
lfs_ssize_t mdir_dsize = lfsr_mblocks_todisk(lfs,
mdir_.u.m.blocks, mdir_buf);
if (mdir_dsize < 0) {
return mdir_dsize;
@@ -5481,11 +5481,10 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
// need to update mroot? tail recurse, updating mroots until a commit sticks
lfsr_mdir_t mchildroot = lfs->mroot;
lfs_block_t mchildroot_[2] = {mroot_.u.m.blocks[0], mroot_.u.m.blocks[1]};
lfsr_mdir_t mchildroot_ = mroot_;
while (dirtymroot) {
lfsr_mdir_t mparentroot;
int err = lfsr_mtree_parent(lfs, mchildroot.u.m.blocks,
&mparentroot);
lfsr_mdir_t mparentroot_;
int err = lfsr_mtree_parent(lfs, mchildroot.u.m.blocks, &mparentroot_);
if (err && err != LFS_ERR_NOENT) {
return err;
}
@@ -5496,18 +5495,18 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
LFS_DEBUG("Relocating mroot 0x{%"PRIx32",%"PRIx32"} "
"-> 0x{%"PRIx32",%"PRIx32"}",
mchildroot.u.m.blocks[0], mchildroot.u.m.blocks[1],
mchildroot_[0], mchildroot_[1]);
mchildroot_.u.m.blocks[0], mchildroot_.u.m.blocks[1]);
// commit mrootchild
uint8_t mchildroot_buf[LFSR_MDIR_DSIZE];
lfs_ssize_t mchildroot_dsize = lfsr_mdir_todisk(lfs,
mchildroot_, mchildroot_buf);
lfs_ssize_t mchildroot_dsize = lfsr_mblocks_todisk(lfs,
mchildroot_.u.m.blocks, mchildroot_buf);
if (mchildroot_dsize < 0) {
return mchildroot_dsize;
}
mchildroot = mparentroot;
err = lfsr_mdir_commit_(lfs, &mparentroot, -1, -1, NULL, LFSR_ATTRS(
mchildroot = mparentroot_;
err = lfsr_mdir_commit_(lfs, &mparentroot_, -1, -1, NULL, LFSR_ATTRS(
LFSR_ATTR(-1,
MROOT, 0, BUF(mchildroot_buf, mchildroot_dsize))));
if (err) {
@@ -5516,36 +5515,32 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
return err;
}
mchildroot_[0] = mparentroot.u.m.blocks[0];
mchildroot_[1] = mparentroot.u.m.blocks[1];
dirtymroot = (lfsr_mblocks_cmp(
mchildroot.u.m.blocks,
mchildroot_) != 0);
mchildroot_ = mparentroot_;
dirtymroot = (lfsr_mdir_cmp(&mchildroot_, &mchildroot) != 0);
}
// uh oh, we ran out of mrootparents, need to extend mroot chain
if (dirtymroot) {
// mchildroot should be our initial mroot at this point
LFS_ASSERT(lfsr_mdir_ismrootanchor(&mchildroot));
LFS_DEBUG("Extending mroot 0x{%"PRIx32",%"PRIx32"}"
" -> 0x{%"PRIx32",%"PRIx32"}"
", 0x{%"PRIx32",%"PRIx32"}",
mchildroot.u.m.blocks[0], mchildroot.u.m.blocks[1],
mchildroot.u.m.blocks[0], mchildroot.u.m.blocks[1],
mchildroot_[0], mchildroot_[1]);
mchildroot_.u.m.blocks[0], mchildroot_.u.m.blocks[1]);
// commit mrootchild
uint8_t mchildroot_buf[LFSR_MDIR_DSIZE];
lfs_ssize_t mchildroot_dsize = lfsr_mdir_todisk(lfs, mchildroot_,
mchildroot_buf);
lfs_ssize_t mchildroot_dsize = lfsr_mblocks_todisk(lfs,
mchildroot_.u.m.blocks, mchildroot_buf);
if (mchildroot_dsize < 0) {
return mchildroot_dsize;
}
// compact into mparentroot, this should stay our mroot anchor
lfsr_mdir_t mparentroot;
err = lfsr_mdir_swap(lfs, &mparentroot, &mchildroot, -1);
// compact into mparentroot_, this should stay our mroot anchor
lfsr_mdir_t mparentroot_;
err = lfsr_mdir_swap(lfs, &mparentroot_, &mchildroot, -1);
if (err) {
return err;
}
@@ -5568,7 +5563,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
}
// write the tag
err = lfsr_rbyd_appendcompactattr(lfs, &mparentroot.u.r.rbyd,
err = lfsr_rbyd_appendcompactattr(lfs, &mparentroot_.u.r.rbyd,
tag, weight, data);
if (err) {
LFS_ASSERT(err != LFS_ERR_RANGE);
@@ -5576,14 +5571,14 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
}
}
err = lfsr_rbyd_compact(lfs, &mparentroot.u.r.rbyd);
err = lfsr_rbyd_compact(lfs, &mparentroot_.u.r.rbyd);
if (err) {
LFS_ASSERT(err != LFS_ERR_RANGE);
return err;
}
// and commit our new mroot
err = lfsr_mdir_commit__(lfs, &mparentroot, -1, -1, LFSR_ATTRS(
err = lfsr_mdir_commit__(lfs, &mparentroot_, -1, -1, LFSR_ATTRS(
LFSR_ATTR(-1,
WIDE(MROOT), 0, BUF(mchildroot_buf, mchildroot_dsize))));
if (err) {
@@ -5753,7 +5748,7 @@ static int lfsr_mtree_namelookup(lfs_t *lfs,
LFS_ASSERT(weight == lfsr_mweight(lfs));
// decode mdir
err = lfsr_data_readmdir(lfs, &data, mdir.u.m.blocks);
err = lfsr_data_readmblocks(lfs, &data, mdir.u.m.blocks);
if (err) {
return err;
}
@@ -5968,7 +5963,7 @@ static int lfsr_mtree_traversal_next(lfs_t *lfs,
if (traversal->mdir.u.r.rbyd.trunk == 0) {
// fetch the first mroot 0x{0,1}
int err = lfsr_mdir_fetch(lfs, &traversal->mdir,
-1, LFSR_MROOTANCHOR);
-1, LFSR_MBLOCKS_MROOTANCHOR);
if (err) {
return err;
}
@@ -5998,7 +5993,7 @@ static int lfsr_mtree_traversal_next(lfs_t *lfs,
// found a new mroot
if (err != LFS_ERR_NOENT && tag == LFSR_TAG_MROOT) {
err = lfsr_data_readmdir(lfs, &data, traversal->mdir.u.m.blocks);
err = lfsr_data_readmblocks(lfs, &data, traversal->mdir.u.m.blocks);
if (err) {
return err;
}
@@ -6145,7 +6140,7 @@ static int lfsr_mtree_traversal_next(lfs_t *lfs,
// fetch mdir if we're on a leaf
} else if (tag == LFSR_TAG_MDIR) {
err = lfsr_data_readmdir(lfs, &data, traversal->mdir.u.m.blocks);
err = lfsr_data_readmblocks(lfs, &data, traversal->mdir.u.m.blocks);
if (err) {
return err;
}
+1 -1
View File
@@ -4246,7 +4246,7 @@ code = '''
lfs_alloc_ack(&lfs);
uint8_t buffer[LFSR_MDIR_DSIZE];
lfs_ssize_t d = lfsr_mdir_todisk(&lfs, LFSR_MROOTANCHOR, buffer);
lfs_ssize_t d = lfsr_mblocks_todisk(&lfs, LFSR_MBLOCKS_MROOTANCHOR, buffer);
assert(d >= 0);
lfsr_mdir_commit(&lfs, &lfs.mroot, LFSR_ATTRS(
LFSR_ATTR(-1, MROOT, 0, BUF(buffer, d)))) => 0;