From f701cf0f5a189832629b13c97961f238cb95452e Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Mon, 13 May 2013 22:54:38 -0500 Subject: [PATCH] Simplify merging/unmerging of lookup tables when handling split WIMs --- src/export_image.c | 18 +++--------- src/extract_image.c | 35 ++++++---------------- src/join.c | 67 +++++++++++++++++++------------------------ src/mount_image.c | 18 +++--------- src/wimlib_internal.h | 10 ++++--- 5 files changed, 52 insertions(+), 96 deletions(-) diff --git a/src/export_image.c b/src/export_image.c index c5c85d5f..a948ab79 100644 --- a/src/export_image.c +++ b/src/export_image.c @@ -103,7 +103,6 @@ wimlib_export_image(WIMStruct *src_wim, wimlib_progress_func_t progress_func) { int ret; - struct wim_lookup_table *joined_tab, *src_wim_tab_save; struct wim_image_metadata *src_imd; struct list_head lte_list_head; struct wim_inode *inode; @@ -193,15 +192,8 @@ wimlib_export_image(WIMStruct *src_wim, if (ret) return ret; - if (num_additional_swms) { - ret = new_joined_lookup_table(src_wim, additional_swms, - num_additional_swms, - &joined_tab); - if (ret) - return ret; - src_wim_tab_save = src_wim->lookup_table; - src_wim->lookup_table = joined_tab; - } + if (num_additional_swms) + merge_lookup_tables(src_wim, additional_swms, num_additional_swms); ret = select_wim_image(src_wim, src_image); if (ret) { @@ -269,9 +261,7 @@ out_free_ltes: free_lookup_table_entry(lte); } out: - if (num_additional_swms) { - free_lookup_table(src_wim->lookup_table); - src_wim->lookup_table = src_wim_tab_save; - } + if (num_additional_swms) + unmerge_lookup_table(src_wim); return ret; } diff --git a/src/extract_image.c b/src/extract_image.c index fd7453aa..fad438f5 100644 --- a/src/extract_image.c +++ b/src/extract_image.c @@ -746,7 +746,6 @@ wimlib_extract_files(WIMStruct *wim, { int ret; struct wimlib_extract_command *cmds_copy; - struct wim_lookup_table *wim_tab_save, *joined_tab; int all_flags = 0; default_extract_flags &= WIMLIB_EXTRACT_MASK_PUBLIC; @@ -758,15 +757,8 @@ wimlib_extract_files(WIMStruct *wim, if (num_cmds == 0) goto out; - if (num_additional_swms) { - ret = new_joined_lookup_table(wim, additional_swms, - num_additional_swms, - &joined_tab); - if (ret) - goto out; - wim_tab_save = wim->lookup_table; - wim->lookup_table = joined_tab; - } + if (num_additional_swms) + merge_lookup_tables(wim, additional_swms, num_additional_swms); cmds_copy = CALLOC(num_cmds, sizeof(cmds[0])); if (!cmds_copy) { @@ -810,10 +802,8 @@ out_free_cmds_copy: } FREE(cmds_copy); out_restore_lookup_table: - if (num_additional_swms) { - free_lookup_table(wim->lookup_table); - wim->lookup_table = wim_tab_save; - } + if (num_additional_swms) + unmerge_lookup_table(wim); out: return ret; } @@ -937,7 +927,6 @@ wimlib_extract_image(WIMStruct *wim, unsigned num_additional_swms, wimlib_progress_func_t progress_func) { - struct wim_lookup_table *joined_tab, *wim_tab_save; int ret; extract_flags &= WIMLIB_EXTRACT_MASK_PUBLIC; @@ -946,14 +935,8 @@ wimlib_extract_image(WIMStruct *wim, if (ret) return ret; - if (num_additional_swms) { - ret = new_joined_lookup_table(wim, additional_swms, - num_additional_swms, &joined_tab); - if (ret) - return ret; - wim_tab_save = wim->lookup_table; - wim->lookup_table = joined_tab; - } + if (num_additional_swms) + merge_lookup_tables(wim, additional_swms, num_additional_swms); if (image == WIMLIB_ALL_IMAGES) { ret = extract_all_images(wim, target, @@ -971,9 +954,7 @@ wimlib_extract_image(WIMStruct *wim, lte_free_extracted_file, NULL); } - if (num_additional_swms) { - free_lookup_table(wim->lookup_table); - wim->lookup_table = wim_tab_save; - } + if (num_additional_swms) + unmerge_lookup_table(wim); return ret; } diff --git a/src/join.c b/src/join.c index b6bf6ebd..9977942c 100644 --- a/src/join.c +++ b/src/join.c @@ -29,63 +29,56 @@ #include static int -move_lte_to_table(struct wim_lookup_table_entry *lte, void *other_tab) +move_lte_to_table(struct wim_lookup_table_entry *lte, void *combined_table) { hlist_del(<e->hash_list); - lookup_table_insert((struct wim_lookup_table*)other_tab, lte); + lookup_table_insert((struct wim_lookup_table*)combined_table, lte); return 0; } -static int -lookup_table_join(struct wim_lookup_table *table, - struct wim_lookup_table *new) +static void +lookup_table_join(struct wim_lookup_table *combined_table, + struct wim_lookup_table *part_table) { - for_lookup_table_entry(new, move_lte_to_table, table); - new->num_entries = 0; - return 0; + for_lookup_table_entry(part_table, move_lte_to_table, combined_table); + part_table->num_entries = 0; } /* - * new_joined_lookup_table: - Join lookup tables from the parts of a split WIM. + * merge_lookup_tables() - Merge lookup tables from the parts of a split WIM. * * @w specifies the first part, while @additional_swms and @num_additional_swms * specify an array of pointers to the WIMStruct's for additional split WIM parts. * - * The lookup table entries are *moved* to the new table. - * - * On success, 0 is returned on a pointer to the joined lookup table is returned - * in @table_ret. - * * The reason we join the lookup tables is so we only have to search one lookup * table to find the location of a resource in the entire WIM. */ -int -new_joined_lookup_table(WIMStruct *w, - WIMStruct **additional_swms, - unsigned num_additional_swms, - struct wim_lookup_table **table_ret) +void +merge_lookup_tables(WIMStruct *w, + WIMStruct **additional_swms, + unsigned num_additional_swms) { - struct wim_lookup_table *table; - int ret; - unsigned i; - - table = new_lookup_table(9001); - if (!table) - return WIMLIB_ERR_NOMEM; - - if (w) - lookup_table_join(table, w->lookup_table); + for (unsigned i = 0; i < num_additional_swms; i++) + lookup_table_join(w->lookup_table, additional_swms[i]->lookup_table); +} - for (i = 0; i < num_additional_swms; i++) { - ret = lookup_table_join(table, additional_swms[i]->lookup_table); - if (ret != 0) - goto out_free_table; +static int +move_lte_to_orig_table(struct wim_lookup_table_entry *lte, void *_wim) +{ + WIMStruct *wim = _wim; + if (lte->wim != wim) { + move_lte_to_table(lte, lte->wim->lookup_table); + wim->lookup_table->num_entries--; } - *table_ret = table; return 0; -out_free_table: - free_lookup_table(table); - return ret; +} + +/* Undo merge_lookup_tables(), given the first WIM part that contains the merged + * lookup table. */ +void +unmerge_lookup_table(WIMStruct *wim) +{ + for_lookup_table_entry(wim->lookup_table, move_lte_to_orig_table, wim); } diff --git a/src/mount_image.c b/src/mount_image.c index 4c0c93e5..f816db1e 100644 --- a/src/mount_image.c +++ b/src/mount_image.c @@ -2364,7 +2364,6 @@ wimlib_mount_image(WIMStruct *wim, int image, const char *dir, char *argv[16]; int ret; char *dir_copy; - struct wim_lookup_table *joined_tab, *wim_tab_save; struct wim_image_metadata *imd; struct wimfs_context ctx; struct wim_inode *inode; @@ -2387,15 +2386,8 @@ wimlib_mount_image(WIMStruct *wim, int image, const char *dir, goto out; } - if (num_additional_swms) { - ret = new_joined_lookup_table(wim, additional_swms, - num_additional_swms, - &joined_tab); - if (ret) - goto out; - wim_tab_save = wim->lookup_table; - wim->lookup_table = joined_tab; - } + if (num_additional_swms) + merge_lookup_tables(wim, additional_swms, num_additional_swms); if (mount_flags & WIMLIB_MOUNT_FLAG_READWRITE) { ret = wim_run_full_verifications(wim); @@ -2560,10 +2552,8 @@ out_unlock: out_free_message_queue_names: free_message_queue_names(&ctx); out_restore_lookup_table: - if (num_additional_swms) { - free_lookup_table(wim->lookup_table); - wim->lookup_table = wim_tab_save; - } + if (num_additional_swms) + unmerge_lookup_table(wim); out: return ret; } diff --git a/src/wimlib_internal.h b/src/wimlib_internal.h index a54e644c..08a176cf 100644 --- a/src/wimlib_internal.h +++ b/src/wimlib_internal.h @@ -535,10 +535,12 @@ check_wim_integrity(WIMStruct *w, wimlib_progress_func_t progress_func); /* join.c */ -extern int -new_joined_lookup_table(WIMStruct *w, WIMStruct **additional_swms, - unsigned num_additional_swms, - struct wim_lookup_table **table_ret); +extern void +merge_lookup_tables(WIMStruct *w, + WIMStruct **additional_swms, unsigned num_additional_swms); + +extern void +unmerge_lookup_table(WIMStruct *wim); /* metadata_resource.c */ -- 2.43.0