Cleaned up post-file->leaf code a bit

Mostly adding convenience functions to deduplicate code:

- Adopted lfsr_bptr_claim
- Renamed lfsr_file_graft -> lfsr_file_graft_
- Adopted lfsr_file_graft
- Didn't bother with lfsr_file_discardleaf

This saves a bit of code, though not that much in the context of the
file->leaf code cost:

                      code          stack          ctx
  before cleanup:    37228           2328          636
  after:             37180 (-0.1%)   2360 (+1.4%)  636 (+0.0%)

                      code          stack          ctx
  before file->leaf: 36016           2296          636
  after:             37180 (+3.2%)   2360 (+2.8%)  636 (+0.0%)
This commit is contained in:
Christopher Haster
2025-05-21 22:16:08 -05:00
parent 9ed326f3d3
commit 1a567fb158
+57 -73
View File
@@ -2599,6 +2599,14 @@ static void lfsr_bptr_discard(lfsr_bptr_t *bptr) {
#endif
}
static void lfsr_bptr_claim(lfsr_bptr_t *bptr) {
#ifdef LFS_CKDATACKSUMS
bptr->data.u.disk.cksize &= ~LFSR_BPTR_ISERASED;
#else
bptr->cksize &= ~LFSR_BPTR_ISERASED;
#endif
}
static inline bool lfsr_bptr_isbptr(const lfsr_bptr_t *bptr) {
return bptr->data.size & LFSR_BPTR_ISBPTR;
}
@@ -9147,11 +9155,9 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
== ((lfsr_bshrub_t*)o)->shrub.blocks[0]
&& ((lfsr_bshrub_t*)o)->shrub_.blocks[0]
!= ((lfsr_bshrub_t*)o)->shrub.blocks[0]) {
// TODO lfsr_file_clobberleaf? discardleaf?
lfsr_file_t *file = (lfsr_file_t*)o;
file->leaf.pos = 0;
file->leaf.weight = 0;
lfsr_bptr_discard(&file->leaf.bptr);
((lfsr_file_t*)o)->leaf.pos = 0;
((lfsr_file_t*)o)->leaf.weight = 0;
lfsr_bptr_discard(&((lfsr_file_t*)o)->leaf.bptr);
}
// update the shrub
@@ -11878,7 +11884,7 @@ static int lfsr_file_commit(lfs_t *lfs, lfsr_file_t *file,
}
// TODO replace rattr with bptr + delta?
static int lfsr_file_graft(lfs_t *lfs, lfsr_file_t *file,
static int lfsr_file_graft_(lfs_t *lfs, lfsr_file_t *file,
lfs_off_t pos, lfs_off_t weight, lfsr_rattr_t rattr) {
// note! we must never allow our btree size to overflow, even
// temporarily
@@ -12131,17 +12137,40 @@ static int lfsr_file_graft(lfs_t *lfs, lfsr_file_t *file,
static int lfsr_file_graftcrystal(lfs_t *lfs, lfsr_file_t *file,
lfs_off_t pos, lfs_off_t weight, const lfsr_bptr_t *bptr) {
return lfsr_file_graft(lfs, file, pos, weight,
return lfsr_file_graft_(lfs, file, pos, weight,
LFSR_RATTR_BPTR(LFSR_TAG_BLOCK, 0, bptr));
}
static int lfsr_file_graftfragment(lfs_t *lfs, lfsr_file_t *file,
lfs_off_t pos, lfs_off_t weight,
const lfsr_data_t *datas, lfs_size_t data_count) {
return lfsr_file_graft(lfs, file, pos, weight,
return lfsr_file_graft_(lfs, file, pos, weight,
LFSR_RATTR_CAT_(LFSR_TAG_DATA, 0, datas, data_count));
}
static int lfsr_file_graft(lfs_t *lfs, lfsr_file_t *file) {
// do nothing if already grafted
if (!lfsr_o_isungraft(file->b.o.flags)) {
return 0;
}
// ungrafted files must be unsynced
LFS_ASSERT(lfsr_o_isunsync(file->b.o.flags));
// only blocks can be ungrafted
LFS_ASSERT(lfsr_bptr_isbptr(&file->leaf.bptr));
// graft our crystal
int err = lfsr_file_graftcrystal(lfs, file,
file->leaf.pos, file->leaf.weight,
&file->leaf.bptr);
if (err) {
return err;
}
// mark as grafted
file->b.o.flags &= ~LFS_o_UNGRAFT;
return 0;
}
static int lfsr_file_crystallize(lfs_t *lfs, lfsr_file_t *file,
lfs_off_t block_pos, lfs_soff_t crystal_size,
lfs_off_t pos, const uint8_t *buffer, lfs_size_t size) {
@@ -12174,12 +12203,7 @@ static int lfsr_file_crystallize(lfs_t *lfs, lfsr_file_t *file,
&& lfsr_bptr_block(&((lfsr_file_t*)o)->leaf.bptr)
== lfsr_bptr_block(&file->leaf.bptr)
&& (lfsr_file_t*)o != file) {
// TODO lfsr_bptr_mkdirty? clobber? claim?
// TODO lfsr_rbyd_claim?
LFS_IFDEF_CKDATACKSUMS(
((lfsr_file_t*)o)->leaf.bptr.data.u.disk.cksize,
((lfsr_file_t*)o)->leaf.bptr.cksize)
&= ~LFSR_BPTR_ISERASED;
lfsr_bptr_claim(&((lfsr_file_t*)o)->leaf.bptr);
}
}
@@ -12364,6 +12388,7 @@ static int lfsr_file_crystallize(lfs_t *lfs, lfsr_file_t *file,
lfsr_bptr_init(&bptr,
LFSR_DATA_DISK(block, 0, 0),
// mark as erased
LFSR_BPTR_ISERASED | 0,
0);
}
@@ -12565,21 +12590,14 @@ static int lfsr_file_flush_(lfs_t *lfs, lfsr_file_t *file,
}
// and graft the crystal into our tree
err = lfsr_file_graftcrystal(lfs, file,
file->leaf.pos, file->leaf.weight,
&file->leaf.bptr);
err = lfsr_file_graft(lfs, file);
if (err) {
return err;
}
// mark as unerased so lfsr_file_crystallize doesn't try to
// continue crystallizing this block
LFS_IFDEF_CKDATACKSUMS(
file->leaf.bptr.data.u.disk.cksize,
file->leaf.bptr.cksize) &= ~LFSR_BPTR_ISERASED;
// mark as grafted
file->b.o.flags &= ~LFS_o_UNGRAFT;
lfsr_bptr_claim(&file->leaf.bptr);
}
// before we can crystallize we need to figure out the best
@@ -12647,23 +12665,11 @@ fragment:;
//
// but note we're still tracking its erased state for future
// writes!
if (lfsr_o_isungraft(file->b.o.flags)) {
// and graft the crystal into our tree
int err = lfsr_file_graftcrystal(lfs, file,
file->leaf.pos, file->leaf.weight,
&file->leaf.bptr);
if (err) {
return err;
}
// mark as grafted
file->b.o.flags &= ~LFS_o_UNGRAFT;
int err = lfsr_file_graft(lfs, file);
if (err) {
return err;
}
// TODO NOTE _any_ compaction can affect shrub leaves... so any
// shrub updates need to also discard leafs, lfsr_mdir_commit,
// lfsr_fs_gc, etc
// do we need to discard our leaf? we need to discard fragments
// in case the underlying rbyd compacts, and we need to discard
// overwritten blocks
@@ -12701,7 +12707,7 @@ fragment:;
lfsr_bid_t bid;
lfsr_bid_t weight;
lfsr_bptr_t bptr;
int err = lfsr_file_lookup(lfs, file,
err = lfsr_file_lookup(lfs, file,
fragment_start-1,
&bid, &weight, &bptr);
if (err) {
@@ -12748,7 +12754,7 @@ fragment:;
lfsr_bid_t bid;
lfsr_bid_t weight;
lfsr_bptr_t bptr;
int err = lfsr_file_lookup(lfs, file,
err = lfsr_file_lookup(lfs, file,
fragment_end,
&bid, &weight, &bptr);
if (err) {
@@ -12788,7 +12794,7 @@ fragment:;
// once we've figured out what fragment to write, graft it into
// our tree
int err = lfsr_file_graftfragment(lfs, file,
err = lfsr_file_graftfragment(lfs, file,
fragment_start, fragment_end - fragment_start,
datas, data_count);
if (err) {
@@ -13161,8 +13167,6 @@ static int lfsr_file_sync_(lfs_t *lfs, lfsr_file_t *file) {
return 0;
}
// TODO update leaves?
// TODO can other operations, compactions maybe? clobber leaves?
int lfsr_file_sync(lfs_t *lfs, lfsr_file_t *file) {
LFS_ASSERT(lfsr_omdir_isopen(lfs, &file->b.o));
// can't write to readonly files, if you want to resync call
@@ -13422,17 +13426,9 @@ int lfsr_file_truncate(lfs_t *lfs, lfsr_file_t *file, lfs_off_t size_) {
< lfs_min(
lfs->cfg->fragment_thresh,
lfs->cfg->crystal_thresh)) {
// TODO lfsr_file_graft?
if (lfsr_o_isungraft(file->b.o.flags)) {
err = lfsr_file_graftcrystal(lfs, file,
file->leaf.pos, file->leaf.weight,
&file->leaf.bptr);
if (err) {
goto failed;
}
// mark as grafted
file->b.o.flags &= ~LFS_o_UNGRAFT;
err = lfsr_file_graft(lfs, file);
if (err) {
goto failed;
}
file->leaf.pos = 0;
@@ -13441,7 +13437,7 @@ int lfsr_file_truncate(lfs_t *lfs, lfsr_file_t *file, lfs_off_t size_) {
}
// truncate our btree
err = lfsr_file_graft(lfs, file,
err = lfsr_file_graft_(lfs, file,
lfs_min(size, size_), size - lfs_min(size, size_),
LFSR_RATTR(
LFSR_TAG_DATA, +size_ - size));
@@ -13451,9 +13447,7 @@ int lfsr_file_truncate(lfs_t *lfs, lfsr_file_t *file, lfs_off_t size_) {
// truncate our leaf
if (size_ < file->leaf.pos + lfsr_bptr_size(&file->leaf.bptr)) {
LFS_IFDEF_CKDATACKSUMS(
file->leaf.bptr.data.u.disk.cksize,
file->leaf.bptr.cksize) &= ~LFSR_BPTR_ISERASED;
lfsr_bptr_claim(&file->leaf.bptr);
}
file->leaf.bptr.data = LFSR_DATA_TRUNCATE(
file->leaf.bptr.data,
@@ -13516,17 +13510,9 @@ int lfsr_file_fruncate(lfs_t *lfs, lfsr_file_t *file, lfs_off_t size_) {
< lfs_min(
lfs->cfg->fragment_thresh,
lfs->cfg->crystal_thresh)) {
// TODO lfsr_file_graft?
if (lfsr_o_isungraft(file->b.o.flags)) {
err = lfsr_file_graftcrystal(lfs, file,
file->leaf.pos, file->leaf.weight,
&file->leaf.bptr);
if (err) {
goto failed;
}
// mark as grafted
file->b.o.flags &= ~LFS_o_UNGRAFT;
err = lfsr_file_graft(lfs, file);
if (err) {
goto failed;
}
file->leaf.pos = 0;
@@ -13535,7 +13521,7 @@ int lfsr_file_fruncate(lfs_t *lfs, lfsr_file_t *file, lfs_off_t size_) {
}
// fruncate our btree
err = lfsr_file_graft(lfs, file,
err = lfsr_file_graft_(lfs, file,
0, lfs_smax(size - size_, 0),
LFSR_RATTR(
LFSR_TAG_DATA, +size_ - size));
@@ -13547,9 +13533,7 @@ int lfsr_file_fruncate(lfs_t *lfs, lfsr_file_t *file, lfs_off_t size_) {
if ((lfs_soff_t)(size - size_)
> (lfs_soff_t)(file->leaf.pos
+ lfsr_bptr_size(&file->leaf.bptr))) {
LFS_IFDEF_CKDATACKSUMS(
file->leaf.bptr.data.u.disk.cksize,
file->leaf.bptr.cksize) &= ~LFSR_BPTR_ISERASED;
lfsr_bptr_claim(&file->leaf.bptr);
}
file->leaf.bptr.data = LFSR_DATA_FRUNCATE(
file->leaf.bptr.data,