- struct wim_dentry *dentry;
- struct hlist_node *cur, *tmp;
- int ret;
- size_t num_true_inodes;
-
- LIST_HEAD(dentries_with_data_streams);
- LIST_HEAD(dentries_with_no_data_streams);
- HLIST_HEAD(true_inodes);
-
- /* Create a list of dentries in the nominal inode that have at
- * least one data stream with a non-zero hash, and another list that
- * contains the dentries that have a zero hash for all data streams. */
- inode_for_each_dentry(dentry, inode) {
- if (dentry_has_data_streams(dentry))
- list_add(&dentry->tmp_list, &dentries_with_data_streams);
- else
- list_add(&dentry->tmp_list, &dentries_with_no_data_streams);
- }
-
- /* If there are no dentries with data streams, we require the nominal
- * inode to be a true inode */
- if (list_empty(&dentries_with_data_streams)) {
- #ifdef ENABLE_DEBUG
- unsigned nominal_group_size = inode_link_count(inode);
- if (nominal_group_size > 1) {
- DEBUG("Found link group of size %u without "
- "any data streams:", nominal_group_size);
- print_inode_dentries(inode);
- DEBUG("We are going to interpret it as true "
- "link group, provided that the dentries "
- "are consistent.");
- }
- #endif
- return fix_true_inode(inode, inode_list);
- }
-
- /* One or more dentries had data streams specified. We check each of
- * these dentries for consistency with the others to form a set of true
- * inodes. */
- num_true_inodes = 0;
- list_for_each_entry(dentry, &dentries_with_data_streams, tmp_list) {
- /* Look for a true inode that is consistent with this dentry and
- * add this dentry to it. Or, if none of the true inodes are
- * consistent with this dentry, add a new one (if that happens,
- * we have split the hard link group). */
- hlist_for_each_entry(inode, cur, &true_inodes, i_hlist) {
- if (ref_inodes_consistent(inode, dentry->d_inode)) {
- inode_add_dentry(dentry, inode);
- goto next_dentry_2;
- }
- }
- num_true_inodes++;
- INIT_LIST_HEAD(&dentry->d_inode->i_dentry);
- inode_add_dentry(dentry, dentry->d_inode);
- hlist_add_head(&dentry->d_inode->i_hlist, &true_inodes);
-next_dentry_2:
- ;
- }