From 97f8eeb9e9107765234fd3fbdb8446828faccbee Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Tue, 29 Apr 2025 14:16:49 -0500 Subject: [PATCH] Tweaked more functions to operate on lfs_t directly Mainly the grm and ptail subsystems. This matches the internal mtree API. Unfortunately this _did_ add a little bit of code, I guess due to the larger struct offsets. But since this simplifies the internal API I'm going to chalk it up to compiler noise: code stack ctx before: 35768 2368 636 after: 35792 (+0.1%) 2368 (+0.0%) 636 (+0.0%) --- lfs.c | 46 +++++++++++++++++++--------------------------- lfs.h | 21 ++++++++++----------- 2 files changed, 29 insertions(+), 38 deletions(-) diff --git a/lfs.c b/lfs.c index f9dfbd84..7076ffe6 100644 --- a/lfs.c +++ b/lfs.c @@ -711,14 +711,14 @@ static int lfsr_bd_set(lfs_t *lfs, lfs_block_t block, lfs_size_t off, #endif #ifdef LFS_CKPARITY -static inline bool lfsr_ptail_parity(const lfsr_ptail_t *ptail) { - return ptail->off & LFSR_PTAIL_PARITY; +static inline bool lfsr_ptail_parity(const lfs_t *lfs) { + return lfs->ptail.off & LFSR_PTAIL_PARITY; } #endif #ifdef LFS_CKPARITY -static inline lfs_size_t lfsr_ptail_off(const lfsr_ptail_t *ptail) { - return ptail->off & ~LFSR_PTAIL_PARITY; +static inline lfs_size_t lfsr_ptail_off(const lfs_t *lfs) { + return lfs->ptail.off & ~LFSR_PTAIL_PARITY; } #endif @@ -1559,9 +1559,8 @@ static lfs_ssize_t lfsr_bd_readtag(lfs_t *lfs, // parity in in ptail? bool parity; - if (block == lfs->ptail.block - && off+d_ == lfsr_ptail_off(&lfs->ptail)) { - parity = lfsr_ptail_parity(&lfs->ptail); + if (block == lfs->ptail.block && off+d_ == lfsr_ptail_off(lfs)) { + parity = lfsr_ptail_parity(lfs); // parity on disk? } else { @@ -7099,7 +7098,7 @@ static inline bool lfsr_i_isinmtree(uint32_t flags) { // we maintain a linked-list of all opened mdirs, in order to keep // metadata state in-sync, these may be casted to specific file types -static bool lfsr_omdir_isopen(lfs_t *lfs, const lfsr_omdir_t *o) { +static bool lfsr_omdir_isopen(const lfs_t *lfs, const lfsr_omdir_t *o) { for (lfsr_omdir_t *o_ = lfs->omdirs; o_; o_ = o_->next) { if (o_ == o) { return true; @@ -7185,12 +7184,8 @@ static void lfsr_fs_mkdirty(lfs_t *lfs) { /// Global-state things /// // grm (global remove) things -static inline lfs_size_t lfsr_grm_count_(const lfsr_grm_t *grm) { - return (grm->queue[0] != 0) + (grm->queue[1] != 0); -} - static inline lfs_size_t lfsr_grm_count(const lfs_t *lfs) { - return lfsr_grm_count_(&lfs->grm); + return (lfs->grm.queue[0] != 0) + (lfs->grm.queue[1] != 0); } static inline void lfsr_grm_push(lfs_t *lfs, lfsr_smid_t mid) { @@ -7218,16 +7213,16 @@ static inline bool lfsr_grm_ismidrm(const lfs_t *lfs, lfsr_smid_t mid) { #define LFSR_DATA_GRM(_grm, _buffer) \ ((struct {lfsr_data_t d;}){lfsr_data_fromgrm(_grm, _buffer)}.d) -static lfsr_data_t lfsr_data_fromgrm(const lfsr_grm_t *grm, +static lfsr_data_t lfsr_data_fromgrm(const lfs_t *lfs, uint8_t buffer[static LFSR_GRM_DSIZE]) { // make sure to zero so we don't leak any info lfs_memset(buffer, 0, LFSR_GRM_DSIZE); // encode grms - lfs_size_t count = lfsr_grm_count_(grm); + lfs_size_t count = lfsr_grm_count(lfs); lfs_ssize_t d = 0; for (lfs_size_t i = 0; i < count; i++) { - lfs_ssize_t d_ = lfs_toleb128(grm->queue[i], &buffer[d], 5); + lfs_ssize_t d_ = lfs_toleb128(lfs->grm.queue[i], &buffer[d], 5); if (d_ < 0) { LFS_UNREACHABLE(); } @@ -7240,11 +7235,10 @@ static lfsr_data_t lfsr_data_fromgrm(const lfsr_grm_t *grm, // required by lfsr_data_readgrm static inline lfsr_mid_t lfsr_mtree_weight(lfs_t *lfs); -static int lfsr_data_readgrm(lfs_t *lfs, lfsr_data_t *data, - lfsr_grm_t *grm) { +static int lfsr_data_readgrm(lfs_t *lfs, lfsr_data_t *data) { // clear first - grm->queue[0] = 0; - grm->queue[1] = 0; + lfs->grm.queue[0] = 0; + lfs->grm.queue[1] = 0; // decode grms, these are terminated by either a null (mid=0) or the // size of the grm buffer @@ -7262,7 +7256,7 @@ static int lfsr_data_readgrm(lfs_t *lfs, lfsr_data_t *data, // grm inside mtree? LFS_ASSERT(mid < lfsr_mtree_weight(lfs)); - grm->queue[i] = mid; + lfs->grm.queue[i] = mid; } return 0; @@ -7286,7 +7280,7 @@ static void lfsr_fs_commitgdelta(lfs_t *lfs) { lfs->gcksum_p = lfs->gcksum; // keep track of the on-disk grm - lfsr_data_fromgrm(&lfs->grm, lfs->grm_p); + lfsr_data_fromgrm(lfs, lfs->grm_p); } // revert gstate to on-disk state @@ -7296,8 +7290,7 @@ static void lfsr_fs_revertgdelta(lfs_t *lfs) { // revert to the on-disk grm int err = lfsr_data_readgrm(lfs, - &LFSR_DATA_BUF(lfs->grm_p, LFSR_GRM_DSIZE), - &lfs->grm); + &LFSR_DATA_BUF(lfs->grm_p, LFSR_GRM_DSIZE)); if (err) { LFS_UNREACHABLE(); } @@ -7310,7 +7303,7 @@ static int lfsr_rbyd_appendgdelta(lfs_t *lfs, lfsr_rbyd_t *rbyd) { // pending grm state? uint8_t grmdelta_[LFSR_GRM_DSIZE]; - lfsr_data_fromgrm(&lfs->grm, grmdelta_); + lfsr_data_fromgrm(lfs, grmdelta_); lfs_memxor(grmdelta_, lfs->grm_p, LFSR_GRM_DSIZE); lfs_memxor(grmdelta_, lfs->grm_d, LFSR_GRM_DSIZE); @@ -14015,8 +14008,7 @@ static int lfsr_mountinited(lfs_t *lfs) { // decode grm so we can report any removed files as missing int err = lfsr_data_readgrm(lfs, - &LFSR_DATA_BUF(lfs->grm_p, LFSR_GRM_DSIZE), - &lfs->grm); + &LFSR_DATA_BUF(lfs->grm_p, LFSR_GRM_DSIZE)); if (err) { // TODO switch to read-only? return err; diff --git a/lfs.h b/lfs.h index 4b62a202..6489627d 100644 --- a/lfs.h +++ b/lfs.h @@ -824,14 +824,6 @@ typedef struct lfsr_grm { lfsr_smid_t queue[2]; } lfsr_grm_t; -#ifdef LFS_CKPARITY -typedef struct lfsr_ptail { - lfs_block_t block; - // sign(off) => tail parity - lfs_size_t off; -} lfsr_ptail_t; -#endif - // The littlefs filesystem type typedef struct lfs { const struct lfs_config *cfg; @@ -850,13 +842,14 @@ typedef struct lfs { lfsr_mdir_t mroot; lfsr_btree_t mtree; - struct { + struct lfsr_rcache { lfs_block_t block; lfs_size_t off; lfs_size_t size; uint8_t *buffer; } rcache; - struct { + + struct lfsr_pcache { lfs_block_t block; lfs_size_t off; lfs_size_t size; @@ -864,7 +857,11 @@ typedef struct lfs { } pcache; #ifdef LFS_CKPARITY - lfsr_ptail_t ptail; + struct { + lfs_block_t block; + // sign(off) => tail parity + lfs_size_t off; + } ptail; #endif struct lfs_lookahead { @@ -875,6 +872,7 @@ typedef struct lfs { uint8_t *buffer; } lookahead; + // global state uint32_t gcksum; uint32_t gcksum_p; uint32_t gcksum_d; @@ -884,6 +882,7 @@ typedef struct lfs { uint8_t grm_d[LFSR_GRM_DSIZE]; #ifdef LFS_GC + // optional incremental gc state struct { lfsr_traversal_t t; } gc;