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%)
This commit is contained in:
Christopher Haster
2025-04-29 14:16:49 -05:00
parent f2e6b60f36
commit 97f8eeb9e9
2 changed files with 29 additions and 38 deletions
+19 -27
View File
@@ -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;
+10 -11
View File
@@ -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;