X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fwimlib_internal.h;h=3d7fb488f519fdc55cc4f91ba224337886d80447;hp=6a6bc083736d4ec9577324d3395e90d1bf127064;hb=c6a1140e085f633273fcf47a6462bd9382ce118a;hpb=a8972bde4b080d2dd33a7500705d431b0f1fe901;ds=sidebyside diff --git a/src/wimlib_internal.h b/src/wimlib_internal.h index 6a6bc083..3d7fb488 100644 --- a/src/wimlib_internal.h +++ b/src/wimlib_internal.h @@ -370,8 +370,46 @@ add_new_dentry_tree(WIMStruct *dest_wim, struct wim_dentry *root, /* hardlink.c */ -extern u64 -assign_inode_numbers(struct hlist_head *inode_list); +/* Hash table to find inodes, given an inode number (in the case of reading + * a WIM images), or both an inode number and a device number (in the case of + * capturing a WIM image). */ +struct wim_inode_table { + /* Fields for the hash table */ + struct hlist_head *array; + u64 num_entries; + u64 capacity; + + /* + * Linked list of "extra" inodes. These may be: + * + * - inodes with link count 1, which are all allowed to have 0 for their + * inode number, meaning we cannot insert them into the hash table. + * + * - Groups we create ourselves by splitting a nominal inode due to + * inconsistencies in the dentries. These inodes will share an inode + * number with some other inode until assign_inode_numbers() is + * called. + */ + struct hlist_head extra_inodes; +}; + +extern int +init_inode_table(struct wim_inode_table *table, size_t capacity); + +extern int +inode_table_new_dentry(struct wim_inode_table *table, const tchar *name, + u64 ino, u64 devno, struct wim_dentry **dentry_ret); + +extern void +inode_table_prepare_inode_list(struct wim_inode_table *table, + struct hlist_head *head); + +static inline void +destroy_inode_table(struct wim_inode_table *table) +{ + FREE(table->array); +} + extern int dentry_tree_fix_inodes(struct wim_dentry *root, struct hlist_head *inode_list); @@ -461,6 +499,7 @@ extern int build_dentry_tree_ntfs(struct wim_dentry **root_p, const tchar *device, struct wim_lookup_table *lookup_table, + struct wim_inode_table *inode_table, struct sd_set *sd_set, const struct wimlib_capture_config *config, int add_image_flags,