X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fdentry.c;h=aec94c3435c901778f73894459f208eef33e7db0;hp=f9126eb0d3fb3a5aba037729a5322f08273f1690;hb=aa882e9bb92d998707484d7f6f56e9cf109a7c62;hpb=f26dccb787fa4d83108dbb9d6843063ae262df3a diff --git a/src/dentry.c b/src/dentry.c index f9126eb0..aec94c34 100644 --- a/src/dentry.c +++ b/src/dentry.c @@ -594,6 +594,9 @@ static struct inode *new_timeless_inode() return NULL; inode->security_id = -1; inode->link_count = 1; +#ifdef WITH_FUSE + inode->next_stream_id = 1; +#endif INIT_LIST_HEAD(&inode->dentry_list); return inode; } @@ -839,58 +842,6 @@ void unlink_dentry(struct dentry *dentry) } #endif -/* Parameters for calculate_dentry_statistics(). */ -struct image_statistics { - struct lookup_table *lookup_table; - u64 *dir_count; - u64 *file_count; - u64 *total_bytes; - u64 *hard_link_bytes; -}; - -static int calculate_dentry_statistics(struct dentry *dentry, void *arg) -{ - struct image_statistics *stats; - struct lookup_table_entry *lte; - - stats = arg; - - if (dentry_is_directory(dentry) && !dentry_is_root(dentry)) - ++*stats->dir_count; - else - ++*stats->file_count; - - for (unsigned i = 0; i <= dentry->d_inode->num_ads; i++) { - lte = inode_stream_lte(dentry->d_inode, i, stats->lookup_table); - if (lte) { - *stats->total_bytes += wim_resource_size(lte); - if (++lte->out_refcnt == 1) - *stats->hard_link_bytes += wim_resource_size(lte); - } - } - return 0; -} - -/* Calculates some statistics about a dentry tree. */ -void calculate_dir_tree_statistics(struct dentry *root, struct lookup_table *table, - u64 *dir_count_ret, u64 *file_count_ret, - u64 *total_bytes_ret, - u64 *hard_link_bytes_ret) -{ - struct image_statistics stats; - *dir_count_ret = 0; - *file_count_ret = 0; - *total_bytes_ret = 0; - *hard_link_bytes_ret = 0; - stats.lookup_table = table; - stats.dir_count = dir_count_ret; - stats.file_count = file_count_ret; - stats.total_bytes = total_bytes_ret; - stats.hard_link_bytes = hard_link_bytes_ret; - for_lookup_table_entry(table, lte_zero_out_refcnt, NULL); - for_dentry_in_tree(root, calculate_dentry_statistics, &stats); -} - static inline struct dentry *inode_first_dentry(struct inode *inode) { wimlib_assert(inode->dentry_list.next != &inode->dentry_list); @@ -1068,7 +1019,7 @@ struct ads_entry *inode_add_ads(struct inode *inode, const char *stream_name) struct ads_entry *ads_entries; struct ads_entry *new_entry; - DEBUG("Add alternate data stream `%s'", stream_name); + DEBUG("Add alternate data stream \"%s\"", stream_name); if (inode->num_ads >= 0xfffe) { ERROR("Too many alternate data streams in one inode!"); @@ -1102,19 +1053,19 @@ void inode_remove_ads(struct inode *inode, u16 idx, struct ads_entry *ads_entry; struct lookup_table_entry *lte; + wimlib_assert(idx < inode->num_ads); + wimlib_assert(inode->resolved); + ads_entry = &inode->ads_entries[idx]; - wimlib_assert(ads_entry); - wimlib_assert(inode->resolved); + DEBUG("Remove alternate data stream \"%s\"", ads_entry->stream_name_utf8); lte = ads_entry->lte; - if (lte) lte_decrement_refcnt(lte, lookup_table); destroy_ads_entry(ads_entry); - wimlib_assert(inode->num_ads); memcpy(&inode->ads_entries[idx], &inode->ads_entries[idx + 1], (inode->num_ads - idx - 1) * sizeof(inode->ads_entries[0]));