Dropped msprouts/single mptr representation
I mean, what does the single mptr representation get us anyways?
A slightly smaller filesystem when metadata doesn't _quite_ fit in the
mroot, but fits in a single mdir? The only difference between the two is
the filesystem config, which really shouldn't be _that_ large:
mmoss: msprout: mtree:
.--------. .--------. .--------.
.| mroot | .| mroot | .| mroot |
|| config | || config | || config |
|| dir / | || mptr | || mptr |
|'--------' |'---|----' |'---|----'
'--------' '----|---' '----|---'
v v
.--------. .--------.
.| mdir | | mtree |
|| mptr | | mptr |
|| | | | |
|'--------' '---|----'
'--------' v
.--------.
.| mdir |
|| mptr |
|| |
|'--------'
'--------'
Unlike the theoretical mshrub representation, which we've already given
up on, msprouts _don't_ require a significant code cost to implement.
But if they offer little value, why keep them around? Every code cost is
code cost.
---
This drops msprout support, saving a bit of code:
code stack ctx
before: 38508 2624 640
after: 38340 (-0.4%) 2624 (+0.0%) 640 (+0.0%)
This also clears the LFSR_RCOMPAT_MSPROUT flag, allowing for msprouts to
be possibly reintroduced in the future.
But I don't really see any motivation for msprouts, even if you don't
care about code size, so I suspect this will just be a dead bit from now
on...
This commit is contained in:
@@ -7475,8 +7475,6 @@ static inline int lfsr_mtree_cmp(
|
|||||||
return a->u.weight - b->u.weight;
|
return a->u.weight - b->u.weight;
|
||||||
} else if (lfsr_mtree_isnull(a)) {
|
} else if (lfsr_mtree_isnull(a)) {
|
||||||
return 0;
|
return 0;
|
||||||
} else if (lfsr_mtree_ismptr(a)) {
|
|
||||||
return lfsr_mptr_cmp(a->u.mptr.blocks, b->u.mptr.blocks);
|
|
||||||
} else {
|
} else {
|
||||||
return lfsr_btree_cmp(&a->u.btree, &b->u.btree);
|
return lfsr_btree_cmp(&a->u.btree, &b->u.btree);
|
||||||
}
|
}
|
||||||
@@ -7504,11 +7502,6 @@ static int lfsr_mtree_lookup(lfs_t *lfs, lfsr_smid_t mid,
|
|||||||
lfsr_mdir_sync(mdir_, &lfs->mroot);
|
lfsr_mdir_sync(mdir_, &lfs->mroot);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
// looking up direct mdir?
|
|
||||||
} else if (lfsr_mtree_ismptr(&lfs->mtree)) {
|
|
||||||
// fetch mdir
|
|
||||||
return lfsr_mdir_fetch(lfs, mdir_, mid, lfs->mtree.u.mptr.blocks);
|
|
||||||
|
|
||||||
// look up mdir in actual mtree
|
// look up mdir in actual mtree
|
||||||
} else {
|
} else {
|
||||||
lfsr_bid_t bid;
|
lfsr_bid_t bid;
|
||||||
@@ -8636,7 +8629,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// new mtree?
|
// new mtree?
|
||||||
if (lfsr_mtree_ismptr(&lfs->mtree)) {
|
if (lfsr_mtree_weight_(&lfs->mtree) == 0) {
|
||||||
lfsr_btree_init(&mtree_.u.btree);
|
lfsr_btree_init(&mtree_.u.btree);
|
||||||
|
|
||||||
uint8_t mdir_buf[2*LFSR_MPTR_DSIZE];
|
uint8_t mdir_buf[2*LFSR_MPTR_DSIZE];
|
||||||
@@ -8702,9 +8695,8 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
|
|||||||
dropped:;
|
dropped:;
|
||||||
mdelta = -(1 << lfs->mdir_bits);
|
mdelta = -(1 << lfs->mdir_bits);
|
||||||
|
|
||||||
// we should never drop a direct mdir, because we always have our
|
// how can we drop if we have no mtree?
|
||||||
// root bookmark
|
LFS_ASSERT(lfsr_mtree_weight_(&lfs->mtree) != 0);
|
||||||
LFS_ASSERT(!lfsr_mtree_ismptr(&lfs->mtree));
|
|
||||||
|
|
||||||
// mark as unerased in case of failure
|
// mark as unerased in case of failure
|
||||||
lfs->mtree.u.btree.eoff = -1;
|
lfs->mtree.u.btree.eoff = -1;
|
||||||
@@ -8730,16 +8722,26 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
|
|||||||
|
|
||||||
relocated:;
|
relocated:;
|
||||||
// new mtree?
|
// new mtree?
|
||||||
if (lfsr_mtree_ismptr(&lfs->mtree)) {
|
if (lfsr_mtree_weight_(&lfs->mtree) == 0) {
|
||||||
lfsr_mtree_frommptr(&mtree_,
|
lfsr_btree_init(&mtree_.u.btree);
|
||||||
mdir_[0].rbyd.blocks,
|
|
||||||
1 << lfs->mdir_bits);
|
|
||||||
|
|
||||||
|
uint8_t mdir_buf[LFSR_MPTR_DSIZE];
|
||||||
|
err = lfsr_btree_commit(lfs, &mtree_.u.btree,
|
||||||
|
0, LFSR_RATS(
|
||||||
|
LFSR_RAT(
|
||||||
|
LFSR_TAG_MDIR, +(1 << lfs->mdir_bits),
|
||||||
|
LFSR_DATA_MPTR(
|
||||||
|
mdir_[0].rbyd.blocks,
|
||||||
|
mdir_buf))));
|
||||||
|
if (err) {
|
||||||
|
goto failed;
|
||||||
|
}
|
||||||
|
|
||||||
|
// update our mtree
|
||||||
} else {
|
} else {
|
||||||
// mark as unerased in case of failure
|
// mark as unerased in case of failure
|
||||||
lfs->mtree.u.btree.eoff = -1;
|
lfs->mtree.u.btree.eoff = -1;
|
||||||
|
|
||||||
// update our mtree
|
|
||||||
uint8_t mdir_buf[LFSR_MPTR_DSIZE];
|
uint8_t mdir_buf[LFSR_MPTR_DSIZE];
|
||||||
err = lfsr_btree_commit(lfs, &mtree_.u.btree,
|
err = lfsr_btree_commit(lfs, &mtree_.u.btree,
|
||||||
lfsr_mid_bid(lfs, mdir->mid), LFSR_RATS(
|
lfsr_mid_bid(lfs, mdir->mid), LFSR_RATS(
|
||||||
@@ -8801,11 +8803,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
|
|||||||
uint8_t mtree_buf[LFS_MAX(LFSR_MPTR_DSIZE, LFSR_BTREE_DSIZE)];
|
uint8_t mtree_buf[LFS_MAX(LFSR_MPTR_DSIZE, LFSR_BTREE_DSIZE)];
|
||||||
err = lfsr_mdir_commit_(lfs, &mroot_, -2, 0, NULL,
|
err = lfsr_mdir_commit_(lfs, &mroot_, -2, 0, NULL,
|
||||||
-1, LFSR_RATS(
|
-1, LFSR_RATS(
|
||||||
(lfsr_mtree_ismptr(&mtree_))
|
LFSR_RAT(
|
||||||
? LFSR_RAT(
|
|
||||||
LFSR_TAG_SUB | LFSR_TAG_MDIR, 0,
|
|
||||||
LFSR_DATA_MPTR(mtree_.u.mptr.blocks, mtree_buf))
|
|
||||||
: LFSR_RAT(
|
|
||||||
LFSR_TAG_SUB | LFSR_TAG_MTREE, 0,
|
LFSR_TAG_SUB | LFSR_TAG_MTREE, 0,
|
||||||
LFSR_DATA_BTREE(&mtree_.u.btree, mtree_buf)),
|
LFSR_DATA_BTREE(&mtree_.u.btree, mtree_buf)),
|
||||||
// were we committing to the mroot? include any -1 rats
|
// were we committing to the mroot? include any -1 rats
|
||||||
@@ -9128,13 +9126,6 @@ static int lfsr_mtree_namelookup(lfs_t *lfs,
|
|||||||
// treat inlined mdir as mid=0
|
// treat inlined mdir as mid=0
|
||||||
mdir.mid = 0;
|
mdir.mid = 0;
|
||||||
|
|
||||||
// direct mdir?
|
|
||||||
} else if (lfsr_mtree_ismptr(&lfs->mtree)) {
|
|
||||||
int err = lfsr_mdir_fetch(lfs, &mdir, 0, lfs->mtree.u.mptr.blocks);
|
|
||||||
if (err) {
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
// lookup name in actual mtree
|
// lookup name in actual mtree
|
||||||
} else {
|
} else {
|
||||||
lfsr_bid_t bid;
|
lfsr_bid_t bid;
|
||||||
@@ -9404,7 +9395,7 @@ static int lfsr_mtree_traverse_(lfs_t *lfs, lfsr_traversal_t *t,
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
// traverse the mroot chain, checking for mroot/mtree/mdir
|
// traverse the mroot chain, checking for mroots/mtrees
|
||||||
case LFSR_TSTATE_MROOTCHAIN:;
|
case LFSR_TSTATE_MROOTCHAIN:;
|
||||||
// lookup mroot, if we find one this is not the active mroot
|
// lookup mroot, if we find one this is not the active mroot
|
||||||
lfsr_tag_t tag;
|
lfsr_tag_t tag;
|
||||||
@@ -9412,7 +9403,7 @@ static int lfsr_mtree_traverse_(lfs_t *lfs, lfsr_traversal_t *t,
|
|||||||
err = lfsr_mdir_sublookup(lfs, &t->o.o.mdir, LFSR_TAG_STRUCT,
|
err = lfsr_mdir_sublookup(lfs, &t->o.o.mdir, LFSR_TAG_STRUCT,
|
||||||
&tag, &data);
|
&tag, &data);
|
||||||
if (err) {
|
if (err) {
|
||||||
// if we have no mtree/mdir (inlined mdir), we need to
|
// if we have no mtree (inlined mdir), we need to
|
||||||
// traverse any files in our mroot next
|
// traverse any files in our mroot next
|
||||||
if (err == LFS_ERR_NOENT) {
|
if (err == LFS_ERR_NOENT) {
|
||||||
t->o.o.mdir.mid = 0;
|
t->o.o.mdir.mid = 0;
|
||||||
@@ -9463,27 +9454,6 @@ static int lfsr_mtree_traverse_(lfs_t *lfs, lfsr_traversal_t *t,
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
// found an mdir?
|
|
||||||
} else if (tag == LFSR_TAG_MDIR) {
|
|
||||||
// fetch this mdir
|
|
||||||
err = lfsr_data_fetchmdir(lfs, &data, 0,
|
|
||||||
&t->o.o.mdir);
|
|
||||||
if (err) {
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
// transition to traversing the mdir
|
|
||||||
t->o.o.flags = lfsr_t_settstate(t->o.o.flags,
|
|
||||||
LFSR_TSTATE_MDIR);
|
|
||||||
|
|
||||||
if (tag_) {
|
|
||||||
*tag_ = LFSR_TAG_MDIR;
|
|
||||||
}
|
|
||||||
if (bptr_) {
|
|
||||||
bptr_->data.u.buffer = (const uint8_t*)&t->o.o.mdir;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
// found an mtree?
|
// found an mtree?
|
||||||
} else if (tag == LFSR_TAG_MTREE) {
|
} else if (tag == LFSR_TAG_MTREE) {
|
||||||
// fetch the root of the mtree
|
// fetch the root of the mtree
|
||||||
@@ -13745,7 +13715,6 @@ static int lfs_deinit(lfs_t *lfs) {
|
|||||||
#define LFSR_RCOMPAT_COMPAT \
|
#define LFSR_RCOMPAT_COMPAT \
|
||||||
(LFSR_RCOMPAT_GRM \
|
(LFSR_RCOMPAT_GRM \
|
||||||
| LFSR_RCOMPAT_MMOSS \
|
| LFSR_RCOMPAT_MMOSS \
|
||||||
| LFSR_RCOMPAT_MSPROUT \
|
|
||||||
| LFSR_RCOMPAT_MTREE \
|
| LFSR_RCOMPAT_MTREE \
|
||||||
| LFSR_RCOMPAT_BMOSS \
|
| LFSR_RCOMPAT_BMOSS \
|
||||||
| LFSR_RCOMPAT_BSPROUT \
|
| LFSR_RCOMPAT_BSPROUT \
|
||||||
@@ -14148,14 +14117,6 @@ static int lfsr_mountinited(lfs_t *lfs) {
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
|
||||||
// found a direct mdir? keep track of this
|
|
||||||
if (lfsr_mtree_isnull(&lfs->mtree)) {
|
|
||||||
lfsr_mtree_frommptr(&lfs->mtree,
|
|
||||||
mdir->rbyd.blocks,
|
|
||||||
1 << lfs->mdir_bits);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// build gcksum out of mdir cksums
|
// build gcksum out of mdir cksums
|
||||||
|
|||||||
Reference in New Issue
Block a user