From b01a385bc965a2c370a14b5f1b28ba913883774e Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Thu, 13 Nov 2025 02:29:12 -0600 Subject: [PATCH] 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. --- lfs3.c | 32 ++++++++++++++++++++---------- lfs3.h | 45 +++++++++++++++++++++++++------------------ scripts/dbgflags.py | 11 +++++++---- tests/test_mount.toml | 7 +++++++ 4 files changed, 62 insertions(+), 33 deletions(-) diff --git a/lfs3.c b/lfs3.c index 8e1fc7f7..b7952769 100644 --- a/lfs3.c +++ b/lfs3.c @@ -15870,7 +15870,7 @@ int lfs3_mount(lfs3_t *lfs3, uint32_t flags, flags |= LFS3_M_RELOOKAHEAD; #endif #ifdef LFS3_YES_REGBMAP - flags |= LFS3_YES_REGBMAP; + flags |= LFS3_M_REGBMAP; #endif #ifdef LFS3_YES_COMPACTMETA flags |= LFS3_M_COMPACTMETA; @@ -16159,6 +16159,9 @@ static int lfs3_formatinited(lfs3_t *lfs3) { #ifndef LFS3_RDONLY int lfs3_format(lfs3_t *lfs3, uint32_t flags, const struct lfs3_cfg *cfg) { + #ifdef LFS3_YES_GBMAP + flags |= LFS3_F_GBMAP; + #endif #ifdef LFS3_YES_REVDBG flags |= LFS3_F_REVDBG; #endif @@ -16177,39 +16180,44 @@ int lfs3_format(lfs3_t *lfs3, uint32_t flags, #ifdef LFS3_YES_CKDATACKSUMS flags |= LFS3_F_CKDATACKSUMS; #endif + #ifdef LFS3_YES_REGBMAP + flags |= LFS3_F_REGBMAP; + #endif + #ifdef LFS3_YES_COMPACTMETA + flags |= LFS3_F_COMPACTMETA; + #endif #ifdef LFS3_YES_CKMETA flags |= LFS3_F_CKMETA; #endif #ifdef LFS3_YES_CKDATA flags |= LFS3_F_CKDATA; #endif - #ifdef LFS3_YES_GBMAP - flags |= LFS3_F_GBMAP; - #endif // unknown flags? LFS3_ASSERT((flags & ~( LFS3_F_RDWR + | LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, 0) | LFS3_IFDEF_REVDBG(LFS3_F_REVDBG, 0) | LFS3_IFDEF_REVNOISE(LFS3_F_REVNOISE, 0) | LFS3_IFDEF_CKPROGS(LFS3_F_CKPROGS, 0) | LFS3_IFDEF_CKFETCHES(LFS3_F_CKFETCHES, 0) | LFS3_IFDEF_CKMETAPARITY(LFS3_F_CKMETAPARITY, 0) | LFS3_IFDEF_CKDATACKSUMS(LFS3_F_CKDATACKSUMS, 0) + | LFS3_IFDEF_GBMAP(LFS3_F_REGBMAP, 0) + | LFS3_F_COMPACTMETA | LFS3_F_CKMETA - | LFS3_F_CKDATA - | LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, 0))) == 0); + | LFS3_F_CKDATA)) == 0); int err = lfs3_init(lfs3, flags & ( LFS3_F_RDWR + | LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, 0) | LFS3_IFDEF_REVDBG(LFS3_F_REVDBG, 0) | LFS3_IFDEF_REVNOISE(LFS3_F_REVNOISE, 0) | LFS3_IFDEF_CKPROGS(LFS3_F_CKPROGS, 0) | LFS3_IFDEF_CKFETCHES(LFS3_F_CKFETCHES, 0) | LFS3_IFDEF_CKMETAPARITY(LFS3_F_CKMETAPARITY, 0) - | LFS3_IFDEF_CKDATACKSUMS(LFS3_F_CKDATACKSUMS, 0) - | LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, 0)), + | LFS3_IFDEF_CKDATACKSUMS(LFS3_F_CKDATACKSUMS, 0)), cfg); if (err) { return err; @@ -16234,12 +16242,16 @@ int lfs3_format(lfs3_t *lfs3, uint32_t flags, // run gc if requested if (flags & ( - LFS3_F_CKMETA + LFS3_IFDEF_GBMAP(LFS3_F_REGBMAP, 0) + | LFS3_F_COMPACTMETA + | LFS3_F_CKMETA | LFS3_F_CKDATA)) { lfs3_mgc_t mgc; err = lfs3_fs_gc_(lfs3, &mgc, flags & ( - LFS3_F_CKMETA + LFS3_IFDEF_GBMAP(LFS3_F_REGBMAP, 0) + | LFS3_F_COMPACTMETA + | LFS3_F_CKMETA | LFS3_F_CKDATA), -1); if (err) { diff --git a/lfs3.h b/lfs3.h index 2a6c9341..503570b9 100644 --- a/lfs3.h +++ b/lfs3.h @@ -168,35 +168,46 @@ enum lfs3_type { // Filesystem format flags #ifndef LFS3_RDONLY #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 -#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 #endif -#ifdef LFS3_REVNOISE +#if !defined(LFS3_RDONLY) && defined(LFS3_REVNOISE) #define LFS3_F_REVNOISE 0x00000020 // Add noise to revision counts #endif -#ifdef LFS3_CKPROGS +#if !defined(LFS3_RDONLY) && defined(LFS3_CKPROGS) #define LFS3_F_CKPROGS 0x00100000 // Check progs by reading back progged data #endif -#ifdef LFS3_CKFETCHES +#if !defined(LFS3_RDONLY) && defined(LFS3_CKFETCHES) #define LFS3_F_CKFETCHES \ 0x00200000 // Check block checksums before first use #endif -#ifdef LFS3_CKMETAPARITY +#if !defined(LFS3_RDONLY) && defined(LFS3_CKMETAPARITY) #define LFS3_F_CKMETAPARITY \ 0x00400000 // Check metadata tag parity bits #endif -#ifdef LFS3_CKDATACKSUMS +#if !defined(LFS3_RDONLY) && defined(LFS3_CKDATACKSUMS) #define LFS3_F_CKDATACKSUMS \ 0x01000000 // Check data checksums on reads #endif - -#define LFS3_F_CKMETA 0x00010000 // Check metadata checksums -#define LFS3_F_CKDATA 0x00020000 // Check metadata + data checksums +#if !defined(LFS3_RDONLY) && defined(LFS3_GBMAP) +#define LFS3_F_REGBMAP 0x00002000 // Repopulate the gbmap #endif - -#ifdef LFS3_GBMAP -#define LFS3_F_GBMAP 0x02000000 // Use the global on-disk block-map +#ifndef LFS3_RDONLY +#define LFS3_F_COMPACTMETA \ + 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 // Filesystem mount flags @@ -228,7 +239,6 @@ enum lfs3_type { #define LFS3_M_CKDATACKSUMS \ 0x01000000 // Check data checksums on reads #endif - #ifndef LFS3_RDONLY #define LFS3_M_MKCONSISTENT \ 0x00000800 // Make the filesystem consistent @@ -247,9 +257,11 @@ enum lfs3_type { #define LFS3_M_CKMETA 0x00010000 // Check metadata checksums #define LFS3_M_CKDATA 0x00020000 // Check metadata + data checksums - // Filesystem info flags #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_SYNC 0x00000080 // Mounted with LFS3_M_SYNC #if !defined(LFS3_RDONLY) && defined(LFS3_REVDBG) @@ -273,7 +285,6 @@ enum lfs3_type { #define LFS3_I_CKDATACKSUMS \ 0x01000000 // Mounted with LFS3_M_CKDATACKSUMS #endif - #ifndef LFS3_RDONLY #define LFS3_I_MKCONSISTENT \ 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_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 enum lfs3_btype { diff --git a/scripts/dbgflags.py b/scripts/dbgflags.py index d2d1a36f..0f113727 100755 --- a/scripts/dbgflags.py +++ b/scripts/dbgflags.py @@ -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_SYNC = 0x00000080 # y- Sync metadata on every write O_DESYNC = 0x00100000 # -- Do not sync or recieve file updates + O_CKMETA = 0x00010000 # -- Check metadata checksums O_CKDATA = 0x00020000 # -- Check metadata + data checksums @@ -70,6 +71,8 @@ A_LAZY = 0x04 # -- Only write attr if file changed # Filesystem format flags F_MODE = 1 # -m Format's access mode 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_REVNOISE = 0x00000020 # y- Add noise to revision counts 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_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_CKDATA = 0x00020000 # y- Check metadata + data checksums -F_GBMAP = 0x02000000 # y- Use the global on-disk block-map - # Filesystem mount flags M_MODE = 1 # -m Mount's access mode M_RDWR = 0 # -^ Mount the filesystem as read and write @@ -112,6 +115,8 @@ GC_CKDATA = 0x00020000 # -- Check metadata + data checksums # Filesystem info flags 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_SYNC = 0x00000080 # -- Mounted with LFS3_M_SYNC 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_CKDATA = 0x00020000 # -- Data checksums not checked recently -I_GBMAP = 0x02000000 # -- Global on-disk block-map in use - # Traversal flags T_MODE = 1 # -m The traversal's access mode T_RDWR = 0 # -^ Open traversal as read and write diff --git a/tests/test_mount.toml b/tests/test_mount.toml index a293dacf..c74422e9 100644 --- a/tests/test_mount.toml +++ b/tests/test_mount.toml @@ -107,6 +107,8 @@ defines.CKPROGS = [false, true] defines.CKFETCHES = [false, true] defines.CKMETAPARITY = [false, true] defines.CKDATACKSUMS = [false, true] +defines.REGBMAP = [false, true] +defines.COMPACTMETA = [false, true] defines.CKMETA = [false, true] defines.CKDATA = [false, true] defines.GBMAP = [false, true] @@ -117,6 +119,7 @@ if = [ 'LFS3_IFDEF_CKFETCHES(true, !CKFETCHES)', 'LFS3_IFDEF_CKMETAPARITY(true, !CKMETAPARITY)', 'LFS3_IFDEF_CKDATACKSUMS(true, !CKDATACKSUMS)', + 'LFS3_IFDEF_YES_GBMAP(true, !REGBMAP)', 'LFS3_IFDEF_GBMAP(true, !GBMAP)', ] code = ''' @@ -133,6 +136,10 @@ code = ''' | ((CKDATACKSUMS) ? LFS3_IFDEF_CKDATACKSUMS(LFS3_F_CKDATACKSUMS, -1) : 0) + | ((REGBMAP) + ? LFS3_IFDEF_GBMAP(LFS3_F_REGBMAP, -1) + : 0) + | ((COMPACTMETA) ? LFS3_F_COMPACTMETA : 0) | ((CKMETA) ? LFS3_F_CKMETA : 0) | ((CKDATA) ? LFS3_F_CKDATA : 0) | ((GBMAP) ? LFS3_IFDEF_GBMAP(LFS3_F_GBMAP, -1) : 0),