From 1db215309b8faa9807e81dd25edaa1dc502a5444 Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Thu, 18 Jan 2024 15:32:41 -0600 Subject: [PATCH] Dropped lfsr_mdir_bid/rid convenience functions Much like the lfsr_o_* functions, I think we should avoid too many convenience layers for what really are operations on struct fields. Otherwise you quickly end up with a lot of boilerplate that just saves a couple extra characters at invocation. Characters that also help convey what is being accessed. --- lfs.c | 45 ++++++++++++++++++------------------------- tests/test_mtree.toml | 40 +++++++++++++++++++------------------- 2 files changed, 39 insertions(+), 46 deletions(-) diff --git a/lfs.c b/lfs.c index 54bbe83e..020aea6a 100644 --- a/lfs.c +++ b/lfs.c @@ -5009,14 +5009,6 @@ static inline bool lfsr_mdir_ismrootanchor(const lfsr_mdir_t *mdir) { return lfsr_mptr_ismrootanchor(lfsr_mdir_mptr(mdir)); } -static inline lfsr_sbid_t lfsr_mdir_bid(lfs_t *lfs, const lfsr_mdir_t *mdir) { - return lfsr_mid_bid(lfs, mdir->mid); -} - -static inline lfsr_srid_t lfsr_mdir_rid(lfs_t *lfs, const lfsr_mdir_t *mdir) { - return lfsr_mid_rid(lfs, mdir->mid); -} - // mdir operations static int lfsr_mdir_fetch(lfs_t *lfs, lfsr_mdir_t *mdir, lfsr_smid_t mid, const lfsr_mptr_t *mptr) { @@ -5265,8 +5257,8 @@ static int lfsr_mtree_seek(lfs_t *lfs, lfsr_mdir_t *mdir, lfs_off_t off) { while (true) { // calculate new mid, be careful to avoid rid overflow - lfsr_bid_t bid = lfsr_mdir_bid(lfs, mdir); - lfsr_srid_t rid = lfsr_mdir_rid(lfs, mdir) + off; + lfsr_bid_t bid = lfsr_mid_bid(lfs, mdir->mid); + lfsr_srid_t rid = lfsr_mid_rid(lfs, mdir->mid) + off; // lookup mdirs until we find our rid, we need to do this because // we don't know how many rids are in each mdir until we fetch while (rid >= mdir->rbyd.weight) { @@ -5777,7 +5769,7 @@ static lfs_ssize_t lfsr_mdir_estimate__(lfs_t *lfs, const lfsr_mdir_t *mdir, // belongs to our mdir + rid? if (file->type != LFS_TYPE_REG || lfsr_mdir_cmp(&file->mdir, mdir) != 0 - || lfsr_mdir_rid(lfs, &file->mdir) != rid) { + || lfsr_mid_rid(lfs, file->mdir.mid) != rid) { continue; } @@ -5925,8 +5917,8 @@ static int lfsr_mdir_compact__(lfs_t *lfs, lfsr_mdir_t *mdir_, // belongs to our mdir? if (file->type != LFS_TYPE_REG || lfsr_mdir_cmp(&file->mdir, mdir) != 0 - || lfsr_mdir_rid(lfs, &file->mdir) < start_rid - || (lfsr_rid_t)lfsr_mdir_rid(lfs, &file->mdir) + || lfsr_mid_rid(lfs, file->mdir.mid) < start_rid + || (lfsr_rid_t)lfsr_mid_rid(lfs, file->mdir.mid) >= (lfsr_rid_t)end_rid) { continue; } @@ -6288,7 +6280,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir, LFS_ASSERT(mdir->mid == -1 || lfsr_mtree_isnull(lfs) || mdir->rbyd.weight > 0); - LFS_ASSERT(lfsr_mdir_rid(lfs, mdir) <= mdir->rbyd.weight); + LFS_ASSERT(lfsr_mid_rid(lfs, mdir->mid) <= mdir->rbyd.weight); // reset gdelta for new commit lfsr_fs_flushgdelta(lfs); @@ -6542,11 +6534,11 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir, uint8_t mdir_buf[LFSR_MPTR_DSIZE]; uint8_t msibling_buf[LFSR_MPTR_DSIZE]; err = lfsr_mtree_commit_(lfs, LFSR_ATTRS( - LFSR_ATTR(lfsr_mdir_bid(lfs, &mdir_), + LFSR_ATTR(lfsr_mid_bid(lfs, mdir_.mid), MDIR, 0, FROMMPTR(lfsr_mdir_mptr(&mdir_), mdir_buf)), - LFSR_ATTR(lfsr_mdir_bid(lfs, &mdir_)+1, + LFSR_ATTR(lfsr_mid_bid(lfs, mdir_.mid)+1, NAME, +lfsr_mweight(lfs), DATA(split_data)), - LFSR_ATTR(lfsr_mdir_bid(lfs, &msibling_), + LFSR_ATTR(lfsr_mid_bid(lfs, msibling_.mid), MDIR, 0, FROMMPTR(lfsr_mdir_mptr(&msibling_), msibling_buf)))); if (err) { @@ -6611,7 +6603,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir, // update our mtree err = lfsr_mtree_commit_(lfs, LFSR_ATTRS( - LFSR_ATTR(lfsr_mdir_bid(lfs, &mdir_), + LFSR_ATTR(lfsr_mid_bid(lfs, mdir_.mid), RM, -lfsr_mweight(lfs), NULL()))); if (err) { return err; @@ -6646,7 +6638,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir, // update our mtree uint8_t mdir_buf[LFSR_MPTR_DSIZE]; err = lfsr_mtree_commit_(lfs, LFSR_ATTRS( - LFSR_ATTR(lfsr_mdir_bid(lfs, &mdir_), + LFSR_ATTR(lfsr_mid_bid(lfs, mdir_.mid), MDIR, 0, FROMMPTR(lfsr_mdir_mptr(&mdir_), mdir_buf)))); if (err) { return err; @@ -6714,7 +6706,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir, // update any opened mdirs if we had a split or drop if (lfsr_mdir_cmp(&opened->mdir, mdir) == 0) { if (mdelta > 0 - && lfsr_mdir_rid(lfs, &opened->mdir) + && lfsr_mid_rid(lfs, opened->mdir.mid) >= mdir_.rbyd.weight) { opened->mdir.mid += lfsr_mweight(lfs) - mdir_.rbyd.weight; @@ -6772,7 +6764,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir, if (mdir->mid == -1) { mdir->rbyd = lfs->mroot.rbyd; } else if (mdelta > 0 - && lfsr_mdir_rid(lfs, mdir) >= mdir_.rbyd.weight) { + && lfsr_mid_rid(lfs, mdir->mid) >= mdir_.rbyd.weight) { mdir->mid += lfsr_mweight(lfs) - mdir_.rbyd.weight; mdir->rbyd = msibling_.rbyd; } else { @@ -6817,7 +6809,8 @@ static int lfsr_mdir_namelookup(lfs_t *lfs, const lfsr_mdir_t *mdir, if (lfs_cmp(cmp) < 0) { rid += 1; } - lfsr_smid_t mid = lfsr_mdir_bid(lfs, mdir)-(lfsr_mweight(lfs)-1) + rid; + lfsr_smid_t mid = lfsr_mid_bid(lfs, mdir->mid)-(lfsr_mweight(lfs)-1) + + rid; // intercept pending grms here and pretend they're orphaned files // @@ -7365,7 +7358,7 @@ static int lfsr_traversal_read(lfs_t *lfs, lfsr_traversal_t *traversal, // not traversing all blocks? have we exceeded our mdir's weight? // return to mtree traversal if (!lfsr_traversal_isall(traversal) - || lfsr_mdir_rid(lfs, &traversal->file.mdir) + || lfsr_mid_rid(lfs, traversal->file.mdir.mid) >= traversal->file.mdir.rbyd.weight) { traversal->state = LFSR_TRAVERSAL_MTREE; continue; @@ -8258,7 +8251,7 @@ static int lfsr_fs_fixgrm(lfs_t *lfs) { lfsr_grm_poprm(&grm); // make sure to adjust any remaining grms - if (lfsr_mid_bid(lfs, grm.rms[0]) == lfsr_mdir_bid(lfs, &mdir) + if (lfsr_mid_bid(lfs, grm.rms[0]) == lfsr_mid_bid(lfs, mdir.mid) && grm.rms[0] >= mdir.mid) { LFS_ASSERT(grm.rms[0] != mdir.mid); grm.rms[0] -= 1; @@ -8603,7 +8596,7 @@ int lfsr_remove(lfs_t *lfs, const char *path) { } // adjust rid if grm is on the same mdir as our dir - if (lfsr_mid_bid(lfs, grm.rms[0]) == lfsr_mdir_bid(lfs, &mdir) + if (lfsr_mid_bid(lfs, grm.rms[0]) == lfsr_mid_bid(lfs, mdir.mid) && grm.rms[0] > mdir.mid) { grm.rms[0] -= 1; } @@ -8694,7 +8687,7 @@ int lfsr_rename(lfs_t *lfs, const char *old_path, const char *new_path) { } // adjust old rid if grm is on the same mdir as new rid - if (lfsr_mid_bid(lfs, grm.rms[0]) == lfsr_mdir_bid(lfs, &new_mdir) + if (lfsr_mid_bid(lfs, grm.rms[0]) == lfsr_mid_bid(lfs, new_mdir.mid) && grm.rms[0] >= new_mdir.mid) { grm.rms[0] += 1; } diff --git a/tests/test_mtree.toml b/tests/test_mtree.toml index 5ea7cb6c..f5f41842 100644 --- a/tests/test_mtree.toml +++ b/tests/test_mtree.toml @@ -439,7 +439,7 @@ code = ''' mid += lfsr_mweight(&lfs)) { lfsr_mdir_t mdir; lfsr_mtree_lookup(&lfs, mid, &mdir) => 0; - for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.rbyd.weight; + for (; lfsr_mid_rid(&lfs, mdir.mid) < mdir.rbyd.weight; mdir.mid += 1) { // skip the root bookmark if (mdir.mid == 0) { @@ -470,7 +470,7 @@ code = ''' mid += lfsr_mweight(&lfs)) { lfsr_mdir_t mdir; lfsr_mtree_lookup(&lfs, mid, &mdir) => 0; - for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.rbyd.weight; + for (; lfsr_mid_rid(&lfs, mdir.mid) < mdir.rbyd.weight; mdir.mid += 1) { // skip the root bookmark if (mdir.mid == 0) { @@ -517,7 +517,7 @@ code = ''' lfsr_mtree_lookup(&lfs, mid, &mdir) => 0; // limit our mid to our mdir's weight mdir.mid = lfs_max32( - lfsr_mdir_bid(&lfs, &mdir)-(lfsr_mweight(&lfs)-1) + lfsr_mid_bid(&lfs, mdir.mid)-(lfsr_mweight(&lfs)-1) + (mdir.mid % (mdir.rbyd.weight+1)), 1); @@ -551,7 +551,7 @@ code = ''' mid += lfsr_mweight(&lfs)) { lfsr_mdir_t mdir; lfsr_mtree_lookup(&lfs, mid, &mdir) => 0; - for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.rbyd.weight; + for (; lfsr_mid_rid(&lfs, mdir.mid) < mdir.rbyd.weight; mdir.mid += 1) { // skip the root bookmark if (mdir.mid == 0) { @@ -586,7 +586,7 @@ code = ''' mid += lfsr_mweight(&lfs)) { lfsr_mdir_t mdir; lfsr_mtree_lookup(&lfs, mid, &mdir) => 0; - for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.rbyd.weight; + for (; lfsr_mid_rid(&lfs, mdir.mid) < mdir.rbyd.weight; mdir.mid += 1) { // skip the root bookmark if (mdir.mid == 0) { @@ -1089,12 +1089,12 @@ code = ''' lfsr_mtree_lookup(&lfs, mid, &mdir) => 0; // limit our mid to our mdir's weight mdir.mid = lfs_max32( - lfsr_mdir_bid(&lfs, &mdir)-(lfsr_mweight(&lfs)-1) + lfsr_mid_bid(&lfs, mdir.mid)-(lfsr_mweight(&lfs)-1) + (mdir.mid % (mdir.rbyd.weight+1)), 1); // choose to create or delete, note we make sure to never delete to zero - uint8_t op = (lfsr_mdir_rid(&lfs, &mdir) == mdir.rbyd.weight - || (lfsr_mdir_rid(&lfs, &mdir) == mdir.rbyd.weight-1 + uint8_t op = (lfsr_mid_rid(&lfs, mdir.mid) == mdir.rbyd.weight + || (lfsr_mid_rid(&lfs, mdir.mid) == mdir.rbyd.weight-1 && lfsr_mtree_weight(&lfs) == lfsr_mweight(&lfs)) ? 0 : TEST_PRNG(&prng) % 2); @@ -1143,7 +1143,7 @@ code = ''' // drop should make sure we never have empty mdirs assert(lfsr_mtree_ismptr(&lfs) || mdir.rbyd.weight > 0); - for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.rbyd.weight; + for (; lfsr_mid_rid(&lfs, mdir.mid) < mdir.rbyd.weight; mdir.mid += 1) { // skip the root bookmark if (mdir.mid == 0) { @@ -1182,7 +1182,7 @@ code = ''' // drop should make sure we never have empty mdirs assert(lfsr_mtree_ismptr(&lfs) || mdir.rbyd.weight > 0); - for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.rbyd.weight; + for (; lfsr_mid_rid(&lfs, mdir.mid) < mdir.rbyd.weight; mdir.mid += 1) { // skip the root bookmark if (mdir.mid == 0) { @@ -2147,12 +2147,12 @@ code = ''' lfsr_mtree_lookup(&lfs, mid, &mdir) => 0; // limit our mid to our mdir's weight mdir.mid = lfs_max32( - lfsr_mdir_bid(&lfs, &mdir)-(lfsr_mweight(&lfs)-1) + lfsr_mid_bid(&lfs, mdir.mid)-(lfsr_mweight(&lfs)-1) + (mdir.mid % (mdir.rbyd.weight+1)), 1); // choose to create or delete, note we make sure to never delete to zero - uint8_t op = (lfsr_mdir_rid(&lfs, &mdir) == mdir.rbyd.weight - || (lfsr_mdir_rid(&lfs, &mdir) == mdir.rbyd.weight-1 + uint8_t op = (lfsr_mid_rid(&lfs, mdir.mid) == mdir.rbyd.weight + || (lfsr_mid_rid(&lfs, mdir.mid) == mdir.rbyd.weight-1 && lfsr_mtree_weight(&lfs) == lfsr_mweight(&lfs)) ? 0 : TEST_PRNG(&prng) % 3); @@ -2214,7 +2214,7 @@ code = ''' // drop should make sure we never have empty mdirs assert(lfsr_mtree_ismptr(&lfs) || mdir.rbyd.weight > 0); - for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.rbyd.weight; + for (; lfsr_mid_rid(&lfs, mdir.mid) < mdir.rbyd.weight; mdir.mid += 1) { // skip the root bookmark if (mdir.mid == 0) { @@ -2253,7 +2253,7 @@ code = ''' // drop should make sure we never have empty mdirs assert(lfsr_mtree_ismptr(&lfs) || mdir.rbyd.weight > 0); - for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.rbyd.weight; + for (; lfsr_mid_rid(&lfs, mdir.mid) < mdir.rbyd.weight; mdir.mid += 1) { // skip the root bookmark if (mdir.mid == 0) { @@ -3485,7 +3485,7 @@ code = ''' mid += lfsr_mweight(&lfs)) { lfsr_mdir_t mdir; lfsr_mtree_lookup(&lfs, mid, &mdir) => 0; - for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.rbyd.weight; + for (; lfsr_mid_rid(&lfs, mdir.mid) < mdir.rbyd.weight; mdir.mid += 1) { // skip the root bookmark if (mdir.mid == 0) { @@ -3568,7 +3568,7 @@ code = ''' mid += lfsr_mweight(&lfs)) { lfsr_mdir_t mdir; lfsr_mtree_lookup(&lfs, mid, &mdir) => 0; - for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.rbyd.weight; + for (; lfsr_mid_rid(&lfs, mdir.mid) < mdir.rbyd.weight; mdir.mid += 1) { // skip the root bookmark if (mdir.mid == 0) { @@ -3615,7 +3615,7 @@ code = ''' lfsr_mtree_lookup(&lfs, mid, &mdir) => 0; // limit our mid to our mdir's weight mdir.mid = lfs_max32( - lfsr_mdir_bid(&lfs, &mdir)-(lfsr_mweight(&lfs)-1) + lfsr_mid_bid(&lfs, mdir.mid)-(lfsr_mweight(&lfs)-1) + (mdir.mid % (mdir.rbyd.weight+1)), 1); @@ -3649,7 +3649,7 @@ code = ''' mid += lfsr_mweight(&lfs)) { lfsr_mdir_t mdir; lfsr_mtree_lookup(&lfs, mid, &mdir) => 0; - for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.rbyd.weight; + for (; lfsr_mid_rid(&lfs, mdir.mid) < mdir.rbyd.weight; mdir.mid += 1) { // skip the root bookmark if (mdir.mid == 0) { @@ -3737,7 +3737,7 @@ code = ''' mid += lfsr_mweight(&lfs)) { lfsr_mdir_t mdir; lfsr_mtree_lookup(&lfs, mid, &mdir) => 0; - for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.rbyd.weight; + for (; lfsr_mid_rid(&lfs, mdir.mid) < mdir.rbyd.weight; mdir.mid += 1) { // skip the root bookmark if (mdir.mid == 0) {