From 08232d29b9c349ea1d61ffb67e93906d47c2b321 Mon Sep 17 00:00:00 2001 From: Eduard Shishkin Date: Sat, 13 Apr 2024 18:40:05 +0200 Subject: [PATCH] zipl/src: Drop "bootmap_dir" field of struct install_info Use "bootmap_dir" field of struct job_target_data instead, thus avoid allocation/releasing additional resources. Signed-off-by: Eduard Shishkin Reviewed-by: Stefan Haberland Signed-off-by: Steffen Eiden --- zipl/include/install.h | 3 --- zipl/include/job.h | 2 ++ zipl/src/bootmap.c | 42 ++++++++++++++++-------------------------- zipl/src/job.c | 9 ++++++++- 4 files changed, 26 insertions(+), 30 deletions(-) diff --git a/zipl/include/install.h b/zipl/include/install.h index 6a3997e8..8e0a4921 100644 --- a/zipl/include/install.h +++ b/zipl/include/install.h @@ -73,10 +73,7 @@ struct install_set { int fd; char *device; char *filename; - char *bootmap_dir; unsigned int tmp_filename_created:1; - unsigned int bootmap_dir_created:1; - unsigned int dump_mounted:1; unsigned int skip_prepare:1; unsigned int print_details:1; struct disk_info *info; diff --git a/zipl/include/job.h b/zipl/include/job.h index 6bb16b6e..566dab44 100644 --- a/zipl/include/job.h +++ b/zipl/include/job.h @@ -122,6 +122,8 @@ struct job_data { struct job_ipl_tape_data ipl_tape; struct job_mvdump_data mvdump; } data; + int dump_mounted; + int bootmap_dir_created; int noninteractive; int verbose; int add_files; diff --git a/zipl/src/bootmap.c b/zipl/src/bootmap.c index 95d75595..2ee98b61 100644 --- a/zipl/src/bootmap.c +++ b/zipl/src/bootmap.c @@ -1546,7 +1546,7 @@ static int prepare_build_program_table_file(struct job_data *job, /* skip the preparation work */ return 0; /* Create temporary bootmap file */ - bis->filename = misc_make_path(bis->bootmap_dir, + bis->filename = misc_make_path(job->target.bootmap_dir, BOOTMAP_TEMPLATE_FILENAME); if (!bis->filename) return -1; @@ -1583,7 +1583,7 @@ static int prepare_build_program_table_file(struct job_data *job, bis->info)) return -1; } - printf("Building bootmap in '%s'%s\n", bis->bootmap_dir, + printf("Building bootmap in '%s'%s\n", job->target.bootmap_dir, job->add_files ? " (files will be added to bootmap file)" : ""); /* Initialize bootmap header */ @@ -1603,11 +1603,11 @@ static int prepare_build_program_table_file(struct job_data *job, /** * Rename to final bootmap name */ -static int finalize_create_file(struct install_set *bis) +static int finalize_create_file(struct job_data *job, struct install_set *bis) { char *final_name; - final_name = misc_make_path(bis->bootmap_dir, BOOTMAP_FILENAME); + final_name = misc_make_path(job->target.bootmap_dir, BOOTMAP_FILENAME); if (!final_name) return -1; if (rename(bis->filename, final_name)) { @@ -1696,34 +1696,35 @@ static int prepare_bootloader_ngdump(struct job_data *job, if (check_dump_device(job, info, bis->device)) return -1; - bis->bootmap_dir = misc_make_path("/tmp", - DUMP_TEMP_MOUNT_POINT_NAME); - if (!bis->bootmap_dir) { + assert(!job->target.bootmap_dir); + job->target.bootmap_dir = misc_make_path("/tmp", + DUMP_TEMP_MOUNT_POINT_NAME); + if (!job->target.bootmap_dir) { error_reason(strerror(errno)); error_text("Could not make path for '%s'", DUMP_TEMP_MOUNT_POINT_NAME); return -1; } /* Create a mount point directory */ - if (mkdtemp(bis->bootmap_dir) == NULL) { + if (!mkdtemp(job->target.bootmap_dir)) { error_reason(strerror(errno)); error_text("Could not create mount point '%s'", - bis->bootmap_dir); + job->target.bootmap_dir); return -1; } - bis->bootmap_dir_created = 1; + job->bootmap_dir_created = 1; /* * Mount partition where bootmap file and also a dump file will * be stored. */ - if (mount(job->data.dump.device, bis->bootmap_dir, + if (mount(job->data.dump.device, job->target.bootmap_dir, NGDUMP_FSTYPE, 0, NULL)) { error_reason(strerror(errno)); error_text("Could not mount partition '%s':", job->data.dump.device); return -1; } - bis->dump_mounted = 1; + job->dump_mounted = 1; /* * Build a single program table for List-Directed IPL * See comments before install_bootloader() for details @@ -1731,7 +1732,7 @@ static int prepare_bootloader_ngdump(struct job_data *job, bis->print_details = 1; if (bootmap_create_file(job, bis, BLKPTR_FORMAT_ID)) return -1; - return ngdump_create_meta(bis->bootmap_dir); + return ngdump_create_meta(job->target.bootmap_dir); } /** @@ -1741,9 +1742,6 @@ static int prepare_bootloader_ngdump(struct job_data *job, */ static int prepare_bootloader_ipl(struct job_data *job, struct install_set *bis) { - bis->bootmap_dir = misc_strdup(job->target.bootmap_dir); - if (!bis->bootmap_dir) - return -1; /* * Build a program table for List-Directed IPL from * SCSI or ECKD DASD @@ -1818,11 +1816,11 @@ int post_install_bootloader(struct job_data *job, struct install_set *bis) { if (job->id == job_dump_partition) { if (is_ngdump_enabled(job)) - return dry_run ? 0 : finalize_create_file(bis); + return dry_run ? 0 : finalize_create_file(job, bis); else return 0; } else { - return dry_run ? 0 : finalize_create_file(bis); + return dry_run ? 0 : finalize_create_file(job, bis); } } @@ -1847,12 +1845,4 @@ void free_bootloader(struct install_set *bis) free(bis->filename); misc_free_temp_dev(bis->device); disk_free_info(bis->info); - - if (bis->dump_mounted && umount(bis->bootmap_dir)) - warn("Could not umount dump device at %s", - bis->bootmap_dir); - if (bis->bootmap_dir_created && rmdir(bis->bootmap_dir)) - warn("Could not remove directory %s", - bis->bootmap_dir); - free(bis->bootmap_dir); } diff --git a/zipl/src/job.c b/zipl/src/job.c index e0b90d04..92af3365 100644 --- a/zipl/src/job.c +++ b/zipl/src/job.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -372,6 +373,7 @@ get_command_line(int argc, char* argv[], struct command_line* line) static void free_target_data(struct job_target_data* data) { + free(data->bootmap_dir); free(data->targetbase); } @@ -459,7 +461,12 @@ void job_free(struct job_data* job) { - free(job->target.bootmap_dir); + if (job->dump_mounted && umount(job->target.bootmap_dir)) + fprintf(stderr, "Could not umount dump device at %s", + job->target.bootmap_dir); + if (job->bootmap_dir_created && rmdir(job->target.bootmap_dir)) + fprintf(stderr, "Could not remove directory %s", + job->target.bootmap_dir); free_target_data(&job->target); free_envblk_data(&job->envblk); free(job->name);