t: Moved some stuff around in lfsr_mtree_gc

Nothing consequential.

One interesting question is if we should swap our dirty bits during the
call to lfsr_mtree_traverse. At the moment I think limiting this to just
our lfsr_mtree_gc logic will create the least surprise in the future.

Code changes minimal:

           code          stack
  before: 36288           2704
  after:  36284 (-0.0%)   2704 (+0.0%)
This commit is contained in:
Christopher Haster
2024-07-19 17:51:12 -05:00
parent 46488ebc7f
commit fb3c0daa0a
+20 -21
View File
@@ -8680,9 +8680,6 @@ static void lfs_alloc_markfree(lfs_t *lfs);
// 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_) {
// swap dirty/mutated flags while in lfsr_mtree_gc
t->o.o.flags = lfsr_f_swapdirty(t->o.o.flags);
dropped:; dropped:;
lfsr_tag_t tag; lfsr_tag_t tag;
lfsr_bptr_t bptr; lfsr_bptr_t bptr;
@@ -8696,6 +8693,14 @@ dropped:;
goto failed; goto failed;
} }
// swap dirty/mutated flags while in lfsr_mtree_gc
t->o.o.flags = lfsr_f_swapdirty(t->o.o.flags);
// track in-use blocks?
if (lfsr_t_islookahead(t->o.o.flags)) {
lfs_alloc_markinuse(lfs, tag, &bptr);
}
// mkconsistencing mdirs? // mkconsistencing mdirs?
if (lfsr_t_ismkconsistent(t->o.o.flags) if (lfsr_t_ismkconsistent(t->o.o.flags)
&& tag == LFSR_TAG_MDIR && tag == LFSR_TAG_MDIR
@@ -8711,16 +8716,14 @@ dropped:;
// did this drop our mdir? // did this drop our mdir?
if (mdir->mid != -1 && mdir->rbyd.weight == 0) { if (mdir->mid != -1 && mdir->rbyd.weight == 0) {
// swap back dirty/mutated flags
t->o.o.flags = lfsr_f_swapdirty(t->o.o.flags);
// continue traversal
t->o.o.state = LFSR_TSTATE_MDIRS; t->o.o.state = LFSR_TSTATE_MDIRS;
goto dropped; goto dropped;
} }
} }
// track in-use blocks?
if (lfsr_t_islookahead(t->o.o.flags)) {
lfs_alloc_markinuse(lfs, tag, &bptr);
}
// compacting mdirs? // compacting mdirs?
if (lfsr_t_iscompact(t->o.o.flags) if (lfsr_t_iscompact(t->o.o.flags)
&& tag == LFSR_TAG_MDIR && tag == LFSR_TAG_MDIR
@@ -8838,7 +8841,6 @@ dropped:;
// swap back dirty/mutated flags // swap back dirty/mutated flags
t->o.o.flags = lfsr_f_swapdirty(t->o.o.flags); t->o.o.flags = lfsr_f_swapdirty(t->o.o.flags);
if (tag_) { if (tag_) {
*tag_ = tag; *tag_ = tag;
} }
@@ -8847,16 +8849,12 @@ dropped:;
} }
return 0; return 0;
eot:; failed:;
// swap back dirty/mutated flags // swap back dirty/mutated flags
t->o.o.flags = lfsr_f_swapdirty(t->o.o.flags); t->o.o.flags = lfsr_f_swapdirty(t->o.o.flags);
return err;
// was mkconsistent successful? eot:;
if (lfsr_t_ismkconsistent(t->o.o.flags)
&& !lfsr_f_isdirty(t->o.o.flags)) {
lfs->flags &= ~LFS_F_ORPHANS;
}
// was lookahead scan successful? // was lookahead scan successful?
if (lfsr_t_islookahead(t->o.o.flags) if (lfsr_t_islookahead(t->o.o.flags)
&& !lfsr_f_isdirty(t->o.o.flags) && !lfsr_f_isdirty(t->o.o.flags)
@@ -8864,6 +8862,12 @@ eot:;
lfs_alloc_markfree(lfs); lfs_alloc_markfree(lfs);
} }
// was mkconsistent successful?
if (lfsr_t_ismkconsistent(t->o.o.flags)
&& !lfsr_f_isdirty(t->o.o.flags)) {
lfs->flags &= ~LFS_F_ORPHANS;
}
// was compaction successful? note we may need multiple passes if // was compaction successful? note we may need multiple passes if
// we want to be sure everything is compacted // we want to be sure everything is compacted
if (lfsr_t_iscompact(t->o.o.flags) if (lfsr_t_iscompact(t->o.o.flags)
@@ -8873,11 +8877,6 @@ eot:;
} }
return LFS_ERR_NOENT; return LFS_ERR_NOENT;
failed:;
// swap back dirty/mutated flags
t->o.o.flags = lfsr_f_swapdirty(t->o.o.flags);
return err;
} }