X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fresource.c;h=f7a7916e5f0cc0ed94bcae2b30673b500f80db4b;hb=d3a6c0b6414f880a9cea4d8655570d9f556f319d;hp=5ae2dff2ffc7da0e3db9ee99bce3f116a7efc433;hpb=cdda846b47fae4633ba1084472c982766592ac10;p=wimlib diff --git a/src/resource.c b/src/resource.c index 5ae2dff2..f7a7916e 100644 --- a/src/resource.c +++ b/src/resource.c @@ -1013,7 +1013,7 @@ int extract_wim_resource_to_fd(const struct lookup_table_entry *lte, int fd, if (ret != 0) break; sha1_update(&ctx, buf, to_read); - if (full_write(fd, buf, to_read) < 0) { + if (full_write(fd, buf, to_read) < to_read) { ERROR_WITH_ERRNO("Error extracting WIM resource"); return WIMLIB_ERR_WRITE; } @@ -1092,8 +1092,8 @@ int write_dentry_resources(struct dentry *dentry, void *wim_p) printf("Writing streams for `%s'\n", dentry->full_path_utf8); } - for (unsigned i = 0; i <= dentry->num_ads; i++) { - lte = dentry_stream_lte(dentry, i, w->lookup_table); + for (unsigned i = 0; i <= dentry->d_inode->num_ads; i++) { + lte = inode_stream_lte(dentry->d_inode, i, w->lookup_table); if (lte && ++lte->out_refcnt == 1) { ret = write_wim_resource(lte, w->out_fp, ctype, <e->output_resource_entry); @@ -1128,10 +1128,11 @@ int read_metadata_resource(WIMStruct *w, struct image_metadata *imd) u32 dentry_offset; int ret; struct dentry *dentry; - struct link_group_table *lgt; + struct inode_table inode_tab; const struct lookup_table_entry *metadata_lte; u64 metadata_len; u64 metadata_offset; + struct hlist_head inode_list; metadata_lte = imd->metadata_lte; metadata_len = wim_resource_size(metadata_lte); @@ -1203,6 +1204,7 @@ int read_metadata_resource(WIMStruct *w, struct image_metadata *imd) dentry->prev = dentry; if (ret != 0) goto out_free_dentry_tree; + inode_add_dentry(dentry, dentry->d_inode); /* Now read the entire directory entry tree into memory. */ DEBUG("Reading dentry tree"); @@ -1218,30 +1220,29 @@ int read_metadata_resource(WIMStruct *w, struct image_metadata *imd) /* Build hash table that maps hard link group IDs to dentry sets */ DEBUG("Building link group table"); - lgt = new_link_group_table(9001); - if (!lgt) - goto out_free_dentry_tree; - ret = for_dentry_in_tree(dentry, link_group_table_insert, lgt); + ret = init_inode_table(&inode_tab, 9001); if (ret != 0) - goto out_free_lgt; + goto out_free_dentry_tree; + + for_dentry_in_tree(dentry, inode_table_insert, &inode_tab); - DEBUG("Fixing inconsistencies in the link groups"); - ret = fix_link_groups(lgt); + DEBUG("Fixing inconsistencies in the hard link groups"); + ret = fix_inodes(&inode_tab, &inode_list); + destroy_inode_table(&inode_tab); if (ret != 0) - goto out_free_lgt; + goto out_free_dentry_tree; DEBUG("Running miscellaneous verifications on the dentry tree"); + for_lookup_table_entry(w->lookup_table, lte_zero_real_refcnt, NULL); ret = for_dentry_in_tree(dentry, verify_dentry, w); if (ret != 0) - goto out_free_lgt; + goto out_free_dentry_tree; DEBUG("Done reading image metadata"); - imd->lgt = lgt; - imd->root_dentry = dentry; + imd->root_dentry = dentry; + imd->inode_list = inode_list; goto out_free_buf; -out_free_lgt: - free_link_group_table(lgt); out_free_dentry_tree: free_dentry_tree(dentry, NULL); out_free_security_data: @@ -1333,8 +1334,9 @@ int write_metadata_resource(WIMStruct *w) if (ret != 0) goto out; - /* It's very likely the SHA1 message digest of the metadata resource, so - * re-insert the lookup table entry into the lookup table. */ + /* It's very likely the SHA1 message digest of the metadata resource + * changed, so re-insert the lookup table entry into the lookup table. + * */ lookup_table_unlink(w->lookup_table, lte); lookup_table_insert(w->lookup_table, lte);