Added LFS3_F_REGBMAP and LFS3_F_COMPACTMETA

These are unlikely to make much progress, but that doesn't seem like a
great reason to disallow these flags in lfs3_format:

  LFS3_F_REGBMAP      0x00002000  Repopulate the gbmap
  LFS3_F_COMPACTMETA  0x00008000  Compact metadata logs

These are actually guaranteed to do _no_ work when formatting _without_
the gbmap, but with the gbmap it's less clear. Looking forward to the
planned ckfactory feature, these may be useful for cleaning up any rbyd
commits created as a part of building the initial gbmap.

---

Also tweaked the formatting for LFS3_F_* flags a bit, including making
all ifdefs explicit (mainly ifdef LFS3_RDONLY). Mixed ifdefs are a real
pain to read.

No code changes.
This commit is contained in:
Christopher Haster
2025-11-13 02:29:12 -06:00
parent 9e75138f7a
commit b01a385bc9
4 changed files with 62 additions and 33 deletions

32
lfs3.c
View File

@ -15870,7 +15870,7 @@ int lfs3_mount(lfs3_t *lfs3, uint32_t flags,
flags |= LFS3_M_RELOOKAHEAD; flags |= LFS3_M_RELOOKAHEAD;
#endif #endif
#ifdef LFS3_YES_REGBMAP #ifdef LFS3_YES_REGBMAP
flags |= LFS3_YES_REGBMAP; flags |= LFS3_M_REGBMAP;
#endif #endif
#ifdef LFS3_YES_COMPACTMETA #ifdef LFS3_YES_COMPACTMETA
flags |= LFS3_M_COMPACTMETA; flags |= LFS3_M_COMPACTMETA;
@ -16159,6 +16159,9 @@ static int lfs3_formatinited(lfs3_t *lfs3) {
#ifndef LFS3_RDONLY #ifndef LFS3_RDONLY
int lfs3_format(lfs3_t *lfs3, uint32_t flags, int lfs3_format(lfs3_t *lfs3, uint32_t flags,
const struct lfs3_cfg *cfg) { const struct lfs3_cfg *cfg) {
#ifdef LFS3_YES_GBMAP
flags |= LFS3_F_GBMAP;
#endif
#ifdef LFS3_YES_REVDBG #ifdef LFS3_YES_REVDBG
flags |= LFS3_F_REVDBG; flags |= LFS3_F_REVDBG;
#endif #endif
@ -16177,39 +16180,44 @@ int lfs3_format(lfs3_t *lfs3, uint32_t flags,
#ifdef LFS3_YES_CKDATACKSUMS #ifdef LFS3_YES_CKDATACKSUMS
flags |= LFS3_F_CKDATACKSUMS; flags |= LFS3_F_CKDATACKSUMS;
#endif #endif
#ifdef LFS3_YES_REGBMAP
flags |= LFS3_F_REGBMAP;
#endif
#ifdef LFS3_YES_COMPACTMETA
flags |= LFS3_F_COMPACTMETA;
#endif
#ifdef LFS3_YES_CKMETA #ifdef LFS3_YES_CKMETA
flags |= LFS3_F_CKMETA; flags |= LFS3_F_CKMETA;
#endif #endif
#ifdef LFS3_YES_CKDATA #ifdef LFS3_YES_CKDATA
flags |= LFS3_F_CKDATA; flags |= LFS3_F_CKDATA;
#endif #endif
#ifdef LFS3_YES_GBMAP
flags |= LFS3_F_GBMAP;
#endif
// unknown flags? // unknown flags?
LFS3_ASSERT((flags & ~( LFS3_ASSERT((flags & ~(
LFS3_F_RDWR LFS3_F_RDWR
| LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, 0)
| LFS3_IFDEF_REVDBG(LFS3_F_REVDBG, 0) | LFS3_IFDEF_REVDBG(LFS3_F_REVDBG, 0)
| LFS3_IFDEF_REVNOISE(LFS3_F_REVNOISE, 0) | LFS3_IFDEF_REVNOISE(LFS3_F_REVNOISE, 0)
| LFS3_IFDEF_CKPROGS(LFS3_F_CKPROGS, 0) | LFS3_IFDEF_CKPROGS(LFS3_F_CKPROGS, 0)
| LFS3_IFDEF_CKFETCHES(LFS3_F_CKFETCHES, 0) | LFS3_IFDEF_CKFETCHES(LFS3_F_CKFETCHES, 0)
| LFS3_IFDEF_CKMETAPARITY(LFS3_F_CKMETAPARITY, 0) | LFS3_IFDEF_CKMETAPARITY(LFS3_F_CKMETAPARITY, 0)
| LFS3_IFDEF_CKDATACKSUMS(LFS3_F_CKDATACKSUMS, 0) | LFS3_IFDEF_CKDATACKSUMS(LFS3_F_CKDATACKSUMS, 0)
| LFS3_IFDEF_GBMAP(LFS3_F_REGBMAP, 0)
| LFS3_F_COMPACTMETA
| LFS3_F_CKMETA | LFS3_F_CKMETA
| LFS3_F_CKDATA | LFS3_F_CKDATA)) == 0);
| LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, 0))) == 0);
int err = lfs3_init(lfs3, int err = lfs3_init(lfs3,
flags & ( flags & (
LFS3_F_RDWR LFS3_F_RDWR
| LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, 0)
| LFS3_IFDEF_REVDBG(LFS3_F_REVDBG, 0) | LFS3_IFDEF_REVDBG(LFS3_F_REVDBG, 0)
| LFS3_IFDEF_REVNOISE(LFS3_F_REVNOISE, 0) | LFS3_IFDEF_REVNOISE(LFS3_F_REVNOISE, 0)
| LFS3_IFDEF_CKPROGS(LFS3_F_CKPROGS, 0) | LFS3_IFDEF_CKPROGS(LFS3_F_CKPROGS, 0)
| LFS3_IFDEF_CKFETCHES(LFS3_F_CKFETCHES, 0) | LFS3_IFDEF_CKFETCHES(LFS3_F_CKFETCHES, 0)
| LFS3_IFDEF_CKMETAPARITY(LFS3_F_CKMETAPARITY, 0) | LFS3_IFDEF_CKMETAPARITY(LFS3_F_CKMETAPARITY, 0)
| LFS3_IFDEF_CKDATACKSUMS(LFS3_F_CKDATACKSUMS, 0) | LFS3_IFDEF_CKDATACKSUMS(LFS3_F_CKDATACKSUMS, 0)),
| LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, 0)),
cfg); cfg);
if (err) { if (err) {
return err; return err;
@ -16234,12 +16242,16 @@ int lfs3_format(lfs3_t *lfs3, uint32_t flags,
// run gc if requested // run gc if requested
if (flags & ( if (flags & (
LFS3_F_CKMETA LFS3_IFDEF_GBMAP(LFS3_F_REGBMAP, 0)
| LFS3_F_COMPACTMETA
| LFS3_F_CKMETA
| LFS3_F_CKDATA)) { | LFS3_F_CKDATA)) {
lfs3_mgc_t mgc; lfs3_mgc_t mgc;
err = lfs3_fs_gc_(lfs3, &mgc, err = lfs3_fs_gc_(lfs3, &mgc,
flags & ( flags & (
LFS3_F_CKMETA LFS3_IFDEF_GBMAP(LFS3_F_REGBMAP, 0)
| LFS3_F_COMPACTMETA
| LFS3_F_CKMETA
| LFS3_F_CKDATA), | LFS3_F_CKDATA),
-1); -1);
if (err) { if (err) {

45
lfs3.h
View File

@ -168,35 +168,46 @@ enum lfs3_type {
// Filesystem format flags // Filesystem format flags
#ifndef LFS3_RDONLY #ifndef LFS3_RDONLY
#define LFS3_F_MODE 1 // Format's access mode #define LFS3_F_MODE 1 // Format's access mode
#endif
#ifndef LFS3_RDONLY
#define LFS3_F_RDWR 0 // Format the filesystem as read and write #define LFS3_F_RDWR 0 // Format the filesystem as read and write
#ifdef LFS3_REVDBG #endif
#if !defined(LFS3_RDONLY) && defined(LFS3_GBMAP)
#define LFS3_F_GBMAP 0x02000000 // Use the global on-disk block-map
#endif
#if !defined(LFS3_RDONLY) && defined(LFS3_REVDBG)
#define LFS3_F_REVDBG 0x00000010 // Add debug info to revision counts #define LFS3_F_REVDBG 0x00000010 // Add debug info to revision counts
#endif #endif
#ifdef LFS3_REVNOISE #if !defined(LFS3_RDONLY) && defined(LFS3_REVNOISE)
#define LFS3_F_REVNOISE 0x00000020 // Add noise to revision counts #define LFS3_F_REVNOISE 0x00000020 // Add noise to revision counts
#endif #endif
#ifdef LFS3_CKPROGS #if !defined(LFS3_RDONLY) && defined(LFS3_CKPROGS)
#define LFS3_F_CKPROGS 0x00100000 // Check progs by reading back progged data #define LFS3_F_CKPROGS 0x00100000 // Check progs by reading back progged data
#endif #endif
#ifdef LFS3_CKFETCHES #if !defined(LFS3_RDONLY) && defined(LFS3_CKFETCHES)
#define LFS3_F_CKFETCHES \ #define LFS3_F_CKFETCHES \
0x00200000 // Check block checksums before first use 0x00200000 // Check block checksums before first use
#endif #endif
#ifdef LFS3_CKMETAPARITY #if !defined(LFS3_RDONLY) && defined(LFS3_CKMETAPARITY)
#define LFS3_F_CKMETAPARITY \ #define LFS3_F_CKMETAPARITY \
0x00400000 // Check metadata tag parity bits 0x00400000 // Check metadata tag parity bits
#endif #endif
#ifdef LFS3_CKDATACKSUMS #if !defined(LFS3_RDONLY) && defined(LFS3_CKDATACKSUMS)
#define LFS3_F_CKDATACKSUMS \ #define LFS3_F_CKDATACKSUMS \
0x01000000 // Check data checksums on reads 0x01000000 // Check data checksums on reads
#endif #endif
#if !defined(LFS3_RDONLY) && defined(LFS3_GBMAP)
#define LFS3_F_CKMETA 0x00010000 // Check metadata checksums #define LFS3_F_REGBMAP 0x00002000 // Repopulate the gbmap
#define LFS3_F_CKDATA 0x00020000 // Check metadata + data checksums
#endif #endif
#ifndef LFS3_RDONLY
#ifdef LFS3_GBMAP #define LFS3_F_COMPACTMETA \
#define LFS3_F_GBMAP 0x02000000 // Use the global on-disk block-map 0x00008000 // Compact metadata logs
#endif
#ifndef LFS3_RDONLY
#define LFS3_F_CKMETA 0x00010000 // Check metadata checksums
#endif
#ifndef LFS3_RDONLY
#define LFS3_F_CKDATA 0x00020000 // Check metadata + data checksums
#endif #endif
// Filesystem mount flags // Filesystem mount flags
@ -228,7 +239,6 @@ enum lfs3_type {
#define LFS3_M_CKDATACKSUMS \ #define LFS3_M_CKDATACKSUMS \
0x01000000 // Check data checksums on reads 0x01000000 // Check data checksums on reads
#endif #endif
#ifndef LFS3_RDONLY #ifndef LFS3_RDONLY
#define LFS3_M_MKCONSISTENT \ #define LFS3_M_MKCONSISTENT \
0x00000800 // Make the filesystem consistent 0x00000800 // Make the filesystem consistent
@ -247,9 +257,11 @@ enum lfs3_type {
#define LFS3_M_CKMETA 0x00010000 // Check metadata checksums #define LFS3_M_CKMETA 0x00010000 // Check metadata checksums
#define LFS3_M_CKDATA 0x00020000 // Check metadata + data checksums #define LFS3_M_CKDATA 0x00020000 // Check metadata + data checksums
// Filesystem info flags // Filesystem info flags
#define LFS3_I_RDONLY 0x00000001 // Mounted read only #define LFS3_I_RDONLY 0x00000001 // Mounted read only
#ifdef LFS3_GBMAP
#define LFS3_I_GBMAP 0x02000000 // Global on-disk block-map in use
#endif
#define LFS3_I_FLUSH 0x00000040 // Mounted with LFS3_M_FLUSH #define LFS3_I_FLUSH 0x00000040 // Mounted with LFS3_M_FLUSH
#define LFS3_I_SYNC 0x00000080 // Mounted with LFS3_M_SYNC #define LFS3_I_SYNC 0x00000080 // Mounted with LFS3_M_SYNC
#if !defined(LFS3_RDONLY) && defined(LFS3_REVDBG) #if !defined(LFS3_RDONLY) && defined(LFS3_REVDBG)
@ -273,7 +285,6 @@ enum lfs3_type {
#define LFS3_I_CKDATACKSUMS \ #define LFS3_I_CKDATACKSUMS \
0x01000000 // Mounted with LFS3_M_CKDATACKSUMS 0x01000000 // Mounted with LFS3_M_CKDATACKSUMS
#endif #endif
#ifndef LFS3_RDONLY #ifndef LFS3_RDONLY
#define LFS3_I_MKCONSISTENT \ #define LFS3_I_MKCONSISTENT \
0x00000800 // Filesystem needs mkconsistent to write 0x00000800 // Filesystem needs mkconsistent to write
@ -292,10 +303,6 @@ enum lfs3_type {
#define LFS3_I_CKMETA 0x00010000 // Metadata checksums not checked recently #define LFS3_I_CKMETA 0x00010000 // Metadata checksums not checked recently
#define LFS3_I_CKDATA 0x00020000 // Data checksums not checked recently #define LFS3_I_CKDATA 0x00020000 // Data checksums not checked recently
#ifdef LFS3_GBMAP
#define LFS3_I_GBMAP 0x02000000 // Global on-disk block-map in use
#endif
// Block types // Block types
enum lfs3_btype { enum lfs3_btype {

View File

@ -35,6 +35,7 @@ O_APPEND = 0x00000020 # -- Move to end of file on every write
O_FLUSH = 0x00000040 # y- Flush data on every write O_FLUSH = 0x00000040 # y- Flush data on every write
O_SYNC = 0x00000080 # y- Sync metadata on every write O_SYNC = 0x00000080 # y- Sync metadata on every write
O_DESYNC = 0x00100000 # -- Do not sync or recieve file updates O_DESYNC = 0x00100000 # -- Do not sync or recieve file updates
O_CKMETA = 0x00010000 # -- Check metadata checksums O_CKMETA = 0x00010000 # -- Check metadata checksums
O_CKDATA = 0x00020000 # -- Check metadata + data checksums O_CKDATA = 0x00020000 # -- Check metadata + data checksums
@ -70,6 +71,8 @@ A_LAZY = 0x04 # -- Only write attr if file changed
# Filesystem format flags # Filesystem format flags
F_MODE = 1 # -m Format's access mode F_MODE = 1 # -m Format's access mode
F_RDWR = 0 # -^ Format the filesystem as read and write F_RDWR = 0 # -^ Format the filesystem as read and write
F_GBMAP = 0x02000000 # y- Use the global on-disk block-map
F_REVDBG = 0x00000010 # y- Add debug info to revision counts F_REVDBG = 0x00000010 # y- Add debug info to revision counts
F_REVNOISE = 0x00000020 # y- Add noise to revision counts F_REVNOISE = 0x00000020 # y- Add noise to revision counts
F_CKPROGS = 0x00100000 # y- Check progs by reading back progged data F_CKPROGS = 0x00100000 # y- Check progs by reading back progged data
@ -77,11 +80,11 @@ F_CKFETCHES = 0x00200000 # y- Check block checksums before first use
F_CKMETAPARITY = 0x00400000 # y- Check metadata tag parity bits F_CKMETAPARITY = 0x00400000 # y- Check metadata tag parity bits
F_CKDATACKSUMS = 0x01000000 # y- Check data checksums on reads F_CKDATACKSUMS = 0x01000000 # y- Check data checksums on reads
F_REGBMAP = 0x00002000 # y- Repopulate the gbmap
F_COMPACTMETA = 0x00008000 # y- Compact metadata logs
F_CKMETA = 0x00010000 # y- Check metadata checksums F_CKMETA = 0x00010000 # y- Check metadata checksums
F_CKDATA = 0x00020000 # y- Check metadata + data checksums F_CKDATA = 0x00020000 # y- Check metadata + data checksums
F_GBMAP = 0x02000000 # y- Use the global on-disk block-map
# Filesystem mount flags # Filesystem mount flags
M_MODE = 1 # -m Mount's access mode M_MODE = 1 # -m Mount's access mode
M_RDWR = 0 # -^ Mount the filesystem as read and write M_RDWR = 0 # -^ Mount the filesystem as read and write
@ -112,6 +115,8 @@ GC_CKDATA = 0x00020000 # -- Check metadata + data checksums
# Filesystem info flags # Filesystem info flags
I_RDONLY = 0x00000001 # -- Mounted read only I_RDONLY = 0x00000001 # -- Mounted read only
I_GBMAP = 0x02000000 # -- Global on-disk block-map in use
I_FLUSH = 0x00000040 # -- Mounted with LFS3_M_FLUSH I_FLUSH = 0x00000040 # -- Mounted with LFS3_M_FLUSH
I_SYNC = 0x00000080 # -- Mounted with LFS3_M_SYNC I_SYNC = 0x00000080 # -- Mounted with LFS3_M_SYNC
I_REVDBG = 0x00000010 # -- Mounted with LFS3_M_REVDBG I_REVDBG = 0x00000010 # -- Mounted with LFS3_M_REVDBG
@ -128,8 +133,6 @@ I_COMPACTMETA = 0x00008000 # -- Filesystem may have uncompacted metadata
I_CKMETA = 0x00010000 # -- Metadata checksums not checked recently I_CKMETA = 0x00010000 # -- Metadata checksums not checked recently
I_CKDATA = 0x00020000 # -- Data checksums not checked recently I_CKDATA = 0x00020000 # -- Data checksums not checked recently
I_GBMAP = 0x02000000 # -- Global on-disk block-map in use
# Traversal flags # Traversal flags
T_MODE = 1 # -m The traversal's access mode T_MODE = 1 # -m The traversal's access mode
T_RDWR = 0 # -^ Open traversal as read and write T_RDWR = 0 # -^ Open traversal as read and write

View File

@ -107,6 +107,8 @@ defines.CKPROGS = [false, true]
defines.CKFETCHES = [false, true] defines.CKFETCHES = [false, true]
defines.CKMETAPARITY = [false, true] defines.CKMETAPARITY = [false, true]
defines.CKDATACKSUMS = [false, true] defines.CKDATACKSUMS = [false, true]
defines.REGBMAP = [false, true]
defines.COMPACTMETA = [false, true]
defines.CKMETA = [false, true] defines.CKMETA = [false, true]
defines.CKDATA = [false, true] defines.CKDATA = [false, true]
defines.GBMAP = [false, true] defines.GBMAP = [false, true]
@ -117,6 +119,7 @@ if = [
'LFS3_IFDEF_CKFETCHES(true, !CKFETCHES)', 'LFS3_IFDEF_CKFETCHES(true, !CKFETCHES)',
'LFS3_IFDEF_CKMETAPARITY(true, !CKMETAPARITY)', 'LFS3_IFDEF_CKMETAPARITY(true, !CKMETAPARITY)',
'LFS3_IFDEF_CKDATACKSUMS(true, !CKDATACKSUMS)', 'LFS3_IFDEF_CKDATACKSUMS(true, !CKDATACKSUMS)',
'LFS3_IFDEF_YES_GBMAP(true, !REGBMAP)',
'LFS3_IFDEF_GBMAP(true, !GBMAP)', 'LFS3_IFDEF_GBMAP(true, !GBMAP)',
] ]
code = ''' code = '''
@ -133,6 +136,10 @@ code = '''
| ((CKDATACKSUMS) | ((CKDATACKSUMS)
? LFS3_IFDEF_CKDATACKSUMS(LFS3_F_CKDATACKSUMS, -1) ? LFS3_IFDEF_CKDATACKSUMS(LFS3_F_CKDATACKSUMS, -1)
: 0) : 0)
| ((REGBMAP)
? LFS3_IFDEF_GBMAP(LFS3_F_REGBMAP, -1)
: 0)
| ((COMPACTMETA) ? LFS3_F_COMPACTMETA : 0)
| ((CKMETA) ? LFS3_F_CKMETA : 0) | ((CKMETA) ? LFS3_F_CKMETA : 0)
| ((CKDATA) ? LFS3_F_CKDATA : 0) | ((CKDATA) ? LFS3_F_CKDATA : 0)
| ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0), | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0),