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:
@@ -7092,6 +7092,12 @@ static inline bool lfsr_mdir_ismrootanchor(const lfsr_mdir_t *mdir) {
|
|||||||
return lfsr_mptr_ismrootanchor(mdir->rbyd.blocks);
|
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
|
// mdir operations
|
||||||
static int lfsr_mdir_fetch(lfs_t *lfs, lfsr_mdir_t *mdir,
|
static int lfsr_mdir_fetch(lfs_t *lfs, lfsr_mdir_t *mdir,
|
||||||
lfsr_smid_t mid, const lfs_block_t mptr[static 2]) {
|
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?
|
// looking up mroot?
|
||||||
if (lfsr_mtree_isnull(&lfs->mtree)) {
|
if (lfsr_mtree_isnull(&lfs->mtree)) {
|
||||||
mdir_->mid = mid;
|
mdir_->mid = mid;
|
||||||
mdir_->rbyd = lfs->mroot.rbyd;
|
lfsr_mdir_sync(mdir_, &lfs->mroot);
|
||||||
mdir_->gcksumdelta = lfs->mroot.gcksumdelta;
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
// looking up direct mdir?
|
// 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
|
// keep track of any mroot changes
|
||||||
lfsr_mdir_t mroot_ = lfs->mroot;
|
lfsr_mdir_t mroot_ = lfs->mroot;
|
||||||
if (!err && lfsr_mdir_cmp(mdir, &lfs->mroot) == 0) {
|
if (!err && lfsr_mdir_cmp(mdir, &lfs->mroot) == 0) {
|
||||||
mroot_.rbyd = mdir_[0].rbyd;
|
lfsr_mdir_sync(&mroot_, &mdir_[0]);
|
||||||
mroot_.gcksumdelta = mdir_[0].gcksumdelta;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// handle possible mtree updates, this gets a bit messy
|
// 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"}",
|
LFS_DEBUG("Dropping mdir %"PRId32" 0x{%"PRIx32",%"PRIx32"}",
|
||||||
mdir_[0].mid >> lfs->mdir_bits,
|
mdir_[0].mid >> lfs->mdir_bits,
|
||||||
mdir_[0].rbyd.blocks[0], mdir_[0].rbyd.blocks[1]);
|
mdir_[0].rbyd.blocks[0], mdir_[0].rbyd.blocks[1]);
|
||||||
mdir_[0].rbyd = mdir_[1].rbyd;
|
lfsr_mdir_sync(&mdir_[0], &mdir_[1]);
|
||||||
mdir_[0].gcksumdelta = mdir_[1].gcksumdelta;
|
|
||||||
goto relocated;
|
goto relocated;
|
||||||
|
|
||||||
// other sibling reduced to zero
|
// 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_mid_rid(lfs, o->mdir.mid)
|
||||||
>= (lfsr_srid_t)mdir_[0].rbyd.weight) {
|
>= (lfsr_srid_t)mdir_[0].rbyd.weight) {
|
||||||
o->mdir.mid += (1 << lfs->mdir_bits) - mdir_[0].rbyd.weight;
|
o->mdir.mid += (1 << lfs->mdir_bits) - mdir_[0].rbyd.weight;
|
||||||
o->mdir.rbyd = mdir_[1].rbyd;
|
lfsr_mdir_sync(&o->mdir, &mdir_[1]);
|
||||||
o->mdir.gcksumdelta = mdir_[1].gcksumdelta;
|
|
||||||
} else {
|
} else {
|
||||||
o->mdir.rbyd = mdir_[0].rbyd;
|
lfsr_mdir_sync(&o->mdir, &mdir_[0]);
|
||||||
o->mdir.gcksumdelta = mdir_[0].gcksumdelta;
|
|
||||||
}
|
}
|
||||||
} else if (o->mdir.mid > mdir->mid) {
|
} else if (o->mdir.mid > mdir->mid) {
|
||||||
o->mdir.mid += mdelta;
|
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
|
// update mdir to follow requested rid
|
||||||
if (mdelta > 0
|
if (mdelta > 0
|
||||||
&& mdir->mid == -1) {
|
&& mdir->mid == -1) {
|
||||||
mdir->rbyd = mroot_.rbyd;
|
lfsr_mdir_sync(mdir, &mroot_);
|
||||||
mdir->gcksumdelta = mroot_.gcksumdelta;
|
|
||||||
} else if (mdelta > 0
|
} else if (mdelta > 0
|
||||||
&& lfsr_mid_rid(lfs, mdir->mid)
|
&& lfsr_mid_rid(lfs, mdir->mid)
|
||||||
>= (lfsr_srid_t)mdir_[0].rbyd.weight) {
|
>= (lfsr_srid_t)mdir_[0].rbyd.weight) {
|
||||||
mdir->mid += (1 << lfs->mdir_bits) - mdir_[0].rbyd.weight;
|
mdir->mid += (1 << lfs->mdir_bits) - mdir_[0].rbyd.weight;
|
||||||
mdir->rbyd = mdir_[1].rbyd;
|
lfsr_mdir_sync(mdir, &mdir_[1]);
|
||||||
mdir->gcksumdelta = mdir_[1].gcksumdelta;
|
|
||||||
} else {
|
} else {
|
||||||
mdir->rbyd = mdir_[0].rbyd;
|
lfsr_mdir_sync(mdir, &mdir_[0]);
|
||||||
mdir->gcksumdelta = mdir_[0].gcksumdelta;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// update mroot and mtree
|
// update mroot and mtree
|
||||||
lfs->mroot = mroot_;
|
lfsr_mdir_sync(&lfs->mroot, &mroot_);
|
||||||
lfs->mtree = mtree_;
|
lfs->mtree = mtree_;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user