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 /// /// Metadata pair operations ///
// the mroot anchor, mdir 0x{0,1} is the entry point into the filesystem // 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( static inline int lfsr_mblocks_cmp(
const lfs_block_t a[static 2], 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) // 2 leb128 => 10 bytes (worst case)
#define LFSR_MDIR_DSIZE (5+5) #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], const lfs_block_t blocks[static 2],
uint8_t buffer[static LFSR_MDIR_DSIZE]) { uint8_t buffer[static LFSR_MDIR_DSIZE]) {
(void)lfs; (void)lfs;
@@ -4523,7 +4523,7 @@ static lfs_ssize_t lfsr_mdir_todisk(lfs_t *lfs,
return d; 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]) { lfs_block_t blocks[static 2]) {
for (int i = 0; i < 2; i++) { for (int i = 0; i < 2; i++) {
int err = lfsr_data_readleb128(lfs, data, (int32_t*)&blocks[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); LFS_ASSERT(tag == LFSR_TAG_MDIR);
// decode 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) { if (err) {
return 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 // scan list of mroots for our requested pair
lfs_block_t blocks_[2] = { lfs_block_t blocks_[2] = {
LFSR_MROOTANCHOR[0], LFSR_MBLOCKS_MROOTANCHOR[0],
LFSR_MROOTANCHOR[1]}; LFSR_MBLOCKS_MROOTANCHOR[1]};
while (true) { while (true) {
// fetch next possible superblock // fetch next possible superblock
lfsr_mdir_t mdir; 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 // decode mdir
err = lfsr_data_readmdir(lfs, &data, blocks_); err = lfsr_data_readmblocks(lfs, &data, blocks_);
if (err) { if (err) {
return 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]; 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); mdir_.u.m.blocks, mdir_buf);
if (mdir_dsize < 0) { if (mdir_dsize < 0) {
return mdir_dsize; return mdir_dsize;
} }
uint8_t msibling_buf[LFSR_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); msibling_.u.m.blocks, msibling_buf);
if (msibling_dsize < 0) { if (msibling_dsize < 0) {
return msibling_dsize; return msibling_dsize;
@@ -5370,7 +5370,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
relocate:; relocate:;
// update our mtree // update our mtree
uint8_t mdir_buf[LFSR_MDIR_DSIZE]; 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); mdir_.u.m.blocks, mdir_buf);
if (mdir_dsize < 0) { if (mdir_dsize < 0) {
return mdir_dsize; 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 // need to update mroot? tail recurse, updating mroots until a commit sticks
lfsr_mdir_t mchildroot = lfs->mroot; 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) { while (dirtymroot) {
lfsr_mdir_t mparentroot; lfsr_mdir_t mparentroot_;
int err = lfsr_mtree_parent(lfs, mchildroot.u.m.blocks, int err = lfsr_mtree_parent(lfs, mchildroot.u.m.blocks, &mparentroot_);
&mparentroot);
if (err && err != LFS_ERR_NOENT) { if (err && err != LFS_ERR_NOENT) {
return err; 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"} " LFS_DEBUG("Relocating 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 // commit mrootchild
uint8_t mchildroot_buf[LFSR_MDIR_DSIZE]; uint8_t mchildroot_buf[LFSR_MDIR_DSIZE];
lfs_ssize_t mchildroot_dsize = lfsr_mdir_todisk(lfs, lfs_ssize_t mchildroot_dsize = lfsr_mblocks_todisk(lfs,
mchildroot_, mchildroot_buf); mchildroot_.u.m.blocks, mchildroot_buf);
if (mchildroot_dsize < 0) { if (mchildroot_dsize < 0) {
return mchildroot_dsize; return mchildroot_dsize;
} }
mchildroot = mparentroot; mchildroot = mparentroot_;
err = lfsr_mdir_commit_(lfs, &mparentroot, -1, -1, NULL, LFSR_ATTRS( err = lfsr_mdir_commit_(lfs, &mparentroot_, -1, -1, NULL, LFSR_ATTRS(
LFSR_ATTR(-1, LFSR_ATTR(-1,
MROOT, 0, BUF(mchildroot_buf, mchildroot_dsize)))); MROOT, 0, BUF(mchildroot_buf, mchildroot_dsize))));
if (err) { if (err) {
@@ -5516,36 +5515,32 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
return err; return err;
} }
mchildroot_[0] = mparentroot.u.m.blocks[0]; mchildroot_ = mparentroot_;
mchildroot_[1] = mparentroot.u.m.blocks[1]; dirtymroot = (lfsr_mdir_cmp(&mchildroot_, &mchildroot) != 0);
dirtymroot = (lfsr_mblocks_cmp(
mchildroot.u.m.blocks,
mchildroot_) != 0);
} }
// uh oh, we ran out of mrootparents, need to extend mroot chain // uh oh, we ran out of mrootparents, need to extend mroot chain
if (dirtymroot) { if (dirtymroot) {
// mchildroot should be our initial mroot at this point // mchildroot should be our initial mroot at this point
LFS_ASSERT(lfsr_mdir_ismrootanchor(&mchildroot)); LFS_ASSERT(lfsr_mdir_ismrootanchor(&mchildroot));
LFS_DEBUG("Extending mroot 0x{%"PRIx32",%"PRIx32"}" LFS_DEBUG("Extending mroot 0x{%"PRIx32",%"PRIx32"}"
" -> 0x{%"PRIx32",%"PRIx32"}" " -> 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.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 // commit mrootchild
uint8_t mchildroot_buf[LFSR_MDIR_DSIZE]; uint8_t mchildroot_buf[LFSR_MDIR_DSIZE];
lfs_ssize_t mchildroot_dsize = lfsr_mdir_todisk(lfs, mchildroot_, lfs_ssize_t mchildroot_dsize = lfsr_mblocks_todisk(lfs,
mchildroot_buf); mchildroot_.u.m.blocks, mchildroot_buf);
if (mchildroot_dsize < 0) { if (mchildroot_dsize < 0) {
return mchildroot_dsize; return mchildroot_dsize;
} }
// compact into mparentroot, this should stay our mroot anchor // compact into mparentroot_, this should stay our mroot anchor
lfsr_mdir_t mparentroot; lfsr_mdir_t mparentroot_;
err = lfsr_mdir_swap(lfs, &mparentroot, &mchildroot, -1); err = lfsr_mdir_swap(lfs, &mparentroot_, &mchildroot, -1);
if (err) { if (err) {
return err; return err;
} }
@@ -5568,7 +5563,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
} }
// write the tag // write the tag
err = lfsr_rbyd_appendcompactattr(lfs, &mparentroot.u.r.rbyd, err = lfsr_rbyd_appendcompactattr(lfs, &mparentroot_.u.r.rbyd,
tag, weight, data); tag, weight, data);
if (err) { if (err) {
LFS_ASSERT(err != LFS_ERR_RANGE); 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) { if (err) {
LFS_ASSERT(err != LFS_ERR_RANGE); LFS_ASSERT(err != LFS_ERR_RANGE);
return err; return err;
} }
// and commit our new mroot // 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, LFSR_ATTR(-1,
WIDE(MROOT), 0, BUF(mchildroot_buf, mchildroot_dsize)))); WIDE(MROOT), 0, BUF(mchildroot_buf, mchildroot_dsize))));
if (err) { if (err) {
@@ -5753,7 +5748,7 @@ static int lfsr_mtree_namelookup(lfs_t *lfs,
LFS_ASSERT(weight == lfsr_mweight(lfs)); LFS_ASSERT(weight == lfsr_mweight(lfs));
// decode 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) { if (err) {
return err; return err;
} }
@@ -5968,7 +5963,7 @@ static int lfsr_mtree_traversal_next(lfs_t *lfs,
if (traversal->mdir.u.r.rbyd.trunk == 0) { if (traversal->mdir.u.r.rbyd.trunk == 0) {
// fetch the first mroot 0x{0,1} // fetch the first mroot 0x{0,1}
int err = lfsr_mdir_fetch(lfs, &traversal->mdir, int err = lfsr_mdir_fetch(lfs, &traversal->mdir,
-1, LFSR_MROOTANCHOR); -1, LFSR_MBLOCKS_MROOTANCHOR);
if (err) { if (err) {
return err; return err;
} }
@@ -5998,7 +5993,7 @@ static int lfsr_mtree_traversal_next(lfs_t *lfs,
// found a new mroot // found a new mroot
if (err != LFS_ERR_NOENT && tag == LFSR_TAG_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) { if (err) {
return err; return err;
} }
@@ -6145,7 +6140,7 @@ static int lfsr_mtree_traversal_next(lfs_t *lfs,
// fetch mdir if we're on a leaf // fetch mdir if we're on a leaf
} else if (tag == LFSR_TAG_MDIR) { } 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) { if (err) {
return err; return err;
} }
+1 -1
View File
@@ -4246,7 +4246,7 @@ code = '''
lfs_alloc_ack(&lfs); lfs_alloc_ack(&lfs);
uint8_t buffer[LFSR_MDIR_DSIZE]; 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); assert(d >= 0);
lfsr_mdir_commit(&lfs, &lfs.mroot, LFSR_ATTRS( lfsr_mdir_commit(&lfs, &lfs.mroot, LFSR_ATTRS(
LFSR_ATTR(-1, MROOT, 0, BUF(buffer, d)))) => 0; LFSR_ATTR(-1, MROOT, 0, BUF(buffer, d)))) => 0;