Files
s390-tools/zipl/include/job.h
Eduard Shishkin 9882aabe44 zipl/src: Update format of zipl helpers output
Change the format of zipl helpers output to support hybrid mirrors
(i.e. composed of disks of different types and geometry).
The new format imposes an additional requirement that any key-value
pair "targetbase=X:Y" titles a new section with a set of target
parmeters for the base disk identified by that pair.

Without this change, zipl reports "Inconsistent script output".
To reproduce the problem, build a mixed mirrored setup with first
SCSI disk and second DASD disk, and prepare it for IPL.

Fixes: 731f00202c ("zipl/src: Enable heterogeneous mirrors support")
Reviewed-by: Stefan Haberland <sth@linux.ibm.com>
Signed-off-by: Eduard Shishkin <edward6@linux.ibm.com>
Signed-off-by: Jan Höppner <hoeppner@linux.ibm.com>
2026-07-03 12:05:06 +02:00

269 lines
5.7 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,
};
/*
* Set of parameters per physical disk, which are provided
* either by user, or by helper script
*/
struct target {
char *targetbase;
disk_type_t targettype;
int targetcylinders;
int targetheads;
int targetsectors;
int targetblocksize;
blocknum_t targetoffset;
int check_params;
};
/* 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;
int nr_targets;
struct target targets[MAX_TARGETS];
source_t source;
};
enum target_params {
TARGET_BASE,
TARGET_TYPE,
TARGET_GEOMETRY,
TARGET_BLOCKSIZE,
TARGET_OFFSET,
LAST_TARGET_PARAM
};
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;
bool ramdisk_created;
};
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 is_ngdump;
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;
int no_compress;
int force;
};
static inline struct target *target_at(struct job_target_data *data,
int index)
{
return index < 0 || index >= MAX_TARGETS ? NULL : &data->targets[index];
}
static inline char *get_targetbase(struct job_target_data *data, int index)
{
return target_at(data, index)->targetbase;
}
static inline void set_targetbase(struct job_target_data *data, int index,
char *value)
{
target_at(data, index)->targetbase = value;
}
static inline disk_type_t get_targettype(struct job_target_data *data,
int index)
{
return target_at(data, index)->targettype;
}
int set_targettype(struct job_target_data *data, int index, char *value);
static inline char *job_get_targetbase(struct job_data *job)
{
return get_targetbase(&job->target, 0);
}
static inline void job_set_targetbase(struct job_data *job, char *value)
{
set_targetbase(&job->target, 0, value);
}
static inline int job_get_nr_targets(struct job_data *job)
{
return job->target.nr_targets;
}
static inline void job_set_nr_targets(struct job_data *job, int value)
{
job->target.nr_targets = value;
}
static inline disk_type_t job_get_targettype(struct job_data *job)
{
return get_targettype(&job->target, 0);
}
int job_set_targettype(struct job_data *job, char *value);
#define define_target_param_ops(_TYPE_, _PARAM_) \
static inline _TYPE_ get_target##_PARAM_(struct job_target_data *data, \
int index) \
{ \
return target_at(data, index)->target##_PARAM_; \
} \
\
static inline void set_target##_PARAM_(struct job_target_data *data, \
int index, _TYPE_ value) \
{ \
target_at(data, index)->target##_PARAM_ = value; \
} \
\
static inline _TYPE_ job_get_target##_PARAM_(struct job_data *job) \
{ \
return get_target##_PARAM_(&job->target, 0); \
} \
\
static inline void job_set_target##_PARAM_(struct job_data *job, \
_TYPE_ value) \
{ \
set_target##_PARAM_(&job->target, 0, value); \
}
define_target_param_ops(int, cylinders)
define_target_param_ops(int, heads)
define_target_param_ops(int, sectors)
define_target_param_ops(int, blocksize)
define_target_param_ops(blocknum_t, offset)
/**
* Return true, if target parameters are set at least for one target base disk
*/
static inline int target_parameters_are_set(struct job_target_data *td)
{
return get_targetbase(td, 0) != 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);
void job_dump_check_set_ngdump(struct job_data *job,
struct disk_ext_type *ext_type);
bool job_dump_is_ngdump(struct job_data *job);
void ngdump_delete_meta(const char *path);
#endif /* not JOB_H */