[PATCH v4 05/12] unpack-trees: preserve cache_bottom
- From
Derrick Stolee via GitGitGadget <gitgitgadget@gmail.com>
- Date
- May 21, 2021, 11:59 UTC
- Message-ID
- <07a45b661c4a6ecd63ede19c9e058a8879069742.1621598382.git.gitgitgadget@gmail.com>
- In-Reply-To
- <pull.932.v4.git.1621598382.gitgitgadget@gmail.com>
From: Derrick Stolee <dstolee@microsoft.com>
The cache_bottom member of 'struct unpack_trees_options' is used to track the range of index entries corresponding to a node of the cache tree. While recursing with traverse_by_cache_tree(), this value is preserved on the call stack using a local and then restored as that method returns.
The mark_ce_used() method normally modifies the cache_bottom member when it refers to the marked cache entry. However, sparse directory entries are stored as nodes in the cache-tree data structure as of 2de37c53 (cache-tree: integrate with sparse directory entries, 2021-03-30). Thus, the cache_bottom will be modified as the cache-tree walk advances. Do not update it as well within mark_ce_used().
Signed-off-by: Derrick Stolee <dstolee@microsoft.com> --- unpack-trees.c | 7 +++++++ 1 file changed, 7 insertions(+)
diff --git a/unpack-trees.c b/unpack-trees.c index dddf106d5bd4..1067db19c9d2 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -586,6 +586,13 @@ static void mark_ce_used(struct cache_entry *ce, struct unpack_trees_options *o) { ce->ce_flags |= CE_UNPACKED; + /* + * If this is a sparse directory, don't advance cache_bottom. + * That will be advanced later using the cache-tree data. + */ + if (S_ISSPARSEDIR(ce->ce_mode)) + return; + if (o->cache_bottom < o->src_index->cache_nr && o->src_index->cache[o->cache_bottom] == ce) { int bottom = o->cache_bottom;
-- gitgitgadget