From f191d25dcc7c68aedb20a2c17ef81877b15b5907 Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Tue, 9 Jul 2024 00:05:14 -0500 Subject: [PATCH] t: Tweaked mutation flags, made sure zombie flag is cleared lfsr_mdir_fixorphans always ends up setting the zombie flag, which is a bit annoying. If we don't clear the zombie flag, lfsr_remove/lfsr_rename may cause repeated mids during traversal, which probably won't break anything, but isn't great... Code changes: code stack before: 35480 2680 after: 35484 (+0.0%) 2680 (+0.0%) --- lfs.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/lfs.c b/lfs.c index a1af9d15..8939b707 100644 --- a/lfs.c +++ b/lfs.c @@ -8652,7 +8652,7 @@ static int lfsr_mtree_gc(lfs_t *lfs, lfsr_traversal_t *t, // lfsr_mtree_gc to work correctly LFS_ASSERT(lfsr_omdir_isopen(lfs, &t->o.o)); -again:; +dropped:; lfsr_tag_t tag; lfsr_bptr_t bptr; int err = lfsr_mtree_traverse(lfs, t, @@ -8661,8 +8661,8 @@ again:; return err; } - // keep track of dirty flag before mutation - bool dirty = t->o.o.flags & LFS_F_DIRTY; + // keep track of flags before mutation + uint16_t flags = t->o.o.flags; // mkconsistencing mdirs? if (lfsr_t_ismkconsistent(t->o.o.flags) @@ -8674,16 +8674,18 @@ again:; return err; } + // make sure we clear any zombie flags + t->o.o.flags &= ~LFS_F_ZOMBIE; + // did this drop our mdir? if (mdir->mid != -1 && mdir->rbyd.weight == 0) { - t->o.o.flags &= ~LFS_F_ZOMBIE; t->o.o.state = LFSR_TSTATE_MDIRS; // downgrade any new dirty flags t->o.o.flags |= (t->o.o.flags & LFS_F_DIRTY) ? LFS_F_MUTATED : 0; - t->o.o.flags &= ~LFS_F_DIRTY; - t->o.o.flags |= (dirty) ? LFS_F_DIRTY : 0; - goto again; + t->o.o.flags = (t->o.o.flags & ~LFS_F_DIRTY) + | (flags & LFS_F_DIRTY); + goto dropped; } } @@ -8790,8 +8792,8 @@ again:; // downgrade any new dirty flags t->o.o.flags |= (t->o.o.flags & LFS_F_DIRTY) ? LFS_F_MUTATED : 0; - t->o.o.flags &= ~LFS_F_DIRTY; - t->o.o.flags |= (dirty) ? LFS_F_DIRTY : 0; + t->o.o.flags = (t->o.o.flags & ~LFS_F_DIRTY) + | (flags & LFS_F_DIRTY); if (tag_) { *tag_ = tag; @@ -12931,8 +12933,8 @@ int lfsr_traversal_read(lfs_t *lfs, lfsr_traversal_t *t, lfsr_mid_rid(lfs, lfs->grm.mids[0])); } - // keep track of dirty flag before mutation - bool dirty = t->o.o.flags & LFS_F_DIRTY; + // keep track of flags before mutation + uint16_t flags = t->o.o.flags; int err = lfsr_fs_fixgrm(lfs); if (err) { @@ -12941,8 +12943,8 @@ int lfsr_traversal_read(lfs_t *lfs, lfsr_traversal_t *t, // downgrade any new dirty flags t->o.o.flags |= (t->o.o.flags & LFS_F_DIRTY) ? LFS_F_MUTATED : 0; - t->o.o.flags &= ~LFS_F_DIRTY; - t->o.o.flags |= (dirty) ? LFS_F_DIRTY : 0; + t->o.o.flags = (t->o.o.flags & ~LFS_F_DIRTY) + | (flags & LFS_F_DIRTY); } while (true) {