Added lfsr_mdir_sync to help sync mdir state

Syncing mdirs got a bit awkward with the addition of the gcksumdelta, we
can't just copy the rbyd component. So added lfsr_mdir_sync to abstract
out the copying of any relevent mdir state.

Note this does _not_ include the mid, which may be different for
different files in the same mdir.

The code deduplication ended up saving a bit of code, which is nice:

           code          stack          ctx
  before: 38668           2648          644
  after:  38612 (-0.1%)   2648 (+0.0%)  644 (+0.0%)
This commit is contained in:
Christopher Haster
2025-01-17 17:28:15 -06:00
parent d93b24e998
commit fde3c537ea
+15 -17
View File
@@ -7092,6 +7092,12 @@ static inline bool lfsr_mdir_ismrootanchor(const lfsr_mdir_t *mdir) {
return lfsr_mptr_ismrootanchor(mdir->rbyd.blocks);
}
static inline void lfsr_mdir_sync(lfsr_mdir_t *a, const lfsr_mdir_t *b) {
// copy over everything but the mid
a->rbyd = b->rbyd;
a->gcksumdelta = b->gcksumdelta;
}
// mdir operations
static int lfsr_mdir_fetch(lfs_t *lfs, lfsr_mdir_t *mdir,
lfsr_smid_t mid, const lfs_block_t mptr[static 2]) {
@@ -7321,8 +7327,7 @@ static int lfsr_mtree_lookup(lfs_t *lfs, lfsr_smid_t mid,
// looking up mroot?
if (lfsr_mtree_isnull(&lfs->mtree)) {
mdir_->mid = mid;
mdir_->rbyd = lfs->mroot.rbyd;
mdir_->gcksumdelta = lfs->mroot.gcksumdelta;
lfsr_mdir_sync(mdir_, &lfs->mroot);
return 0;
// looking up direct mdir?
@@ -8342,8 +8347,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
// keep track of any mroot changes
lfsr_mdir_t mroot_ = lfs->mroot;
if (!err && lfsr_mdir_cmp(mdir, &lfs->mroot) == 0) {
mroot_.rbyd = mdir_[0].rbyd;
mroot_.gcksumdelta = mdir_[0].gcksumdelta;
lfsr_mdir_sync(&mroot_, &mdir_[0]);
}
// handle possible mtree updates, this gets a bit messy
@@ -8442,8 +8446,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
LFS_DEBUG("Dropping mdir %"PRId32" 0x{%"PRIx32",%"PRIx32"}",
mdir_[0].mid >> lfs->mdir_bits,
mdir_[0].rbyd.blocks[0], mdir_[0].rbyd.blocks[1]);
mdir_[0].rbyd = mdir_[1].rbyd;
mdir_[0].gcksumdelta = mdir_[1].gcksumdelta;
lfsr_mdir_sync(&mdir_[0], &mdir_[1]);
goto relocated;
// other sibling reduced to zero
@@ -8869,11 +8872,9 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
&& lfsr_mid_rid(lfs, o->mdir.mid)
>= (lfsr_srid_t)mdir_[0].rbyd.weight) {
o->mdir.mid += (1 << lfs->mdir_bits) - mdir_[0].rbyd.weight;
o->mdir.rbyd = mdir_[1].rbyd;
o->mdir.gcksumdelta = mdir_[1].gcksumdelta;
lfsr_mdir_sync(&o->mdir, &mdir_[1]);
} else {
o->mdir.rbyd = mdir_[0].rbyd;
o->mdir.gcksumdelta = mdir_[0].gcksumdelta;
lfsr_mdir_sync(&o->mdir, &mdir_[0]);
}
} else if (o->mdir.mid > mdir->mid) {
o->mdir.mid += mdelta;
@@ -8883,21 +8884,18 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
// update mdir to follow requested rid
if (mdelta > 0
&& mdir->mid == -1) {
mdir->rbyd = mroot_.rbyd;
mdir->gcksumdelta = mroot_.gcksumdelta;
lfsr_mdir_sync(mdir, &mroot_);
} else if (mdelta > 0
&& lfsr_mid_rid(lfs, mdir->mid)
>= (lfsr_srid_t)mdir_[0].rbyd.weight) {
mdir->mid += (1 << lfs->mdir_bits) - mdir_[0].rbyd.weight;
mdir->rbyd = mdir_[1].rbyd;
mdir->gcksumdelta = mdir_[1].gcksumdelta;
lfsr_mdir_sync(mdir, &mdir_[1]);
} else {
mdir->rbyd = mdir_[0].rbyd;
mdir->gcksumdelta = mdir_[0].gcksumdelta;
lfsr_mdir_sync(mdir, &mdir_[0]);
}
// update mroot and mtree
lfs->mroot = mroot_;
lfsr_mdir_sync(&lfs->mroot, &mroot_);
lfs->mtree = mtree_;
return 0;