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:
@@ -711,14 +711,14 @@ static int lfsr_bd_set(lfs_t *lfs, lfs_block_t block, lfs_size_t off,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef LFS_CKPARITY
|
#ifdef LFS_CKPARITY
|
||||||
static inline bool lfsr_ptail_parity(const lfsr_ptail_t *ptail) {
|
static inline bool lfsr_ptail_parity(const lfs_t *lfs) {
|
||||||
return ptail->off & LFSR_PTAIL_PARITY;
|
return lfs->ptail.off & LFSR_PTAIL_PARITY;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef LFS_CKPARITY
|
#ifdef LFS_CKPARITY
|
||||||
static inline lfs_size_t lfsr_ptail_off(const lfsr_ptail_t *ptail) {
|
static inline lfs_size_t lfsr_ptail_off(const lfs_t *lfs) {
|
||||||
return ptail->off & ~LFSR_PTAIL_PARITY;
|
return lfs->ptail.off & ~LFSR_PTAIL_PARITY;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1559,9 +1559,8 @@ static lfs_ssize_t lfsr_bd_readtag(lfs_t *lfs,
|
|||||||
|
|
||||||
// parity in in ptail?
|
// parity in in ptail?
|
||||||
bool parity;
|
bool parity;
|
||||||
if (block == lfs->ptail.block
|
if (block == lfs->ptail.block && off+d_ == lfsr_ptail_off(lfs)) {
|
||||||
&& off+d_ == lfsr_ptail_off(&lfs->ptail)) {
|
parity = lfsr_ptail_parity(lfs);
|
||||||
parity = lfsr_ptail_parity(&lfs->ptail);
|
|
||||||
|
|
||||||
// parity on disk?
|
// parity on disk?
|
||||||
} else {
|
} 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
|
// 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
|
// 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) {
|
for (lfsr_omdir_t *o_ = lfs->omdirs; o_; o_ = o_->next) {
|
||||||
if (o_ == o) {
|
if (o_ == o) {
|
||||||
return true;
|
return true;
|
||||||
@@ -7185,12 +7184,8 @@ static void lfsr_fs_mkdirty(lfs_t *lfs) {
|
|||||||
/// Global-state things ///
|
/// Global-state things ///
|
||||||
|
|
||||||
// grm (global remove) 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) {
|
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) {
|
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) \
|
#define LFSR_DATA_GRM(_grm, _buffer) \
|
||||||
((struct {lfsr_data_t d;}){lfsr_data_fromgrm(_grm, _buffer)}.d)
|
((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]) {
|
uint8_t buffer[static LFSR_GRM_DSIZE]) {
|
||||||
// make sure to zero so we don't leak any info
|
// make sure to zero so we don't leak any info
|
||||||
lfs_memset(buffer, 0, LFSR_GRM_DSIZE);
|
lfs_memset(buffer, 0, LFSR_GRM_DSIZE);
|
||||||
|
|
||||||
// encode grms
|
// encode grms
|
||||||
lfs_size_t count = lfsr_grm_count_(grm);
|
lfs_size_t count = lfsr_grm_count(lfs);
|
||||||
lfs_ssize_t d = 0;
|
lfs_ssize_t d = 0;
|
||||||
for (lfs_size_t i = 0; i < count; i++) {
|
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) {
|
if (d_ < 0) {
|
||||||
LFS_UNREACHABLE();
|
LFS_UNREACHABLE();
|
||||||
}
|
}
|
||||||
@@ -7240,11 +7235,10 @@ static lfsr_data_t lfsr_data_fromgrm(const lfsr_grm_t *grm,
|
|||||||
// required by lfsr_data_readgrm
|
// required by lfsr_data_readgrm
|
||||||
static inline lfsr_mid_t lfsr_mtree_weight(lfs_t *lfs);
|
static inline lfsr_mid_t lfsr_mtree_weight(lfs_t *lfs);
|
||||||
|
|
||||||
static int lfsr_data_readgrm(lfs_t *lfs, lfsr_data_t *data,
|
static int lfsr_data_readgrm(lfs_t *lfs, lfsr_data_t *data) {
|
||||||
lfsr_grm_t *grm) {
|
|
||||||
// clear first
|
// clear first
|
||||||
grm->queue[0] = 0;
|
lfs->grm.queue[0] = 0;
|
||||||
grm->queue[1] = 0;
|
lfs->grm.queue[1] = 0;
|
||||||
|
|
||||||
// decode grms, these are terminated by either a null (mid=0) or the
|
// decode grms, these are terminated by either a null (mid=0) or the
|
||||||
// size of the grm buffer
|
// size of the grm buffer
|
||||||
@@ -7262,7 +7256,7 @@ static int lfsr_data_readgrm(lfs_t *lfs, lfsr_data_t *data,
|
|||||||
|
|
||||||
// grm inside mtree?
|
// grm inside mtree?
|
||||||
LFS_ASSERT(mid < lfsr_mtree_weight(lfs));
|
LFS_ASSERT(mid < lfsr_mtree_weight(lfs));
|
||||||
grm->queue[i] = mid;
|
lfs->grm.queue[i] = mid;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -7286,7 +7280,7 @@ static void lfsr_fs_commitgdelta(lfs_t *lfs) {
|
|||||||
lfs->gcksum_p = lfs->gcksum;
|
lfs->gcksum_p = lfs->gcksum;
|
||||||
|
|
||||||
// keep track of the on-disk grm
|
// 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
|
// revert gstate to on-disk state
|
||||||
@@ -7296,8 +7290,7 @@ static void lfsr_fs_revertgdelta(lfs_t *lfs) {
|
|||||||
|
|
||||||
// revert to the on-disk grm
|
// revert to the on-disk grm
|
||||||
int err = lfsr_data_readgrm(lfs,
|
int err = lfsr_data_readgrm(lfs,
|
||||||
&LFSR_DATA_BUF(lfs->grm_p, LFSR_GRM_DSIZE),
|
&LFSR_DATA_BUF(lfs->grm_p, LFSR_GRM_DSIZE));
|
||||||
&lfs->grm);
|
|
||||||
if (err) {
|
if (err) {
|
||||||
LFS_UNREACHABLE();
|
LFS_UNREACHABLE();
|
||||||
}
|
}
|
||||||
@@ -7310,7 +7303,7 @@ static int lfsr_rbyd_appendgdelta(lfs_t *lfs, lfsr_rbyd_t *rbyd) {
|
|||||||
|
|
||||||
// pending grm state?
|
// pending grm state?
|
||||||
uint8_t grmdelta_[LFSR_GRM_DSIZE];
|
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_p, LFSR_GRM_DSIZE);
|
||||||
lfs_memxor(grmdelta_, lfs->grm_d, 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
|
// decode grm so we can report any removed files as missing
|
||||||
int err = lfsr_data_readgrm(lfs,
|
int err = lfsr_data_readgrm(lfs,
|
||||||
&LFSR_DATA_BUF(lfs->grm_p, LFSR_GRM_DSIZE),
|
&LFSR_DATA_BUF(lfs->grm_p, LFSR_GRM_DSIZE));
|
||||||
&lfs->grm);
|
|
||||||
if (err) {
|
if (err) {
|
||||||
// TODO switch to read-only?
|
// TODO switch to read-only?
|
||||||
return err;
|
return err;
|
||||||
|
|||||||
@@ -824,14 +824,6 @@ typedef struct lfsr_grm {
|
|||||||
lfsr_smid_t queue[2];
|
lfsr_smid_t queue[2];
|
||||||
} lfsr_grm_t;
|
} 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
|
// The littlefs filesystem type
|
||||||
typedef struct lfs {
|
typedef struct lfs {
|
||||||
const struct lfs_config *cfg;
|
const struct lfs_config *cfg;
|
||||||
@@ -850,13 +842,14 @@ typedef struct lfs {
|
|||||||
lfsr_mdir_t mroot;
|
lfsr_mdir_t mroot;
|
||||||
lfsr_btree_t mtree;
|
lfsr_btree_t mtree;
|
||||||
|
|
||||||
struct {
|
struct lfsr_rcache {
|
||||||
lfs_block_t block;
|
lfs_block_t block;
|
||||||
lfs_size_t off;
|
lfs_size_t off;
|
||||||
lfs_size_t size;
|
lfs_size_t size;
|
||||||
uint8_t *buffer;
|
uint8_t *buffer;
|
||||||
} rcache;
|
} rcache;
|
||||||
struct {
|
|
||||||
|
struct lfsr_pcache {
|
||||||
lfs_block_t block;
|
lfs_block_t block;
|
||||||
lfs_size_t off;
|
lfs_size_t off;
|
||||||
lfs_size_t size;
|
lfs_size_t size;
|
||||||
@@ -864,7 +857,11 @@ typedef struct lfs {
|
|||||||
} pcache;
|
} pcache;
|
||||||
|
|
||||||
#ifdef LFS_CKPARITY
|
#ifdef LFS_CKPARITY
|
||||||
lfsr_ptail_t ptail;
|
struct {
|
||||||
|
lfs_block_t block;
|
||||||
|
// sign(off) => tail parity
|
||||||
|
lfs_size_t off;
|
||||||
|
} ptail;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct lfs_lookahead {
|
struct lfs_lookahead {
|
||||||
@@ -875,6 +872,7 @@ typedef struct lfs {
|
|||||||
uint8_t *buffer;
|
uint8_t *buffer;
|
||||||
} lookahead;
|
} lookahead;
|
||||||
|
|
||||||
|
// global state
|
||||||
uint32_t gcksum;
|
uint32_t gcksum;
|
||||||
uint32_t gcksum_p;
|
uint32_t gcksum_p;
|
||||||
uint32_t gcksum_d;
|
uint32_t gcksum_d;
|
||||||
@@ -884,6 +882,7 @@ typedef struct lfs {
|
|||||||
uint8_t grm_d[LFSR_GRM_DSIZE];
|
uint8_t grm_d[LFSR_GRM_DSIZE];
|
||||||
|
|
||||||
#ifdef LFS_GC
|
#ifdef LFS_GC
|
||||||
|
// optional incremental gc state
|
||||||
struct {
|
struct {
|
||||||
lfsr_traversal_t t;
|
lfsr_traversal_t t;
|
||||||
} gc;
|
} gc;
|
||||||
|
|||||||
Reference in New Issue
Block a user