Re: [PATCH v2 25/25] name-hash: use expand_to_path()
- From
Elijah Newren <newren@gmail.com>
- Date
- Apr 5, 2021, 19:53 UTC
- Message-ID
- <CABPp-BHvMa5Vf-fpmd7mK8awTU2WK_Gr7Mc8PA-r+NHxqzNu6w@mail.gmail.com>
- In-Reply-To
- <7e2d3fae9a2a0574d2f881d0bcd4931a2cad6b45.1617241803.git.gitgitgadget@gmail.com>
On Wed, Mar 31, 2021 at 6:50 PM Derrick Stolee via GitGitGadget <gitgitgadget@gmail.com> wrote:
Show 35 quoted lines
>
> From: Derrick Stolee <dstolee@microsoft.com>
>
> A sparse-index loads the name-hash data for its entries, including the
> sparse-directory entries. If a caller asks for a path that is contained
> within a sparse-directory entry, we need to expand to a full index and
> recalculate the name hash table before returning the result. Insert
> calls to expand_to_path() to protect against this case.
>
> Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
> ---
> name-hash.c | 10 ++++++++++
> 1 file changed, 10 insertions(+)
>
> diff --git a/name-hash.c b/name-hash.c
> index 4e03fac9bb12..75c159e06eeb 100644
> --- a/name-hash.c
> +++ b/name-hash.c
> @@ -8,6 +8,7 @@
> #include "cache.h"
> #include "thread-utils.h"
> #include "trace2.h"
> +#include "sparse-index.h"
>
> struct dir_entry {
> struct hashmap_entry ent;
> @@ -109,6 +110,12 @@ static void hash_index_entry(struct index_state *istate, struct cache_entry *ce)
> if (ce->ce_flags & CE_HASHED)
> return;
> ce->ce_flags |= CE_HASHED;
> +
> + if (S_ISSPARSEDIR(ce->ce_mode)) {
> + add_dir_entry(istate, ce);
> + return;
> + }I don't see how this relates to the commit message. Was this meant to be included in another commit? If it is intended to be included here, could an explanation be added?
Show 30 quoted lines
> +
> hashmap_entry_init(&ce->ent, memihash(ce->name, ce_namelen(ce)));
> hashmap_add(&istate->name_hash, &ce->ent);
>
> @@ -680,6 +687,7 @@ int index_dir_exists(struct index_state *istate, const char *name, int namelen)
> struct dir_entry *dir;
>
> lazy_init_name_hash(istate);
> + expand_to_path(istate, name, namelen, 0);
> dir = find_dir_entry(istate, name, namelen);
> return dir && dir->nr;
> }
> @@ -690,6 +698,7 @@ void adjust_dirname_case(struct index_state *istate, char *name)
> const char *ptr = startPtr;
>
> lazy_init_name_hash(istate);
> + expand_to_path(istate, name, strlen(name), 0);
> while (*ptr) {
> while (*ptr && *ptr != '/')
> ptr++;
> @@ -713,6 +722,7 @@ struct cache_entry *index_file_exists(struct index_state *istate, const char *na
> unsigned int hash = memihash(name, namelen);
>
> lazy_init_name_hash(istate);
> + expand_to_path(istate, name, namelen, icase);
>
> ce = hashmap_get_entry_from_hash(&istate->name_hash, hash, NULL,
> struct cache_entry, ent);
> --
> gitgitgadget