void *cb_data)
 {
        struct object_id peeled;
-       struct object_entry *entry = packlist_find(&to_pack, oid, NULL);
+       struct object_entry *entry = packlist_find(&to_pack, oid);
 
        if (entry)
                entry->tagged = 1;
        if (!peel_ref(path, &peeled)) {
-               entry = packlist_find(&to_pack, &peeled, NULL);
+               entry = packlist_find(&to_pack, &peeled);
                if (entry)
                        entry->tagged = 1;
        }
  * few lines later when we want to add the new entry.
  */
 static int have_duplicate_entry(const struct object_id *oid,
-                               int exclude,
-                               uint32_t *index_pos)
+                               int exclude)
 {
        struct object_entry *entry;
 
-       entry = packlist_find(&to_pack, oid, index_pos);
+       entry = packlist_find(&to_pack, oid);
        if (!entry)
                return 0;
 
                                uint32_t hash,
                                int exclude,
                                int no_try_delta,
-                               uint32_t index_pos,
                                struct packed_git *found_pack,
                                off_t found_offset)
 {
        struct object_entry *entry;
 
-       entry = packlist_alloc(&to_pack, oid, index_pos);
+       entry = packlist_alloc(&to_pack, oid);
        entry->hash = hash;
        oe_set_type(entry, type);
        if (exclude)
 {
        struct packed_git *found_pack = NULL;
        off_t found_offset = 0;
-       uint32_t index_pos;
 
        display_progress(progress_state, ++nr_seen);
 
-       if (have_duplicate_entry(oid, exclude, &index_pos))
+       if (have_duplicate_entry(oid, exclude))
                return 0;
 
        if (!want_object_in_pack(oid, exclude, &found_pack, &found_offset)) {
 
        create_object_entry(oid, type, pack_name_hash(name),
                            exclude, name && no_try_delta(name),
-                           index_pos, found_pack, found_offset);
+                           found_pack, found_offset);
        return 1;
 }
 
                                        int flags, uint32_t name_hash,
                                        struct packed_git *pack, off_t offset)
 {
-       uint32_t index_pos;
-
        display_progress(progress_state, ++nr_seen);
 
-       if (have_duplicate_entry(oid, 0, &index_pos))
+       if (have_duplicate_entry(oid, 0))
                return 0;
 
        if (!want_object_in_pack(oid, 0, &pack, &offset))
                return 0;
 
-       create_object_entry(oid, type, name_hash, 0, 0, index_pos, pack, offset);
+       create_object_entry(oid, type, name_hash, 0, 0, pack, offset);
        return 1;
 }
 
         * First see if we're already sending the base (or it's explicitly in
         * our "excluded" list).
         */
-       base = packlist_find(&to_pack, &base_oid, NULL);
+       base = packlist_find(&to_pack, &base_oid);
        if (base) {
                if (!in_same_island(&delta->idx.oid, &base->idx.oid))
                        return 0;
         * it was included via bitmaps, we would not have parsed it
         * previously).
         */
-       if (packlist_find(&to_pack, oid, NULL))
+       if (packlist_find(&to_pack, oid))
                return;
 
        tag = lookup_tag(the_repository, oid);
 
        if (starts_with(path, "refs/tags/") && /* is a tag? */
            !peel_ref(path, &peeled)    && /* peelable? */
-           packlist_find(&to_pack, &peeled, NULL))      /* object packed? */
+           packlist_find(&to_pack, &peeled))      /* object packed? */
                add_tag_chain(oid);
        return 0;
 }
                for (p = strchr(name, '/'); p; p = strchr(p + 1, '/'))
                        depth++;
 
-               ent = packlist_find(&to_pack, &obj->oid, NULL);
+               ent = packlist_find(&to_pack, &obj->oid);
                if (ent && depth > oe_tree_depth(&to_pack, ent))
                        oe_set_tree_depth(&to_pack, ent, depth);
        }
 
                for (i = 0; i < p->num_objects; i++) {
                        nth_packed_object_oid(&oid, p, i);
-                       if (!packlist_find(&to_pack, &oid, NULL) &&
+                       if (!packlist_find(&to_pack, &oid) &&
                            !has_sha1_pack_kept_or_nonlocal(&oid) &&
                            !loosened_object_can_be_discarded(&oid, p->mtime))
                                if (force_object_loose(&oid, p->mtime))
 
 }
 
 struct object_entry *packlist_find(struct packing_data *pdata,
-                                  const struct object_id *oid,
-                                  uint32_t *index_pos)
+                                  const struct object_id *oid)
 {
        uint32_t i;
        int found;
 
        i = locate_object_entry_hash(pdata, oid, &found);
 
-       if (index_pos)
-               *index_pos = i;
-
        if (!found)
                return NULL;
 
 }
 
 struct object_entry *packlist_alloc(struct packing_data *pdata,
-                                   const struct object_id *oid,
-                                   uint32_t index_pos)
+                                   const struct object_id *oid)
 {
        struct object_entry *new_entry;
 
 
        if (pdata->index_size * 3 <= pdata->nr_objects * 4)
                rehash_objects(pdata);
-       else
-               pdata->index[index_pos] = pdata->nr_objects;
+       else {
+               int found;
+               uint32_t pos = locate_object_entry_hash(pdata,
+                                                       &new_entry->idx.oid,
+                                                       &found);
+               if (found)
+                       BUG("duplicate object inserted into hash");
+               pdata->index[pos] = pdata->nr_objects;
+       }
 
        if (pdata->in_pack)
                pdata->in_pack[pdata->nr_objects - 1] = NULL;