+struct reference_info {
+ WIMStruct *dest_wim;
+ struct list_head new_streams;
+ struct list_head new_subwims;
+ int ref_flags;
+ struct wim_lookup_table *src_table;
+};
+
+static void
+init_reference_info(struct reference_info *info, WIMStruct *dest_wim,
+ int ref_flags)
+{
+ info->dest_wim = dest_wim;
+ INIT_LIST_HEAD(&info->new_streams);
+ INIT_LIST_HEAD(&info->new_subwims);
+ info->ref_flags = ref_flags;
+}
+
+static void
+commit_reference_info(struct reference_info *info)
+{
+ list_splice(&info->new_subwims, &info->dest_wim->subwims);
+}
+
+static void
+rollback_reference_info(struct reference_info *info)
+{
+ WIMStruct *subwim;
+ struct wim_lookup_table_entry *lte;
+
+ while (!list_empty(&info->new_subwims)) {
+ subwim = list_first_entry(&info->new_subwims,
+ WIMStruct, subwim_node);
+ list_del(&subwim->subwim_node);
+ wimlib_free(subwim);
+ }
+
+ while (!list_empty(&info->new_streams)) {
+ lte = list_first_entry(&info->new_streams,
+ struct wim_lookup_table_entry,
+ lookup_table_list);
+ list_del(<e->lookup_table_list);
+ lookup_table_unlink(info->dest_wim->lookup_table, lte);
+ free_lookup_table_entry(lte);
+ }
+}
+