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%)
This commit is contained in:
@@ -8652,7 +8652,7 @@ static int lfsr_mtree_gc(lfs_t *lfs, lfsr_traversal_t *t,
|
|||||||
// lfsr_mtree_gc to work correctly
|
// lfsr_mtree_gc to work correctly
|
||||||
LFS_ASSERT(lfsr_omdir_isopen(lfs, &t->o.o));
|
LFS_ASSERT(lfsr_omdir_isopen(lfs, &t->o.o));
|
||||||
|
|
||||||
again:;
|
dropped:;
|
||||||
lfsr_tag_t tag;
|
lfsr_tag_t tag;
|
||||||
lfsr_bptr_t bptr;
|
lfsr_bptr_t bptr;
|
||||||
int err = lfsr_mtree_traverse(lfs, t,
|
int err = lfsr_mtree_traverse(lfs, t,
|
||||||
@@ -8661,8 +8661,8 @@ again:;
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
// keep track of dirty flag before mutation
|
// keep track of flags before mutation
|
||||||
bool dirty = t->o.o.flags & LFS_F_DIRTY;
|
uint16_t flags = t->o.o.flags;
|
||||||
|
|
||||||
// mkconsistencing mdirs?
|
// mkconsistencing mdirs?
|
||||||
if (lfsr_t_ismkconsistent(t->o.o.flags)
|
if (lfsr_t_ismkconsistent(t->o.o.flags)
|
||||||
@@ -8674,16 +8674,18 @@ again:;
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// make sure we clear any zombie flags
|
||||||
|
t->o.o.flags &= ~LFS_F_ZOMBIE;
|
||||||
|
|
||||||
// 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) {
|
||||||
t->o.o.flags &= ~LFS_F_ZOMBIE;
|
|
||||||
t->o.o.state = LFSR_TSTATE_MDIRS;
|
t->o.o.state = LFSR_TSTATE_MDIRS;
|
||||||
|
|
||||||
// downgrade any new dirty flags
|
// downgrade any new dirty flags
|
||||||
t->o.o.flags |= (t->o.o.flags & LFS_F_DIRTY) ? LFS_F_MUTATED : 0;
|
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 = (t->o.o.flags & ~LFS_F_DIRTY)
|
||||||
t->o.o.flags |= (dirty) ? LFS_F_DIRTY : 0;
|
| (flags & LFS_F_DIRTY);
|
||||||
goto again;
|
goto dropped;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -8790,8 +8792,8 @@ again:;
|
|||||||
|
|
||||||
// downgrade any new dirty flags
|
// downgrade any new dirty flags
|
||||||
t->o.o.flags |= (t->o.o.flags & LFS_F_DIRTY) ? LFS_F_MUTATED : 0;
|
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 = (t->o.o.flags & ~LFS_F_DIRTY)
|
||||||
t->o.o.flags |= (dirty) ? LFS_F_DIRTY : 0;
|
| (flags & LFS_F_DIRTY);
|
||||||
|
|
||||||
if (tag_) {
|
if (tag_) {
|
||||||
*tag_ = 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]));
|
lfsr_mid_rid(lfs, lfs->grm.mids[0]));
|
||||||
}
|
}
|
||||||
|
|
||||||
// keep track of dirty flag before mutation
|
// keep track of flags before mutation
|
||||||
bool dirty = t->o.o.flags & LFS_F_DIRTY;
|
uint16_t flags = t->o.o.flags;
|
||||||
|
|
||||||
int err = lfsr_fs_fixgrm(lfs);
|
int err = lfsr_fs_fixgrm(lfs);
|
||||||
if (err) {
|
if (err) {
|
||||||
@@ -12941,8 +12943,8 @@ int lfsr_traversal_read(lfs_t *lfs, lfsr_traversal_t *t,
|
|||||||
|
|
||||||
// downgrade any new dirty flags
|
// downgrade any new dirty flags
|
||||||
t->o.o.flags |= (t->o.o.flags & LFS_F_DIRTY) ? LFS_F_MUTATED : 0;
|
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 = (t->o.o.flags & ~LFS_F_DIRTY)
|
||||||
t->o.o.flags |= (dirty) ? LFS_F_DIRTY : 0;
|
| (flags & LFS_F_DIRTY);
|
||||||
}
|
}
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
|
|||||||
Reference in New Issue
Block a user