preerase: Added test_mount_t_preerase, fixed several more bugs

- Fixed lfs3_alloc_cansyncgbmap ignoring known window changes.

  Being able to just call lfs3_btree_cmp(b, b_p) would be nice, but this
  ignores known window changes!

  Fixed by comparing the on-disk encoding, which is heavy-handed, but
  probably the safest approach.

  lfs3_alloc_cansyncgbmap will probably never be on the stack hot-path,
  and the added code is roughly one function call. The main cost is
  CPU-cycles, but fortunately(?) that's not something we really care
  about?

- Fixed lfs3_allocclaim accidentally returning lfs3_mdir_commit's return
  value instead of the allocated block!

  Probably caused by a copy-paste, resulted in lfs3_allocclaim returning
  block 0, which is really not good!

- Fixed assert typo in lfs3_trv_open where we assert REVPERTURB in flags
  instead of lfs3->flags.

Code changes:

                    code          stack          ctx
  before:          35260           2136          660
  after:           35260 (+0.0%)   2136 (+0.0%)  660 (+0.0%)

                    code          stack          ctx
  gbmap before:    38560           2144          776
  gbmap after:     38616 (+0.1%)   2144 (+0.0%)  776 (+0.0%)

                    code          stack          ctx
  preerase before: 39168           2168          796
  preerase after:  39232 (+0.2%)   2168 (+0.0%)  796 (+0.0%)
This commit is contained in:
Christopher Haster
2026-01-03 01:18:54 -06:00
parent 35c09db971
commit 9bd44aec12
4 changed files with 227 additions and 20 deletions
+19 -3
View File
@@ -1772,15 +1772,28 @@ code = '''
lfs3_t lfs3;
lfs3_format(&lfs3,
LFS3_F_RDWR
// note preerasing needs revperturb
| ((PREERASE)
? LFS3_IFDEF_PREERASE(LFS3_F_REVPERTURB, -1)
: 0)
| ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0),
CFG) => 0;
lfs3_mount(&lfs3, LFS3_M_RDWR, CFG) => 0;
lfs3_mount(&lfs3,
LFS3_M_RDWR
// note preerasing needs revperturb
| ((PREERASE)
? LFS3_IFDEF_PREERASE(LFS3_M_REVPERTURB, -1)
: 0),
CFG) => 0;
// check flags before
struct lfs3_fsinfo fsinfo;
lfs3_fs_stat(&lfs3, &fsinfo) => 0;
assert(fsinfo.flags == (
LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0)
LFS3_IFYES_REVPERTURB(
LFS3_I_REVPERTURB,
(PREERASE) ? LFS3_I_REVPERTURB : 0,
0)
| LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0)
| LFS3_I_MKCONSISTENT
| ((!GBMAP) ? LFS3_I_LOOKAHEAD : 0)
@@ -1821,7 +1834,10 @@ code = '''
// check flags after
lfs3_fs_stat(&lfs3, &fsinfo) => 0;
assert(fsinfo.flags == (
LFS3_IFYES_REVPERTURB(LFS3_I_REVPERTURB, 0, 0)
LFS3_IFYES_REVPERTURB(
LFS3_I_REVPERTURB,
(PREERASE) ? LFS3_I_REVPERTURB : 0,
0)
| LFS3_IFYES_REVNOISE(LFS3_I_REVNOISE, 0, 0)
| ((!MKCONSISTENT) ? LFS3_I_MKCONSISTENT : 0)
| ((!LOOKAHEAD && !GBMAP) ? LFS3_I_LOOKAHEAD : 0)