X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fverify.c;fp=src%2Fverify.c;h=c06e7029d6cb145f43bbc9ea18eba0ac3c1c6236;hp=6ee918f4c04bb4188a7f32dfdccc52121672b423;hb=4c73e29d8d74a4e969782d2d40e209337414034c;hpb=5b6eaafbaab217fc69946685862a09afa28b30cb diff --git a/src/verify.c b/src/verify.c index 6ee918f4..c06e7029 100644 --- a/src/verify.c +++ b/src/verify.c @@ -32,71 +32,6 @@ #include "wimlib/progress.h" #include "wimlib/security.h" -static int -lte_fix_refcnt(struct wim_lookup_table_entry *lte, void *ctr) -{ - if (lte->refcnt != lte->real_refcnt) { - lte->refcnt = lte->real_refcnt; - ++*(unsigned long *)ctr; - } - return 0; -} - -static void -tally_inode_refcnts(const struct wim_inode *inode, - const struct wim_lookup_table *lookup_table) -{ - for (unsigned i = 0; i <= inode->i_num_ads; i++) { - struct wim_lookup_table_entry *lte; - lte = inode_stream_lte(inode, i, lookup_table); - if (lte) - lte->real_refcnt += inode->i_nlink; - } -} - - -static int -tally_image_refcnts(WIMStruct *wim) -{ - const struct wim_image_metadata *imd; - const struct wim_inode *inode; - - imd = wim_get_current_image_metadata(wim); - image_for_each_inode(inode, imd) - tally_inode_refcnts(inode, wim->lookup_table); - return 0; -} - - -/* Ideally this would be unnecessary... however, the WIMs for Windows 8 are - * screwed up because some lookup table entries are referenced more times than - * their stated reference counts. So theoretically, if we delete all the - * references to a stream and then remove it, it might still be referenced - * somewhere else, making a file be missing from the WIM... So, work around this - * problem by looking at ALL the images to re-calculate the reference count of - * EVERY lookup table entry. This only absolutely has to be done before an image - * is deleted or before an image is mounted read-write. */ -int -wim_recalculate_refcnts(WIMStruct *wim) -{ - unsigned long num_ltes_with_bogus_refcnt = 0; - int ret; - - for_lookup_table_entry(wim->lookup_table, lte_zero_real_refcnt, NULL); - ret = for_image(wim, WIMLIB_ALL_IMAGES, tally_image_refcnts); - if (ret) - return ret; - num_ltes_with_bogus_refcnt = 0; - for_lookup_table_entry(wim->lookup_table, lte_fix_refcnt, - &num_ltes_with_bogus_refcnt); - if (num_ltes_with_bogus_refcnt != 0) { - WARNING("%lu stream(s) had incorrect reference count.", - num_ltes_with_bogus_refcnt); - } - wim->refcnts_ok = 1; - return 0; -} - static int append_lte_to_list(struct wim_lookup_table_entry *lte, void *_list) {