* doesn't link the dentries.)
*
* For non-buggy WIMs this function will always return true. */
- return hashes_equal(inode_unnamed_stream_hash(inode_1),
- inode_unnamed_stream_hash(inode_2));
+ return hashes_equal(inode_get_hash_of_unnamed_data_stream(inode_1),
+ inode_get_hash_of_unnamed_data_stream(inode_2));
}
static int
struct wim_inode *d_inode = dentry->d_inode;
size_t pos;
struct wim_inode *inode;
- struct hlist_node *cur;
if (d_inode->i_ino == 0) {
- list_add_tail(&d_inode->i_list, &table->extra_inodes);
+ hlist_add_head(&d_inode->i_hlist_node, &table->extra_inodes);
return 0;
}
/* Try adding this dentry to an existing inode. */
- pos = d_inode->i_ino % table->capacity;
- hlist_for_each_entry(inode, cur, &table->array[pos], i_hlist) {
+ pos = hash_inode(table, d_inode->i_ino, 0);
+ hlist_for_each_entry(inode, &table->array[pos], i_hlist_node) {
if (inode->i_ino != d_inode->i_ino) {
continue;
}
WARNING("Unsupported directory hard link "
"\"%"TS"\" <=> \"%"TS"\"",
dentry_full_path(dentry),
- inode_first_full_path(inode));
+ inode_any_full_path(inode));
} else if (params->num_dir_hard_links ==
MAX_DIR_HARD_LINK_WARNINGS + 1)
{
}
/* Keep this dentry's inode. */
- hlist_add_head(&d_inode->i_hlist, &table->array[pos]);
+ hlist_add_head(&d_inode->i_hlist_node, &table->array[pos]);
+ if (++table->filled > table->capacity)
+ enlarge_inode_table(table);
return 0;
}
+static void
+hlist_move_all(struct hlist_head *src, struct hlist_head *dest)
+{
+ struct hlist_node *node;
+
+ while ((node = src->first) != NULL) {
+ hlist_del(node);
+ hlist_add_head(node, dest);
+ }
+}
+
/* Move the inodes from the 'struct wim_inode_table' to the 'inode_list'. */
static void
build_inode_list(struct wim_inode_table *inode_table,
- struct list_head *inode_list)
+ struct hlist_head *inode_list)
{
- list_splice(&inode_table->extra_inodes, inode_list);
- for (size_t i = 0; i < inode_table->capacity; i++) {
- while (!hlist_empty(&inode_table->array[i])) {
- struct wim_inode *inode;
-
- inode = hlist_entry(inode_table->array[i].first,
- struct wim_inode, i_hlist);
- hlist_del(&inode->i_hlist);
- list_add(&inode->i_list, inode_list);
- }
- }
+ hlist_move_all(&inode_table->extra_inodes, inode_list);
+ for (size_t i = 0; i < inode_table->capacity; i++)
+ hlist_move_all(&inode_table->array[i], inode_list);
}
/* Re-assign inode numbers to the inodes in the list. */
static void
-reassign_inode_numbers(struct list_head *inode_list)
+reassign_inode_numbers(struct hlist_head *inode_list)
{
struct wim_inode *inode;
u64 cur_ino = 1;
- list_for_each_entry(inode, inode_list, i_list)
+ hlist_for_each_entry(inode, inode_list, i_hlist_node)
inode->i_ino = cur_ino++;
}
* i_ino fields.
*/
int
-dentry_tree_fix_inodes(struct wim_dentry *root, struct list_head *inode_list)
+dentry_tree_fix_inodes(struct wim_dentry *root, struct hlist_head *inode_list)
{
struct inode_fixup_params params;
int ret;
/* We use a hash table to map inode numbers to inodes. */
- ret = init_inode_table(¶ms.inode_table, 9001);
+ ret = init_inode_table(¶ms.inode_table, 64);
if (ret)
return ret;
build_inode_list(¶ms.inode_table, inode_list);
destroy_inode_table(¶ms.inode_table);
- if (unlikely(params.num_inconsistent_inodes))
- WARNING("Fixed %lu invalid hard links in WIM image",
- params.num_inconsistent_inodes);
-
if (unlikely(params.num_dir_hard_links))
WARNING("Ignoring %lu directory hard links",
params.num_dir_hard_links);