[PATCH 3/4] fsmonitor: avoid overriding `cache_changed` bits
From: Johannes Schindelin via GitGitGadget <hidden>
Date: 2023-03-22 16:01:10
Subsystem:
the rest · Maintainer:
Linus Torvalds
From: Johannes Schindelin <redacted> As of e636a7b4d030 (read-cache: be specific what part of the index has changed, 2014-06-13), the paradigm `cache_changed = 1` fell out of fashion and it became a bit field instead. This is important because some bits have specific meaning and should not be unset without care, e.g. `SPLIT_INDEX_ORDERED`. However, b5a816975206 (mark_fsmonitor_valid(): mark the index as changed if needed, 2019-05-24) did use the `cache_changed` attribute as if it were a Boolean instead of a bit field. That not only would override the `SPLIT_INDEX_ORDERED` bit when marking index entries as valid via the FSMonitor, but worse: it would set the `SOMETHING_OTHER` bit (whose value is 1). This means that Git would unnecessarily force a full index to be written out when a split index was asked for. Let's instead use the bit that is specifically intended to indicate FSMonitor-triggered changes, allowing the split-index feature to work as designed. Noticed-by: Jeff Hostetler [off-list ref] Signed-off-by: Johannes Schindelin <redacted> --- fsmonitor.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fsmonitor.h b/fsmonitor.h
index edf7ce5203b..778707b131b 100644
--- a/fsmonitor.h
+++ b/fsmonitor.h@@ -86,7 +86,7 @@ static inline void mark_fsmonitor_valid(struct index_state *istate, struct cache !(ce->ce_flags & CE_FSMONITOR_VALID)) { if (S_ISGITLINK(ce->ce_mode)) return; - istate->cache_changed = 1; + istate->cache_changed |= FSMONITOR_CHANGED; ce->ce_flags |= CE_FSMONITOR_VALID; trace_printf_key(&trace_fsmonitor, "mark_fsmonitor_clean '%s'", ce->name); }
--
gitgitgadget