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.
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user