From 2d68db965bec4ce70db4f98923ee178b9a7989fb Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Thu, 13 Nov 2025 15:46:15 -0600 Subject: [PATCH] Rearranged on-disk compat flags Other than moving things around to make space for planned features, this also adopts the idea of allowing compat flags to be ored into a single 32-bit integer, at least in the short-term. Note though that these are still stored in separate wcompat/rcompat tags, to make compat tests easier, and we may introduce conflicting flags in the future if we run out of 32-bits. This is just an indulgence to potentially make tooling/debugging easier until that happens. Rcompat flags: RCOMPAT_NONSTANDARD+ 0x00000001 ---- ---- ---- ---- ---- ---- ---- ---1 RCOMPAT_WRONLY+ 0x00000004 ---- ---- ---- ---- ---- ---- ---- -1-- RCOMPAT_MMOSS 0x00000010 ---- ---- ---- ---- ---- ---- ---1 ---- RCOMPAT_MSPROUT+ 0x00000020 ---- ---- ---- ---- ---- ---- --1- ---- RCOMPAT_MSHRUB+ 0x00000040 ---- ---- ---- ---- ---- ---- -1-- ---- RCOMPAT_MTREE 0x00000080 ---- ---- ---- ---- ---- ---- 1--- ---- RCOMPAT_BMOSS+ 0x00000100 ---- ---- ---- ---- ---- ---1 ---- ---- RCOMPAT_BSPROUT+ 0x00000200 ---- ---- ---- ---- ---- --1- ---- ---- RCOMPAT_BSHRUB 0x00000400 ---- ---- ---- ---- ---- -1-- ---- ---- RCOMPAT_BTREE 0x00000800 ---- ---- ---- ---- ---- 1--- ---- ---- RCOMPAT_MDIRR1* 0x00001000 ---- ---- ---- ---- ---1 ---- ---- ---- RCOMPAT_MDIRR2* 0x00002000 ---- ---- ---- ---- --1- ---- ---- ---- RCOMPAT_MDIRR3* 0x00003000 ---- ---- ---- ---- --11 ---- ---- ---- RCOMPAT_BTREER1* 0x00004000 ---- ---- ---- ---- -1-- ---- ---- ---- RCOMPAT_BTREER2* 0x00008000 ---- ---- ---- ---- 1--- ---- ---- ---- RCOMPAT_BTREER3* 0x0000c000 ---- ---- ---- ---- 11-- ---- ---- ---- RCOMPAT_GRM 0x00010000 ---- ---- ---- ---1 ---- ---- ---- ---- RCOMPAT_GMV? 0x00020000 ---- ---- ---- --1- ---- ---- ---- ---- RCOMPAT_GDDTREE* 0x00100000 ---- ---- ---1 ---- ---- ---- ---- ---- RCOMPAT_GPTREE* 0x00200000 ---- ---- --1- ---- ---- ---- ---- ---- RCOMPAT_DATAR1* 0x00400000 ---- ---- -1-- ---- ---- ---- ---- ---- RCOMPAT_DATAR2* 0x00800000 ---- ---- 1--- ---- ---- ---- ---- ---- RCOMPAT_DATAR3* 0x00c00000 ---- ---- 11-- ---- ---- ---- ---- ---- rcompat_OVERFLOW+ 0x80000000 1--- ---- ---- ---- ---- ---- ---- ---- * Planned + Reserved ? Hypothetical Wcompat flags: WCOMPAT_NONSTANDARD+ 0x00000001 ---- ---- ---- ---- ---- ---- ---- ---1 WCOMPAT_RDONLY+ 0x00000002 ---- ---- ---- ---- ---- ---- ---- --1- WCOMPAT_GCKSUM 0x00040000 ---- ---- ---- -1-- ---- ---- ---- ---- WCOMPAT_GBMAP 0x00080000 ---- ---- ---- 1--- ---- ---- ---- ---- WCOMPAT_DIR 0x01000000 ---- ---1 ---- ---- ---- ---- ---- ---- WCOMPAT_SYMLINK? 0x02000000 ---- --1- ---- ---- ---- ---- ---- ---- WCOMPAT_SNAPSHOT? 0x04000000 ---- -1-- ---- ---- ---- ---- ---- ---- wcompat_OVERFLOW+ 0x80000000 1--- ---- ---- ---- ---- ---- ---- ---- + Reserved ? Hypothetical Ocompat flags: OCOMPAT_NONSTANDARD+ 0x00000001 ---- ---- ---- ---- ---- ---- ---- ---1 ocompat_OVERFLOW+ 0x80000000 1--- ---- ---- ---- ---- ---- ---- ---- + Reserved Other notes: - M* and B* struct flags were reordered to match META -> DATA order elsewhere. This no longer matches the tag ordering, but there's an argument the B* tags apply more generally (all btrees) than the B* compat flag (only file btrees). - MDIR/BTREE/DATA redund flags were moved near relevant flags, rather than sticking them in the higher-order bits as we are planning to do in the M_*/F_* flags. The compat flags already won't match because of the mdir/btree split (which is IMO too much detail to include in M_*/F_* flags, but hard to argue against in the compat flags), and this keeps the highest bit free for OVERFLOW, which is useful internally. - Moving DIR to the current-highest bit makes it easy to add 6 more file types (7 if you ignore OVERFLOW), before things start getting cramped. No code changes. --- lfs3.c | 38 +++++++++++++++++++------------------- scripts/dbgbmap.py | 26 +++++++++++++------------- scripts/dbgbmapsvg.py | 27 ++++++++++++++------------- scripts/dbgflags.py | 26 +++++++++++++------------- scripts/dbglfs3.py | 26 +++++++++++++------------- 5 files changed, 72 insertions(+), 71 deletions(-) diff --git a/lfs3.c b/lfs3.c index a6a9e275..787b7a76 100644 --- a/lfs3.c +++ b/lfs3.c @@ -15267,24 +15267,24 @@ static int lfs3_deinit(lfs3_t *lfs3) { // note, "understanding" does not necessarily mean support // #define LFS3_RCOMPAT_NONSTANDARD 0x00000001 // Non-standard filesystem format -#define LFS3_RCOMPAT_WRONLY 0x00000002 // Reading is disallowed -#define LFS3_RCOMPAT_BMOSS 0x00000010 // Files may use inlined data -#define LFS3_RCOMPAT_BSPROUT 0x00000020 // Files may use block pointers -#define LFS3_RCOMPAT_BSHRUB 0x00000040 // Files may use inlined btrees -#define LFS3_RCOMPAT_BTREE 0x00000080 // Files may use btrees -#define LFS3_RCOMPAT_MMOSS 0x00000100 // May use an inlined mdir -#define LFS3_RCOMPAT_MSPROUT 0x00000200 // May use an mdir pointer -#define LFS3_RCOMPAT_MSHRUB 0x00000400 // May use an inlined mtree -#define LFS3_RCOMPAT_MTREE 0x00000800 // May use an mtree -#define LFS3_RCOMPAT_GRM 0x00001000 // Global-remove in use +#define LFS3_RCOMPAT_WRONLY 0x00000004 // Reading is disallowed +#define LFS3_RCOMPAT_MMOSS 0x00000010 // May use an inlined mdir +#define LFS3_RCOMPAT_MSPROUT 0x00000020 // May use an mdir pointer +#define LFS3_RCOMPAT_MSHRUB 0x00000040 // May use an inlined mtree +#define LFS3_RCOMPAT_MTREE 0x00000080 // May use an mtree +#define LFS3_RCOMPAT_BMOSS 0x00000100 // Files may use inlined data +#define LFS3_RCOMPAT_BSPROUT 0x00000200 // Files may use block pointers +#define LFS3_RCOMPAT_BSHRUB 0x00000400 // Files may use inlined btrees +#define LFS3_RCOMPAT_BTREE 0x00000800 // Files may use btrees +#define LFS3_RCOMPAT_GRM 0x00010000 // Global-remove in use // internal #define LFS3_rcompat_OVERFLOW 0x80000000 // Can't represent all flags #define LFS3_WCOMPAT_NONSTANDARD 0x00000001 // Non-standard filesystem format #define LFS3_WCOMPAT_RDONLY 0x00000002 // Writing is disallowed -#define LFS3_WCOMPAT_DIR 0x00000010 // Directory files in use -#define LFS3_WCOMPAT_GCKSUM 0x00001000 // Global-checksum in use -#define LFS3_WCOMPAT_GBMAP 0x00002000 // Global on-disk block-map in use +#define LFS3_WCOMPAT_GCKSUM 0x00040000 // Global-checksum in use +#define LFS3_WCOMPAT_GBMAP 0x00080000 // Global on-disk block-map in use +#define LFS3_WCOMPAT_DIR 0x01000000 // Directory files in use // internal #define LFS3_wcompat_OVERFLOW 0x80000000 // Can't represent all flags @@ -15303,20 +15303,20 @@ static inline bool lfs3_wcompat_isgbmap(lfs3_wcompat_t flags) { // figure out what compat flags the current fs configuration needs static inline lfs3_rcompat_t lfs3_rcompat(const lfs3_t *lfs3) { (void)lfs3; - return LFS3_RCOMPAT_BSHRUB - | LFS3_RCOMPAT_BTREE - | LFS3_RCOMPAT_MMOSS + return LFS3_RCOMPAT_MMOSS | LFS3_RCOMPAT_MTREE + | LFS3_RCOMPAT_BSHRUB + | LFS3_RCOMPAT_BTREE | LFS3_RCOMPAT_GRM; } static inline lfs3_wcompat_t lfs3_wcompat(const lfs3_t *lfs3) { (void)lfs3; - return LFS3_WCOMPAT_DIR - | LFS3_WCOMPAT_GCKSUM + return LFS3_WCOMPAT_GCKSUM | LFS3_IFDEF_GBMAP( (lfs3_f_isgbmap(lfs3->flags)) ? LFS3_WCOMPAT_GBMAP : 0, - 0); + 0) + | LFS3_WCOMPAT_DIR; } static inline lfs3_ocompat_t lfs3_ocompat(const lfs3_t *lfs3) { diff --git a/scripts/dbgbmap.py b/scripts/dbgbmap.py index 8e37441f..ca82a0bf 100755 --- a/scripts/dbgbmap.py +++ b/scripts/dbgbmap.py @@ -95,22 +95,22 @@ SI2_PREFIXES = { RCOMPAT_NONSTANDARD = 0x00000001 # Non-standard filesystem format -RCOMPAT_WRONLY = 0x00000002 # Reading is disallowed -RCOMPAT_BMOSS = 0x00000010 # Files may use inlined data -RCOMPAT_BSPROUT = 0x00000020 # Files may use block pointers -RCOMPAT_BSHRUB = 0x00000040 # Files may use inlined btrees -RCOMPAT_BTREE = 0x00000080 # Files may use btrees -RCOMPAT_MMOSS = 0x00000100 # May use an inlined mdir -RCOMPAT_MSPROUT = 0x00000200 # May use an mdir pointer -RCOMPAT_MSHRUB = 0x00000400 # May use an inlined mtree -RCOMPAT_MTREE = 0x00000800 # May use an mdir btree -RCOMPAT_GRM = 0x00001000 # Global-remove in use +RCOMPAT_WRONLY = 0x00000004 # Reading is disallowed +RCOMPAT_MMOSS = 0x00000010 # May use an inlined mdir +RCOMPAT_MSPROUT = 0x00000020 # May use an mdir pointer +RCOMPAT_MSHRUB = 0x00000040 # May use an inlined mtree +RCOMPAT_MTREE = 0x00000080 # May use an mdir btree +RCOMPAT_BMOSS = 0x00000100 # Files may use inlined data +RCOMPAT_BSPROUT = 0x00000200 # Files may use block pointers +RCOMPAT_BSHRUB = 0x00000400 # Files may use inlined btrees +RCOMPAT_BTREE = 0x00000800 # Files may use btrees +RCOMPAT_GRM = 0x00010000 # Global-remove in use WCOMPAT_NONSTANDARD = 0x00000001 # Non-standard filesystem format WCOMPAT_RDONLY = 0x00000002 # Writing is disallowed -WCOMPAT_DIR = 0x00000010 # Directory file types in use -WCOMPAT_GCKSUM = 0x00001000 # Global-checksum in use -WCOMPAT_GBMAP = 0x00002000 # Global on-disk block-map in use +WCOMPAT_GCKSUM = 0x00040000 # Global-checksum in use +WCOMPAT_GBMAP = 0x00080000 # Global on-disk block-map in use +WCOMPAT_DIR = 0x01000000 # Directory file types in use TAG_NULL = 0x0000 ## v--- ---- +--- ---- TAG_CONFIG = 0x0000 ## v--- ---- +ttt tttt diff --git a/scripts/dbgbmapsvg.py b/scripts/dbgbmapsvg.py index ea9a0203..9d441280 100755 --- a/scripts/dbgbmapsvg.py +++ b/scripts/dbgbmapsvg.py @@ -113,23 +113,24 @@ SI2_PREFIXES = { } + RCOMPAT_NONSTANDARD = 0x00000001 # Non-standard filesystem format -RCOMPAT_WRONLY = 0x00000002 # Reading is disallowed -RCOMPAT_BMOSS = 0x00000010 # Files may use inlined data -RCOMPAT_BSPROUT = 0x00000020 # Files may use block pointers -RCOMPAT_BSHRUB = 0x00000040 # Files may use inlined btrees -RCOMPAT_BTREE = 0x00000080 # Files may use btrees -RCOMPAT_MMOSS = 0x00000100 # May use an inlined mdir -RCOMPAT_MSPROUT = 0x00000200 # May use an mdir pointer -RCOMPAT_MSHRUB = 0x00000400 # May use an inlined mtree -RCOMPAT_MTREE = 0x00000800 # May use an mdir btree -RCOMPAT_GRM = 0x00001000 # Global-remove in use +RCOMPAT_WRONLY = 0x00000004 # Reading is disallowed +RCOMPAT_MMOSS = 0x00000010 # May use an inlined mdir +RCOMPAT_MSPROUT = 0x00000020 # May use an mdir pointer +RCOMPAT_MSHRUB = 0x00000040 # May use an inlined mtree +RCOMPAT_MTREE = 0x00000080 # May use an mdir btree +RCOMPAT_BMOSS = 0x00000100 # Files may use inlined data +RCOMPAT_BSPROUT = 0x00000200 # Files may use block pointers +RCOMPAT_BSHRUB = 0x00000400 # Files may use inlined btrees +RCOMPAT_BTREE = 0x00000800 # Files may use btrees +RCOMPAT_GRM = 0x00010000 # Global-remove in use WCOMPAT_NONSTANDARD = 0x00000001 # Non-standard filesystem format WCOMPAT_RDONLY = 0x00000002 # Writing is disallowed -WCOMPAT_DIR = 0x00000010 # Directory file types in use -WCOMPAT_GCKSUM = 0x00001000 # Global-checksum in use -WCOMPAT_GBMAP = 0x00002000 # Global on-disk block-map in use +WCOMPAT_GCKSUM = 0x00040000 # Global-checksum in use +WCOMPAT_GBMAP = 0x00080000 # Global on-disk block-map in use +WCOMPAT_DIR = 0x01000000 # Directory file types in use TAG_NULL = 0x0000 ## v--- ---- +--- ---- TAG_CONFIG = 0x0000 ## v--- ---- +ttt tttt diff --git a/scripts/dbgflags.py b/scripts/dbgflags.py index a9a63667..11b60daf 100755 --- a/scripts/dbgflags.py +++ b/scripts/dbgflags.py @@ -170,24 +170,24 @@ alloc_ERASE = 0x00000001 # i- Please erase the block # Read-compat flags RCOMPAT_NONSTANDARD = 0x00000001 # -- Non-standard filesystem format -RCOMPAT_WRONLY = 0x00000002 # -- Reading is disallowed -RCOMPAT_BMOSS = 0x00000010 # -- Files may use inlined data -RCOMPAT_BSPROUT = 0x00000020 # -- Files may use block pointers -RCOMPAT_BSHRUB = 0x00000040 # -- Files may use inlined btrees -RCOMPAT_BTREE = 0x00000080 # -- Files may use btrees -RCOMPAT_MMOSS = 0x00000100 # -- May use an inlined mdir -RCOMPAT_MSPROUT = 0x00000200 # -- May use an mdir pointer -RCOMPAT_MSHRUB = 0x00000400 # -- May use an inlined mtree -RCOMPAT_MTREE = 0x00000800 # -- May use an mdir btree -RCOMPAT_GRM = 0x00001000 # -- Global-remove in use +RCOMPAT_WRONLY = 0x00000004 # -- Reading is disallowed +RCOMPAT_MMOSS = 0x00000010 # -- May use an inlined mdir +RCOMPAT_MSPROUT = 0x00000020 # -- May use an mdir pointer +RCOMPAT_MSHRUB = 0x00000040 # -- May use an inlined mtree +RCOMPAT_MTREE = 0x00000080 # -- May use an mdir btree +RCOMPAT_BMOSS = 0x00000100 # -- Files may use inlined data +RCOMPAT_BSPROUT = 0x00000200 # -- Files may use block pointers +RCOMPAT_BSHRUB = 0x00000400 # -- Files may use inlined btrees +RCOMPAT_BTREE = 0x00000800 # -- Files may use btrees +RCOMPAT_GRM = 0x00010000 # -- Global-remove in use rcompat_OVERFLOW = 0x80000000 # i- Can't represent all flags # Write-compat flags WCOMPAT_NONSTANDARD = 0x00000001 # -- Non-standard filesystem format WCOMPAT_RDONLY = 0x00000002 # -- Writing is disallowed -WCOMPAT_DIR = 0x00000010 # -- Directory file types in use -WCOMPAT_GCKSUM = 0x00001000 # -- Global-checksum in use -WCOMPAT_GBMAP = 0x00002000 # -- Global on-disk block-map in use +WCOMPAT_GCKSUM = 0x00040000 # -- Global-checksum in use +WCOMPAT_GBMAP = 0x00080000 # -- Global on-disk block-map in use +WCOMPAT_DIR = 0x01000000 # -- Directory file types in use wcompat_OVERFLOW = 0x80000000 # i- Can't represent all flags # Optional-compat flags diff --git a/scripts/dbglfs3.py b/scripts/dbglfs3.py index 37a7cf27..28b0c014 100755 --- a/scripts/dbglfs3.py +++ b/scripts/dbglfs3.py @@ -20,22 +20,22 @@ except ModuleNotFoundError: RCOMPAT_NONSTANDARD = 0x00000001 # Non-standard filesystem format -RCOMPAT_WRONLY = 0x00000002 # Reading is disallowed -RCOMPAT_BMOSS = 0x00000010 # Files may use inlined data -RCOMPAT_BSPROUT = 0x00000020 # Files may use block pointers -RCOMPAT_BSHRUB = 0x00000040 # Files may use inlined btrees -RCOMPAT_BTREE = 0x00000080 # Files may use btrees -RCOMPAT_MMOSS = 0x00000100 # May use an inlined mdir -RCOMPAT_MSPROUT = 0x00000200 # May use an mdir pointer -RCOMPAT_MSHRUB = 0x00000400 # May use an inlined mtree -RCOMPAT_MTREE = 0x00000800 # May use an mdir btree -RCOMPAT_GRM = 0x00001000 # Global-remove in use +RCOMPAT_WRONLY = 0x00000004 # Reading is disallowed +RCOMPAT_MMOSS = 0x00000010 # May use an inlined mdir +RCOMPAT_MSPROUT = 0x00000020 # May use an mdir pointer +RCOMPAT_MSHRUB = 0x00000040 # May use an inlined mtree +RCOMPAT_MTREE = 0x00000080 # May use an mdir btree +RCOMPAT_BMOSS = 0x00000100 # Files may use inlined data +RCOMPAT_BSPROUT = 0x00000200 # Files may use block pointers +RCOMPAT_BSHRUB = 0x00000400 # Files may use inlined btrees +RCOMPAT_BTREE = 0x00000800 # Files may use btrees +RCOMPAT_GRM = 0x00010000 # Global-remove in use WCOMPAT_NONSTANDARD = 0x00000001 # Non-standard filesystem format WCOMPAT_RDONLY = 0x00000002 # Writing is disallowed -WCOMPAT_DIR = 0x00000010 # Directory file types in use -WCOMPAT_GCKSUM = 0x00001000 # Global-checksum in use -WCOMPAT_GBMAP = 0x00002000 # Global on-disk block-map in use +WCOMPAT_GCKSUM = 0x00040000 # Global-checksum in use +WCOMPAT_GBMAP = 0x00080000 # Global on-disk block-map in use +WCOMPAT_DIR = 0x01000000 # Directory file types in use TAG_NULL = 0x0000 ## v--- ---- +--- ---- TAG_CONFIG = 0x0000 ## v--- ---- +ttt tttt