From e5363006062bc478647c8c1c7f3c56816016f556 Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Mon, 12 Aug 2024 16:54:10 -0500 Subject: [PATCH] Rearranged flags a bit Mainly to make space for more shared open/mount flags that are future planned. The nice thing about our flags is they don't live on-disk, so we can always change them whenever we need to. It gets a bit messy, but this is what the current layout looks like: 8 8 8 8 .----++----++----++----. .----..-..-..----------. o_flags: |type||f||t|| o | |----||-|:-:'--.-.-----' |----||-|:-:---:-:-----. d_flags: |type||f|: : : : | |----||-|:-:---:-:-----' |----||-|:-'--..-..----. t_flags: |type||f|| t ||f||tstt| '----''-'|----|'-''----' .--------|----|:-:-----. gc_flags: | | t |: : | '--------|----|:-:-----' .----..-.|----|:-:.----. f_flags: | f ||m|| t |: :| f | '----'|-||----|:-:'----' .----.|-||----||-|.----. m_flags: | i ||m|| t ||o|| m | |----||-|'----'|-||----| |----||-|------|-||----| i_flags: | i ||m| |o|| m | '----''-'------'-''----' The main downside of this layout is that some of the traversal flags, LFS_T_DIRTY/MUTATED, now risk ambiguity with open/mount flags. But I don't think this is really avoidable as traversals are already using almost the entire 32-bit encoding space... No code changes: code stack before: 36480 2680 after: 36480 (+0.0%) 2680 (+0.0%) --- lfs.c | 8 +++---- lfs.h | 72 +++++++++++++++++++++++++++++------------------------------ 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/lfs.c b/lfs.c index 52655737..398e9473 100644 --- a/lfs.c +++ b/lfs.c @@ -6672,8 +6672,8 @@ static inline bool lfsr_t_ismutated(uint32_t flags) { } static inline uint32_t lfsr_t_swapdirty(uint32_t flags) { - uint32_t x = ((flags >> 19) ^ (flags >> 18)) & 0x1; - return flags ^ (x << 19) ^ (x << 18); + uint32_t x = ((flags >> 9) ^ (flags >> 8)) & 0x1; + return flags ^ (x << 9) ^ (x << 8); } // mount flags @@ -13831,7 +13831,7 @@ int lfsr_fs_gc(lfs_t *lfs, lfs_soff_t steps, uint32_t flags) { uint32_t pending = flags & ( ((lfs->flags & ( LFS_I_HASORPHANS - | LFS_I_UNCOMPACTED)) >> 16) + | LFS_I_UNCOMPACTED)) >> 12) | ((lfsr_fs_canlookahead(lfs)) ? LFS_GC_LOOKAHEAD : 0) | LFS_GC_CKMETA | LFS_GC_CKDATA); @@ -13896,7 +13896,7 @@ int lfsr_fs_gc(lfs_t *lfs, lfs_soff_t steps, uint32_t flags) { pending &= ( ((lfs->flags & ( LFS_I_HASORPHANS - | LFS_I_UNCOMPACTED)) >> 16) + | LFS_I_UNCOMPACTED)) >> 12) | ((lfsr_fs_canlookahead(lfs)) ? LFS_GC_LOOKAHEAD : 0) // only consider our filesystem checked if we // weren't mutated diff --git a/lfs.h b/lfs.h index 927a256e..68809a8e 100644 --- a/lfs.h +++ b/lfs.h @@ -136,8 +136,8 @@ enum lfs_type { #define LFS_O_FLUSH 0x00000040 // Flush data on every write #define LFS_O_SYNC 0x00000080 // Sync metadata on every write #define LFS_O_DESYNC 0x00000100 // Do not sync or recieve file updates -#define LFS_O_CKMETA 0x00001000 // Check metadata checksums -#define LFS_O_CKDATA 0x00002000 // Check metadata + data checksums +#define LFS_O_CKMETA 0x00010000 // Check metadata checksums +#define LFS_O_CKDATA 0x00020000 // Check metadata + data checksums // internally used flags, don't use these #define LFS_O_TYPE 0xff000000 // The file's type @@ -153,42 +153,42 @@ enum lfs_type { // Filesystem format flags #define LFS_F_RDWR 0 // Format the filesystem as read and write -#define LFS_F_CKPROGS 0x00000010 // Check progs by reading back progged data +#define LFS_F_CKPROGS 0x00100000 // Check progs by reading back progged data #ifdef LFS_CKREADS -#define LFS_F_CKREADS 0x00000020 // Check reads via parity bits/checksums +#define LFS_F_CKREADS 0x00200000 // Check reads via parity bits/checksums #endif -#define LFS_F_MTREEONLY 0x00010000 // Only traverse the mtree -#define LFS_F_COMPACT 0x00000800 // Compact metadata logs -#define LFS_F_CKMETA 0x00001000 // Check metadata checksums -#define LFS_F_CKDATA 0x00002000 // Check metadata + data checksums +#define LFS_F_MTREEONLY 0x00000800 // Only traverse the mtree +#define LFS_F_COMPACT 0x00008000 // Compact metadata logs +#define LFS_F_CKMETA 0x00010000 // Check metadata checksums +#define LFS_F_CKDATA 0x00020000 // Check metadata + data checksums // Filesystem mount flags #define LFS_M_RDWR 0 // Mount the filesystem as read and write #define LFS_M_RDONLY 1 // Mount the filesystem as read only -#define LFS_M_CKPROGS 0x00000010 // Check progs by reading back progged data -#ifdef LFS_CKREADS -#define LFS_M_CKREADS 0x00000020 // Check reads via parity bits/checksums -#endif #define LFS_M_FLUSH 0x00000040 // Open all files with LFS_O_FLUSH #define LFS_M_SYNC 0x00000080 // Open all files with LFS_O_SYNC +#define LFS_M_CKPROGS 0x00100000 // Check progs by reading back progged data +#ifdef LFS_CKREADS +#define LFS_M_CKREADS 0x00200000 // Check reads via parity bits/checksums +#endif -#define LFS_M_MTREEONLY 0x00010000 // Only traverse the mtree +#define LFS_M_MTREEONLY 0x00000800 // Only traverse the mtree #define LFS_M_MKCONSISTENT \ - 0x00000100 // Make the filesystem consistent -#define LFS_M_LOOKAHEAD 0x00000200 // Populate lookahead buffer -#define LFS_M_COMPACT 0x00000800 // Compact metadata logs -#define LFS_M_CKMETA 0x00001000 // Check metadata checksums -#define LFS_M_CKDATA 0x00002000 // Check metadata + data checksums + 0x00001000 // Make the filesystem consistent +#define LFS_M_LOOKAHEAD 0x00002000 // Populate lookahead buffer +#define LFS_M_COMPACT 0x00008000 // Compact metadata logs +#define LFS_M_CKMETA 0x00010000 // Check metadata checksums +#define LFS_M_CKDATA 0x00020000 // Check metadata + data checksums // Filesystem info flags #define LFS_I_RDONLY 0x00000001 // Filesystem mounted read only -#define LFS_I_CKPROGS 0x00000010 // Filesystem mounted with LFS_M_CKPROGS -#ifdef LFS_CKREADS -#define LFS_I_CKREADS 0x00000020 // Filesystem mounted with LFS_M_CKREADS -#endif #define LFS_I_FLUSH 0x00000040 // Filesystem mounted with LFS_M_FLUSH #define LFS_I_SYNC 0x00000080 // Filesystem mounted with LFS_M_SYNC +#define LFS_I_CKPROGS 0x00100000 // Filesystem mounted with LFS_M_CKPROGS +#ifdef LFS_CKREADS +#define LFS_I_CKREADS 0x00200000 // Filesystem mounted with LFS_M_CKREADS +#endif #define LFS_I_INCONSISTENT \ 0x01000000 // Filesystem needs mkconsistent to write @@ -210,30 +210,30 @@ enum lfs_btype { }; // Traversal flags -#define LFS_T_MTREEONLY 0x00010000 // Only traverse the mtree +#define LFS_T_MTREEONLY 0x00000800 // Only traverse the mtree #define LFS_T_MKCONSISTENT \ - 0x00000100 // Make the filesystem consistent -#define LFS_T_LOOKAHEAD 0x00000200 // Populate lookahead buffer -#define LFS_T_COMPACT 0x00000800 // Compact metadata logs -#define LFS_T_CKMETA 0x00001000 // Check metadata checksums -#define LFS_T_CKDATA 0x00002000 // Check metadata + data checksums + 0x00001000 // Make the filesystem consistent +#define LFS_T_LOOKAHEAD 0x00002000 // Populate lookahead buffer +#define LFS_T_COMPACT 0x00008000 // Compact metadata logs +#define LFS_T_CKMETA 0x00010000 // Check metadata checksums +#define LFS_T_CKDATA 0x00020000 // Check metadata + data checksums // internally used flags, don't use these #define LFS_T_TSTATE 0x0000000f // The current traversal state #define LFS_T_BTYPE 0x000000f0 // The current traversal btype -#define LFS_T_DIRTY 0x00040000 // Filesystem modified during traversal -#define LFS_T_MUTATED 0x00080000 // Filesystem modified by traversal +#define LFS_T_DIRTY 0x00000100 // Filesystem modified during traversal +#define LFS_T_MUTATED 0x00000200 // Filesystem modified by traversal // GC flags #define LFS_GC_MTREEONLY \ - 0x00010000 // Only traverse the mtree + 0x00000800 // Only traverse the mtree #define LFS_GC_MKCONSISTENT \ - 0x00000100 // Make the filesystem consistent + 0x00001000 // Make the filesystem consistent #define LFS_GC_LOOKAHEAD \ - 0x00000200 // Populate lookahead buffer -#define LFS_GC_COMPACT 0x00000800 // Compact metadata logs -#define LFS_GC_CKMETA 0x00001000 // Check metadata checksums -#define LFS_GC_CKDATA 0x00002000 // Check metadata + data checksums + 0x00002000 // Populate lookahead buffer +#define LFS_GC_COMPACT 0x00008000 // Compact metadata logs +#define LFS_GC_CKMETA 0x00010000 // Check metadata checksums +#define LFS_GC_CKDATA 0x00020000 // Check metadata + data checksums // Configuration provided during initialization of the littlefs