t: Rerouted lfsr_fs_mkconsistent through LFS_T_MKCONSISTENT
The hope here was that deduplicating the lfsr_fs_fixorphans/
lfsr_mtree_gc mtree traversal would result in code savings since we'd
end up with one shared code path.
Unfortunately in practice this didn't work out:
code stack
before: 35484 2680
after: 35504 (+0.1%) 2680 (+0.0%)
Still, it is nice to have one shared code path, because that means fewer
corner cases that could break.
This commit is contained in:
@@ -8648,10 +8648,6 @@ static int lfsr_mdir_fixorphans(lfs_t *lfs, lfsr_mdir_t *mdir);
|
|||||||
// mutation here, upper layers should call lfs_alloc_ckpoint as needed
|
// mutation here, upper layers should call lfs_alloc_ckpoint as needed
|
||||||
static int lfsr_mtree_gc(lfs_t *lfs, lfsr_traversal_t *t,
|
static int lfsr_mtree_gc(lfs_t *lfs, lfsr_traversal_t *t,
|
||||||
lfsr_tag_t *tag_, lfsr_bptr_t *bptr_) {
|
lfsr_tag_t *tag_, lfsr_bptr_t *bptr_) {
|
||||||
// traversals need to be enrolled in our opened list for
|
|
||||||
// lfsr_mtree_gc to work correctly
|
|
||||||
LFS_ASSERT(lfsr_omdir_isopen(lfs, &t->o.o));
|
|
||||||
|
|
||||||
dropped:;
|
dropped:;
|
||||||
lfsr_tag_t tag;
|
lfsr_tag_t tag;
|
||||||
lfsr_bptr_t bptr;
|
lfsr_bptr_t bptr;
|
||||||
@@ -8733,6 +8729,10 @@ dropped:;
|
|||||||
? lfs->cfg->gc_compact_thresh
|
? lfs->cfg->gc_compact_thresh
|
||||||
: lfs->cfg->block_size - lfs->cfg->block_size/8);
|
: lfs->cfg->block_size - lfs->cfg->block_size/8);
|
||||||
|
|
||||||
|
// traversals need to be enrolled in our opened list for btree
|
||||||
|
// compactions to work correctly
|
||||||
|
LFS_ASSERT(lfsr_omdir_isopen(lfs, &t->o.o));
|
||||||
|
|
||||||
if (t->o.o.state == LFSR_TSTATE_MTREE) {
|
if (t->o.o.state == LFSR_TSTATE_MTREE) {
|
||||||
int err = lfsr_btree_compact_(lfs, &t->o.bshrub.u.btree,
|
int err = lfsr_btree_compact_(lfs, &t->o.bshrub.u.btree,
|
||||||
// note we may be referencing the btree root here
|
// note we may be referencing the btree root here
|
||||||
@@ -12750,30 +12750,18 @@ failed:;
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int lfsr_fs_fixorphans(lfs_t *lfs) {
|
static int lfsr_fs_fixorphans(lfs_t *lfs) {
|
||||||
// iterate through the filesystem and remove any orphaned files
|
// LFS_T_MKCONSISTENT really just removes orphans
|
||||||
//
|
lfsr_traversal_t t = LFSR_TRAVERSAL(
|
||||||
// note this never takes longer than lfsr_mount
|
LFS_T_MTREEONLY | LFS_T_MKCONSISTENT);
|
||||||
//
|
while (true) {
|
||||||
lfsr_mid_t mid = 0;
|
int err = lfsr_mtree_gc(lfs, &t,
|
||||||
while (mid < lfsr_mtree_weight(lfs)) {
|
NULL, NULL);
|
||||||
lfsr_mdir_t mdir;
|
|
||||||
int err = lfsr_mtree_lookup(lfs, mid,
|
|
||||||
&mdir);
|
|
||||||
if (err) {
|
if (err) {
|
||||||
LFS_ASSERT(err != LFS_ERR_NOENT);
|
if (err == LFS_ERR_NOENT) {
|
||||||
return err;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// clean up orphans
|
|
||||||
err = lfsr_mdir_fixorphans(lfs, &mdir);
|
|
||||||
if (err) {
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
// incremend mid unless we dropped the mdir
|
|
||||||
if (mdir.rbyd.weight > 0) {
|
|
||||||
mid += 1 << lfs->mdir_bits;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// done, no more orphans
|
// done, no more orphans
|
||||||
|
|||||||
Reference in New Issue
Block a user