diff --git a/zipl/include/job.h b/zipl/include/job.h index e46788ba..597d4006 100644 --- a/zipl/include/job.h +++ b/zipl/include/job.h @@ -152,7 +152,6 @@ static inline int target_parameters_are_set(struct job_target_data *td) int job_get(int argc, char* argv[], struct job_data** data); void job_free(struct job_data* job); -void free_target_data(struct job_target_data *td); int type_from_target(char *target, disk_type_t *type); int check_job_dump_images(struct job_dump_data* dump, char* name); int check_job_images_ngdump(struct job_dump_data* dump, char* name); diff --git a/zipl/src/bootmap.c b/zipl/src/bootmap.c index 82b77d00..f6f5bacc 100644 --- a/zipl/src/bootmap.c +++ b/zipl/src/bootmap.c @@ -304,6 +304,7 @@ static int add_component_file_range(struct install_set *bis, address_t load_address, size_t trailer, void *component, int add_files, + struct job_target_data *target, int comp_id, int menu_idx, int program_table_id) { @@ -338,15 +339,8 @@ static int add_component_file_range(struct install_set *bis, return -1; } } else { - /* - * Make sure that file is on target device. - * For this, retrieve info of the underlying disk without - * any user hints - */ - struct job_target_data tmp = {.source = source_unknown}; - - rc = disk_get_info_from_file(filename, &tmp, &file_info); - free_target_data(&tmp); + /* Make sure file is on correct device */ + rc = disk_get_info_from_file(filename, target, &file_info); if (rc) return -1; if (file_info->device != bis->info->device) { @@ -383,11 +377,12 @@ write_segment_table: static int add_component_file(struct install_set *bis, const char *filename, address_t load_address, size_t trailer, void *component, int add_files, - int comp_id, int menu_idx, int program_table_id) + struct job_target_data *target, int comp_id, + int menu_idx, int program_table_id) { return add_component_file_range(bis, filename, NULL, load_address, trailer, component, add_files, - comp_id, menu_idx, + target, comp_id, menu_idx, program_table_id); } @@ -549,7 +544,8 @@ static int add_ipl_program(struct install_set *bis, char *filename, bool add_envblk, struct job_envblk_data *envblk, struct job_ipl_data *ipl, disk_blockptr_t *program, int verbose, int add_files, component_header_type type, - int is_secure, int menu_idx, int program_table_id) + struct job_target_data *target, int is_secure, + int menu_idx, int program_table_id) { struct signature_header sig_head; size_t ramdisk_size, image_size; @@ -671,7 +667,7 @@ static int add_ipl_program(struct install_set *bis, char *filename, /* Add stage 3 loader to bootmap */ rc = add_component_file(bis, ZIPL_STAGE3_PATH, STAGE3_LOAD_ADDRESS, signature_size, VOID_ADD(table, offset), 1, - COMPONENT_ID_LOADER, menu_idx, + target, COMPONENT_ID_LOADER, menu_idx, program_table_id); if (rc) { error_text("Could not add internal loader file '%s'", @@ -749,7 +745,7 @@ static int add_ipl_program(struct install_set *bis, char *filename, rc = add_component_file(bis, ipl->common.image, ipl->common.image_addr, signature_size, VOID_ADD(table, offset), - add_files, COMPONENT_ID_KERNEL_IMAGE, + add_files, target, COMPONENT_ID_KERNEL_IMAGE, menu_idx, program_table_id); if (rc) { error_text("Could not add image file '%s'", ipl->common.image); @@ -809,7 +805,7 @@ static int add_ipl_program(struct install_set *bis, char *filename, ipl->common.ramdisk_addr, signature_size, VOID_ADD(table, offset), - add_files, COMPONENT_ID_RAMDISK, + add_files, target, COMPONENT_ID_RAMDISK, menu_idx, program_table_id); if (rc) { error_text("Could not add ramdisk '%s'", @@ -865,7 +861,7 @@ static int add_ipl_program(struct install_set *bis, char *filename, rc = add_component_file_range(bis, filename, ®, ipl->envblk_addr, 0, VOID_ADD(table, offset), - 0, + 0, target, COMPONENT_ID_ENVBLK, menu_idx, program_table_id); @@ -897,6 +893,7 @@ static int add_segment_program(struct install_set *bis, struct job_segment_data *segment, disk_blockptr_t *program, int verbose, int add_files, component_header_type type, + struct job_target_data *target, int program_table_id) { void *table; @@ -916,7 +913,7 @@ static int add_segment_program(struct install_set *bis, printf(" segment file......: %s\n", segment->segment); rc = add_component_file(bis, segment->segment, segment->segment_addr, 0, - VOID_ADD(table, offset), add_files, + VOID_ADD(table, offset), add_files, target, COMPONENT_ID_SEGMENT_FILE, 0 /* menu_idx */, program_table_id); if (rc) { @@ -999,7 +996,7 @@ static int add_dump_program(struct install_set *bis, struct job_data *job, ipl.common.parmline = dump->common.parmline; ipl.common.parm_addr = dump->common.parm_addr; return add_ipl_program(bis, NULL, false, NULL, &ipl, program, - verbose, 1, type, SECURE_BOOT_DISABLED, + verbose, 1, type, target, SECURE_BOOT_DISABLED, 0 /* menu_idx */, program_table_id); } @@ -1044,7 +1041,8 @@ static int build_program_table(struct job_data *job, true, &job->envblk, &job->data.ipl, &table[0], verbose || job->command_line, job->add_files, component_header, - job->is_secure, 0, program_table_id); + &job->target, job->is_secure, 0, + program_table_id); break; case job_segment: if (bis->print_details) { @@ -1057,7 +1055,7 @@ static int build_program_table(struct job_data *job, rc = add_segment_program(bis, &job->data.segment, &table[0], verbose || job->command_line, job->add_files, COMPONENT_HEADER_IPL, - program_table_id); + &job->target, program_table_id); break; case job_dump_partition: /* Only useful for a partition dump that uses a dump kernel*/ @@ -1116,7 +1114,7 @@ static int build_program_table(struct job_data *job, &table[job->data.menu.entry[i].pos], verbose || job->command_line, job->add_files, component_header, - is_secure, i, + &job->target, is_secure, i, program_table_id); break; case job_print_usage: diff --git a/zipl/src/disk.c b/zipl/src/disk.c index b4bd49ad..38a637c3 100644 --- a/zipl/src/disk.c +++ b/zipl/src/disk.c @@ -528,9 +528,6 @@ static int disk_set_info_complete(struct job_target_data *td, * config file, or special "target options" of zipl tool. * If target parameters were specified by user, then the step 1 above * is skipped. - - * To exclude any user assumptions about the DEVICE, this function - * should be called with TD pointing to a zeroed structure. * * DEVICE: logical, or physical device, optionally formated with a * file system. diff --git a/zipl/src/job.c b/zipl/src/job.c index 20664026..27f0181e 100644 --- a/zipl/src/job.c +++ b/zipl/src/job.c @@ -370,7 +370,8 @@ get_command_line(int argc, char* argv[], struct command_line* line) } -void free_target_data(struct job_target_data *data) +static void +free_target_data(struct job_target_data* data) { free(data->bootmap_dir); free(data->targetbase);