mirror of
https://github.com/ibm-s390-linux/s390-tools.git
synced 2026-08-05 02:14:52 +00:00
Steps to reproduce: Prepare some disk for IPL, specifying its parameters via zipl "target options", and an image IMAGE_NAME located on another disk. Don't specify "-a" option. Actual result: Installation succeeded (resulting in unbootable setup) Expected result: "Error: Could not add image file 'IMAGE_NAME': File is not on target device" The problem is in incorrect evaluation of device number (dev_t) of the base disk where the image is located by the function add_component_file_range() in case when target parameters are specified by user. Fixup: Retrieve info of the underlying disk without any user hints, passing zeroed structure job_target_data This is an improved version offb0b6263dthat was reverted by63ff07ba3afterwards. The shortcoming of the original (fb0b6263d) fix: it fails to prepare for IPL mounted qcow2 images. The difference from the original fix: when making sure that boot files are located on the target disk: in case of failed auto-detection of disk parameters skip the check with warnings instead of aborting the whole installation session. Acked-by: Jan Höppner <hoeppner@linux.ibm.com> Signed-off-by: Eduard Shishkin <edward6@linux.ibm.com> Signed-off-by: Jan Höppner <hoeppner@linux.ibm.com>
162 lines
3.0 KiB
C
162 lines
3.0 KiB
C
/*
|
|
* s390-tools/zipl/include/job.h
|
|
* Functions and data structures representing the actual 'job' that the
|
|
* user wants us to execute.
|
|
*
|
|
* Copyright IBM Corp. 2001, 2017
|
|
*
|
|
* s390-tools is free software; you can redistribute it and/or modify
|
|
* it under the terms of the MIT license. See LICENSE for details.
|
|
*
|
|
*/
|
|
|
|
#ifndef JOB_H
|
|
#define JOB_H
|
|
|
|
#include <stdbool.h>
|
|
|
|
#include "disk.h"
|
|
#include "zipl.h"
|
|
|
|
|
|
enum job_id {
|
|
job_print_usage = 1,
|
|
job_print_version = 2,
|
|
job_ipl = 3,
|
|
job_segment = 4,
|
|
job_dump_partition = 5,
|
|
job_menu = 6,
|
|
job_ipl_tape = 7,
|
|
job_mvdump = 8,
|
|
};
|
|
|
|
/* target information source */
|
|
typedef enum {
|
|
source_unknown = 0,
|
|
source_auto = 1,
|
|
source_user = 2,
|
|
source_script = 3
|
|
} source_t;
|
|
|
|
struct job_target_data {
|
|
char* bootmap_dir;
|
|
char* targetbase;
|
|
disk_type_t targettype;
|
|
int targetcylinders;
|
|
int targetheads;
|
|
int targetsectors;
|
|
int targetblocksize;
|
|
blocknum_t targetoffset;
|
|
source_t source;
|
|
};
|
|
|
|
struct job_common_ipl_data {
|
|
char* image;
|
|
char* parmline;
|
|
char* ramdisk;
|
|
address_t image_addr;
|
|
address_t parm_addr;
|
|
address_t ramdisk_addr;
|
|
bool optional;
|
|
bool ignore;
|
|
};
|
|
|
|
struct job_ipl_data {
|
|
struct job_common_ipl_data common;
|
|
address_t envblk_addr;
|
|
int is_kdump;
|
|
};
|
|
|
|
struct job_envblk_data {
|
|
int size;
|
|
char *buf;
|
|
};
|
|
|
|
struct job_segment_data {
|
|
char* segment;
|
|
address_t segment_addr;
|
|
};
|
|
|
|
struct job_dump_data {
|
|
struct job_common_ipl_data common;
|
|
char* device;
|
|
uint64_t mem;
|
|
bool no_compress;
|
|
};
|
|
|
|
struct job_mvdump_data {
|
|
char* device_list;
|
|
int device_count;
|
|
char* device[MAX_DUMP_VOLUMES];
|
|
uint64_t mem;
|
|
uint8_t force;
|
|
};
|
|
|
|
struct job_ipl_tape_data {
|
|
struct job_common_ipl_data common;
|
|
char* device;
|
|
};
|
|
|
|
union job_menu_entry_data {
|
|
struct job_ipl_data ipl;
|
|
struct job_dump_data dump;
|
|
};
|
|
|
|
struct job_menu_entry {
|
|
int pos;
|
|
char* name;
|
|
enum job_id id;
|
|
union job_menu_entry_data data;
|
|
int is_secure;
|
|
};
|
|
|
|
struct job_menu_data {
|
|
int num;
|
|
int default_pos;
|
|
int prompt;
|
|
int timeout;
|
|
struct job_menu_entry* entry;
|
|
};
|
|
|
|
struct job_data {
|
|
enum job_id id;
|
|
struct job_target_data target;
|
|
struct job_envblk_data envblk;
|
|
char* name;
|
|
union {
|
|
struct job_ipl_data ipl;
|
|
struct job_menu_data menu;
|
|
struct job_segment_data segment;
|
|
struct job_dump_data dump;
|
|
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;
|
|
int dry_run;
|
|
int command_line;
|
|
int is_secure;
|
|
int is_ldipl_dump;
|
|
};
|
|
|
|
/**
|
|
* Return true, if target parameters for the base disk are set
|
|
*/
|
|
static inline int target_parameters_are_set(struct job_target_data *td)
|
|
{
|
|
return td->targetbase != NULL;
|
|
}
|
|
|
|
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);
|
|
bool is_ngdump_enabled(struct job_data *job);
|
|
|
|
#endif /* not JOB_H */
|