Adopted lfs3_wmask and friends

This just organizes the compat flags/masks a bit better, and avoids
needing to mess with the internals of lfs3_mountmroot anytime the wmask
flags change.

In case it isn't clear, the wmask/rmask/omask indicate which flags are
optional to mount the filesystem for the relevant mode. Currently the
only optional flag is LFS3_WCOMPAT_GBMAP.

Though, humorously, should lfs3_omask actually be all zeros?

---

Code changes minimal:

                    code          stack          ctx
  before:          35124           2136          660
  after:           35124 (+0.0%)   2136 (+0.0%)  660 (+0.0%)

                    code          stack          ctx
  gbmap+np before: 38264           2144          776
  gbmap+np after:  38252 (-0.0%)   2144 (+0.0%)  776 (+0.0%)

                    code          stack          ctx
  gbmap+yp before: 38844           2168          796
  gbmap+yp after:  38832 (-0.0%)   2168 (+0.0%)  796 (+0.0%)
This commit is contained in:
Christopher Haster
2025-12-29 15:16:31 -06:00
parent 061d9531ab
commit 2b1f2e3ca9
+28 -9
View File
@@ -15446,6 +15446,11 @@ static inline lfs3_rcompat_t lfs3_rcompat(const lfs3_t *lfs3) {
| LFS3_RCOMPAT_GRM; | LFS3_RCOMPAT_GRM;
} }
static inline lfs3_rcompat_t lfs3_rmask(const lfs3_t *lfs3) {
(void)lfs3;
return ~0;
}
static inline lfs3_wcompat_t lfs3_wcompat(const lfs3_t *lfs3) { static inline lfs3_wcompat_t lfs3_wcompat(const lfs3_t *lfs3) {
(void)lfs3; (void)lfs3;
return LFS3_WCOMPAT_GCKSUM return LFS3_WCOMPAT_GCKSUM
@@ -15455,11 +15460,22 @@ static inline lfs3_wcompat_t lfs3_wcompat(const lfs3_t *lfs3) {
| LFS3_WCOMPAT_DIR; | LFS3_WCOMPAT_DIR;
} }
static inline lfs3_wcompat_t lfs3_wmask(const lfs3_t *lfs3) {
(void)lfs3;
return ~(
LFS3_IFYES_GBMAP(0, LFS3_WCOMPAT_GBMAP, 0));
}
static inline lfs3_ocompat_t lfs3_ocompat(const lfs3_t *lfs3) { static inline lfs3_ocompat_t lfs3_ocompat(const lfs3_t *lfs3) {
(void)lfs3; (void)lfs3;
return 0; return 0;
} }
static inline lfs3_rcompat_t lfs3_omask(const lfs3_t *lfs3) {
(void)lfs3;
return ~0;
}
// compat flags on-disk encoding // compat flags on-disk encoding
// //
// little-endian, truncated bits must be assumed zero // little-endian, truncated bits must be assumed zero
@@ -15587,7 +15603,6 @@ static int lfs3_mountmroot(lfs3_t *lfs3, const lfs3_mdir_t *mroot) {
// check for any rcompatflags, we must understand these to read // check for any rcompatflags, we must understand these to read
// the filesystem // the filesystem
lfs3_rcompat_t rcompat = lfs3_rcompat(lfs3);
lfs3_rcompat_t rcompat_ = 0; lfs3_rcompat_t rcompat_ = 0;
tag = lfs3_mdir_lookup(lfs3, mroot, LFS3_TAG_RCOMPAT, tag = lfs3_mdir_lookup(lfs3, mroot, LFS3_TAG_RCOMPAT,
&data); &data);
@@ -15601,16 +15616,20 @@ static int lfs3_mountmroot(lfs3_t *lfs3, const lfs3_mdir_t *mroot) {
} }
} }
if (rcompat_ != rcompat) { // optional rcompat flags
LFS3_ERROR("Incompatible rcompat flags 0x%0"PRIx32" (!= 0x%0"PRIx32")", lfs3_rcompat_t rcompat = lfs3_rcompat(lfs3);
lfs3_rcompat_t rmask = lfs3_rmask(lfs3);
if ((rcompat_ & rmask) != (rcompat & rmask)) {
LFS3_ERROR("Incompatible rcompat flags 0x%"PRIx32" "
"(!= 0x%"PRIx32" & ~0x%"PRIx32")",
rcompat_, rcompat_,
rcompat); rcompat,
~rmask);
return LFS3_ERR_NOTSUP; return LFS3_ERR_NOTSUP;
} }
// check for any wcompatflags, we must understand these to write // check for any wcompatflags, we must understand these to write
// the filesystem // the filesystem
lfs3_wcompat_t wcompat = lfs3_wcompat(lfs3);
lfs3_wcompat_t wcompat_ = 0; lfs3_wcompat_t wcompat_ = 0;
tag = lfs3_mdir_lookup(lfs3, mroot, LFS3_TAG_WCOMPAT, tag = lfs3_mdir_lookup(lfs3, mroot, LFS3_TAG_WCOMPAT,
&data); &data);
@@ -15625,11 +15644,11 @@ static int lfs3_mountmroot(lfs3_t *lfs3, const lfs3_mdir_t *mroot) {
} }
// optional wcompat flags // optional wcompat flags
lfs3_wcompat_t wmask = ~( lfs3_wcompat_t wcompat = lfs3_wcompat(lfs3);
LFS3_IFYES_GBMAP(0, LFS3_WCOMPAT_GBMAP, 0)); lfs3_wcompat_t wmask = lfs3_wmask(lfs3);
if ((wcompat_ & wmask) != (wcompat & wmask)) { if ((wcompat_ & wmask) != (wcompat & wmask)) {
LFS3_WARN("Incompatible wcompat flags 0x%0"PRIx32" " LFS3_WARN("Incompatible wcompat flags 0x%"PRIx32" "
"(!= 0x%0"PRIx32" & ~0x%0"PRIx32")", "(!= 0x%"PRIx32" & ~0x%"PRIx32")",
wcompat_, wcompat_,
wcompat, wcompat,
~wmask); ~wmask);