Hello community, here is the log from the commit of package s390-tools for openSUSE:Factory checked in at 2018-12-10 12:22:47 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/s390-tools (Old) and /work/SRC/openSUSE:Factory/.s390-tools.new.19453 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "s390-tools" Mon Dec 10 12:22:47 2018 rev:23 rq:655912 version:2.1.0 Changes: -------- --- /work/SRC/openSUSE:Factory/s390-tools/s390-tools.changes 2018-12-03 10:07:20.555877473 +0100 +++ /work/SRC/openSUSE:Factory/.s390-tools.new.19453/s390-tools.changes 2018-12-10 12:22:50.782855812 +0100 @@ -1,0 +2,21 @@ +Thu Dec 6 21:03:08 UTC 2018 - [email protected] + +- Added the following patches for Fate#326825 (bsc#1113329) + I/O device pre-configuration + * s390-tools-sles15sp1-01-zdev-use-libutil-provided-path-functions.patch + * s390-tools-sles15sp1-02-zdev-Prepare-for-firmware-configuration-file-support.patch + * s390-tools-sles15sp1-03-zdev-Add-support-for-reading-firmware-configuration-.patch + * s390-tools-sles15sp1-04-zdev-Implement-no-settle.patch + * s390-tools-sles15sp1-05-zdev-Write-zfcp-lun-udev-rules-to-separate-files.patch + * s390-tools-sles15sp1-06-zdev-Add-support-for-handling-auto-configuration-dat.patch + * s390-tools-sles15sp1-07-zdev-Integrate-firmware-auto-configuration-with-drac.patch + * s390-tools-sles15sp1-08-zdev-Integrate-firmware-auto-configuration-with-init.patch + * s390-tools-sles15sp1-09-zdev-Implement-internal-device-attributes.patch + * s390-tools-sles15sp1-10-zdev-Implement-support-for-early-device-configuratio.patch + * s390-tools-sles15sp1-11-zdev-Do-not-call-zipl-on-initrd-update.patch +- Removed the obsolete customize-zdev-root-update-script.patch +- Replaced s390-tools-sles15-zdev-fix-qeth-BridgePort-and-VNICC-conflict-checking.patch + with s390-tools-sles15sp1-zdev-fix-qeth-BridgePort-and-VNICC-conflict-checking.patch + to fit the current version (bsc#1118618). + +------------------------------------------------------------------- Old: ---- customize-zdev-root-update-script.patch s390-tools-sles15-zdev-fix-qeth-BridgePort-and-VNICC-conflict-checking.patch New: ---- s390-tools-sles15sp1-01-zdev-use-libutil-provided-path-functions.patch s390-tools-sles15sp1-02-zdev-Prepare-for-firmware-configuration-file-support.patch s390-tools-sles15sp1-03-zdev-Add-support-for-reading-firmware-configuration-.patch s390-tools-sles15sp1-04-zdev-Implement-no-settle.patch s390-tools-sles15sp1-05-zdev-Write-zfcp-lun-udev-rules-to-separate-files.patch s390-tools-sles15sp1-06-zdev-Add-support-for-handling-auto-configuration-dat.patch s390-tools-sles15sp1-07-zdev-Integrate-firmware-auto-configuration-with-drac.patch s390-tools-sles15sp1-08-zdev-Integrate-firmware-auto-configuration-with-init.patch s390-tools-sles15sp1-09-zdev-Implement-internal-device-attributes.patch s390-tools-sles15sp1-10-zdev-Implement-support-for-early-device-configuratio.patch s390-tools-sles15sp1-11-zdev-Do-not-call-zipl-on-initrd-update.patch s390-tools-sles15sp1-zdev-fix-qeth-BridgePort-and-VNICC-conflict-checking.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ s390-tools.spec ++++++ --- /var/tmp/diff_new_pack.YTKldr/_old 2018-12-10 12:22:52.658853942 +0100 +++ /var/tmp/diff_new_pack.YTKldr/_new 2018-12-10 12:22:52.662853939 +0100 @@ -152,51 +152,60 @@ Patch41: s390-tools-sles15-6-lstape-fix-description-of-type-and-devbusid-filter-f.patch Patch42: s390-tools-sles15-7-lstape-fix-SCSI-output-description-in-man-page.patch Patch43: s390-tools-sles15-8-lstape-fix-SCSI-HBA-CCW-device-bus-ID-e.g.-for-virti.patch -Patch44: s390-tools-sles15-zdev-fix-qeth-BridgePort-and-VNICC-conflict-checking.patch -Patch45: s390-tools-sles15sp1-0001-zkey-Add-properties-file-handling-routines.patch -Patch46: s390-tools-sles15sp1-0002-zkey-Add-build-dependency-to-OpenSSL-libcrypto.patch -Patch47: s390-tools-sles15sp1-0003-zkey-Add-helper-functions-for-comma-separated-string.patch -Patch48: s390-tools-sles15sp1-0004-zkey-Externalize-secure-key-back-end-functions.patch -Patch49: s390-tools-sles15sp1-0005-zkey-Add-keystore-implementation.patch -Patch50: s390-tools-sles15sp1-0006-zkey-Add-keystore-related-commands.patch -Patch51: s390-tools-sles15sp1-0007-zkey-Create-key-repository-and-group-during-make-ins.patch -Patch52: s390-tools-sles15sp1-0008-zkey-Man-page-updates.patch -Patch53: s390-tools-sles15sp1-0009-zkey-let-packaging-create-the-zkeyadm-group-and-perm.patch -Patch54: s390-tools-sles15sp1-0010-zkey-Update-README-to-add-info-about-packaging-requi.patch -Patch55: s390-tools-sles15sp1-0011-zkey-Typo-in-message.patch -Patch56: s390-tools-sles15sp1-0012-zkey-Fix-memory-leak.patch -Patch57: s390-tools-sles15sp1-0013-zkey-Fix-APQN-validation-routine.patch -Patch58: s390-tools-sles15sp1-0014-zkey-Fix-generate-and-import-leaving-key-in-an-incon.patch -Patch59: s390-tools-sles15sp1-0015-zkey-Add-zkey-cryptsetup-tool.patch -Patch60: s390-tools-sles15sp1-0016-zkey-Add-man-page-for-zkey-cryptsetup.patch -Patch61: s390-tools-sles15sp1-0017-zkey-Add-build-dependency-for-libcryptsetup-and-json.patch -Patch62: s390-tools-sles15sp1-0018-zkey-Add-key-verification-pattern-property.patch -Patch63: s390-tools-sles15sp1-0019-zkey-Add-volume-type-property-to-support-LUKS2-volum.patch -Patch64: s390-tools-sles15sp1-01-lszcrypt-CEX6S-exploitation.patch -Patch65: s390-tools-sles15sp1-02-lszcrypt-fix-date-and-wrong-indentation.patch -Patch66: s390-tools-sles15sp1-01-chzcrypt-Corrections-at-the-chzcrypt-man-page.patch -Patch67: s390-tools-sles15sp1-02-lszcrypt-support-for-alternate-zcrypt-device-drivers.patch -Patch68: s390-tools-sles15sp1-01-zcryptctl-new-tool-zcryptctl-for-multiple-zcrypt-node.patch -Patch69: s390-tools-sles15sp1-01-cpumf-Add-extended-counter-defintion-files-for-IBM-z.patch -Patch70: s390-tools-sles15sp1-02-cpumf-z14-split-counter-sets-according-to-CFVN-CSVN-.patch -Patch71: s390-tools-sles15sp1-03-cpumf-cpumf_helper-read-split-counter-sets-part-2-2.patch -Patch72: s390-tools-sles15sp1-04-cpumf-correct-z14-counter-number.patch -Patch73: s390-tools-sles15sp1-05-cpumf-add-missing-Description-tag-for-z13-z14-ctr-12.patch -Patch74: s390-tools-sles15sp1-06-cpumf-correct-counter-name-for-z13-and-z14.patch -Patch75: s390-tools-sles15sp1-07-cpumf-Add-IBM-z14-ZR1-to-the-CPU-Measurement-Facilit.patch -Patch76: s390-tools-sles15sp1-01-util_path-add-function-to-check-if-a-path-exists.patch -Patch77: s390-tools-sles15sp1-02-util_path-Add-description-for-util_path_exists.patch -Patch78: s390-tools-sles15sp1-03-util_path-Make-true-false-handling-consistent-with-o.patch -Patch79: s390-tools-sles15sp1-04-zpcictl-Introduce-new-tool-zpcictl.patch -Patch80: s390-tools-sles15sp1-05-zpcictl-include-sys-sysmacros.h-to-avoid-minor-major.patch -Patch81: s390-tools-sles15sp1-06-zpcictl-Rephrase-man-page-entries-and-tool-output.patch -Patch82: s390-tools-sles15sp1-07-zpcictl-Use-fopen-instead-of-open-for-writes.patch -Patch83: s390-tools-sles15sp1-08-zpcictl-Read-device-link-to-obtain-device-address.patch -Patch84: s390-tools-sles15sp1-09-zpcictl-Make-device-node-for-NVMe-optional.patch -Patch85: s390-tools-sles15sp1-10-zpcictl-Change-wording-of-man-page-and-help-output.patch -Patch86: s390-tools-sles15sp1-dbginfo-gather-nvme-related-data.patch - -Patch999: customize-zdev-root-update-script.patch +Patch44: s390-tools-sles15sp1-0001-zkey-Add-properties-file-handling-routines.patch +Patch45: s390-tools-sles15sp1-0002-zkey-Add-build-dependency-to-OpenSSL-libcrypto.patch +Patch46: s390-tools-sles15sp1-0003-zkey-Add-helper-functions-for-comma-separated-string.patch +Patch47: s390-tools-sles15sp1-0004-zkey-Externalize-secure-key-back-end-functions.patch +Patch48: s390-tools-sles15sp1-0005-zkey-Add-keystore-implementation.patch +Patch49: s390-tools-sles15sp1-0006-zkey-Add-keystore-related-commands.patch +Patch50: s390-tools-sles15sp1-0007-zkey-Create-key-repository-and-group-during-make-ins.patch +Patch51: s390-tools-sles15sp1-0008-zkey-Man-page-updates.patch +Patch52: s390-tools-sles15sp1-0009-zkey-let-packaging-create-the-zkeyadm-group-and-perm.patch +Patch53: s390-tools-sles15sp1-0010-zkey-Update-README-to-add-info-about-packaging-requi.patch +Patch54: s390-tools-sles15sp1-0011-zkey-Typo-in-message.patch +Patch55: s390-tools-sles15sp1-0012-zkey-Fix-memory-leak.patch +Patch56: s390-tools-sles15sp1-0013-zkey-Fix-APQN-validation-routine.patch +Patch57: s390-tools-sles15sp1-0014-zkey-Fix-generate-and-import-leaving-key-in-an-incon.patch +Patch58: s390-tools-sles15sp1-0015-zkey-Add-zkey-cryptsetup-tool.patch +Patch59: s390-tools-sles15sp1-0016-zkey-Add-man-page-for-zkey-cryptsetup.patch +Patch60: s390-tools-sles15sp1-0017-zkey-Add-build-dependency-for-libcryptsetup-and-json.patch +Patch61: s390-tools-sles15sp1-0018-zkey-Add-key-verification-pattern-property.patch +Patch62: s390-tools-sles15sp1-0019-zkey-Add-volume-type-property-to-support-LUKS2-volum.patch +Patch63: s390-tools-sles15sp1-01-lszcrypt-CEX6S-exploitation.patch +Patch64: s390-tools-sles15sp1-02-lszcrypt-fix-date-and-wrong-indentation.patch +Patch65: s390-tools-sles15sp1-01-chzcrypt-Corrections-at-the-chzcrypt-man-page.patch +Patch66: s390-tools-sles15sp1-02-lszcrypt-support-for-alternate-zcrypt-device-drivers.patch +Patch67: s390-tools-sles15sp1-01-zcryptctl-new-tool-zcryptctl-for-multiple-zcrypt-node.patch +Patch68: s390-tools-sles15sp1-01-cpumf-Add-extended-counter-defintion-files-for-IBM-z.patch +Patch69: s390-tools-sles15sp1-02-cpumf-z14-split-counter-sets-according-to-CFVN-CSVN-.patch +Patch70: s390-tools-sles15sp1-03-cpumf-cpumf_helper-read-split-counter-sets-part-2-2.patch +Patch71: s390-tools-sles15sp1-04-cpumf-correct-z14-counter-number.patch +Patch72: s390-tools-sles15sp1-05-cpumf-add-missing-Description-tag-for-z13-z14-ctr-12.patch +Patch73: s390-tools-sles15sp1-06-cpumf-correct-counter-name-for-z13-and-z14.patch +Patch74: s390-tools-sles15sp1-07-cpumf-Add-IBM-z14-ZR1-to-the-CPU-Measurement-Facilit.patch +Patch75: s390-tools-sles15sp1-01-util_path-add-function-to-check-if-a-path-exists.patch +Patch76: s390-tools-sles15sp1-02-util_path-Add-description-for-util_path_exists.patch +Patch77: s390-tools-sles15sp1-03-util_path-Make-true-false-handling-consistent-with-o.patch +Patch78: s390-tools-sles15sp1-04-zpcictl-Introduce-new-tool-zpcictl.patch +Patch79: s390-tools-sles15sp1-05-zpcictl-include-sys-sysmacros.h-to-avoid-minor-major.patch +Patch80: s390-tools-sles15sp1-06-zpcictl-Rephrase-man-page-entries-and-tool-output.patch +Patch81: s390-tools-sles15sp1-07-zpcictl-Use-fopen-instead-of-open-for-writes.patch +Patch82: s390-tools-sles15sp1-08-zpcictl-Read-device-link-to-obtain-device-address.patch +Patch83: s390-tools-sles15sp1-09-zpcictl-Make-device-node-for-NVMe-optional.patch +Patch84: s390-tools-sles15sp1-10-zpcictl-Change-wording-of-man-page-and-help-output.patch +Patch85: s390-tools-sles15sp1-dbginfo-gather-nvme-related-data.patch +Patch86: s390-tools-sles15sp1-01-zdev-use-libutil-provided-path-functions.patch +Patch87: s390-tools-sles15sp1-02-zdev-Prepare-for-firmware-configuration-file-support.patch +Patch88: s390-tools-sles15sp1-03-zdev-Add-support-for-reading-firmware-configuration-.patch +Patch89: s390-tools-sles15sp1-04-zdev-Implement-no-settle.patch +Patch90: s390-tools-sles15sp1-05-zdev-Write-zfcp-lun-udev-rules-to-separate-files.patch +Patch91: s390-tools-sles15sp1-06-zdev-Add-support-for-handling-auto-configuration-dat.patch +Patch92: s390-tools-sles15sp1-07-zdev-Integrate-firmware-auto-configuration-with-drac.patch +Patch93: s390-tools-sles15sp1-08-zdev-Integrate-firmware-auto-configuration-with-init.patch +Patch94: s390-tools-sles15sp1-09-zdev-Implement-internal-device-attributes.patch +Patch95: s390-tools-sles15sp1-10-zdev-Implement-support-for-early-device-configuratio.patch +Patch96: s390-tools-sles15sp1-11-zdev-Do-not-call-zipl-on-initrd-update.patch +Patch97: s390-tools-sles15sp1-zdev-fix-qeth-BridgePort-and-VNICC-conflict-checking.patch BuildRoot: %{_tmppath}/%{name}-%{version}-build ExclusiveArch: s390x @@ -339,8 +348,17 @@ %patch84 -p1 %patch85 -p1 %patch86 -p1 - -%patch999 -p1 +%patch87 -p1 +%patch88 -p1 +%patch89 -p1 +%patch90 -p1 +%patch91 -p1 +%patch92 -p1 +%patch93 -p1 +%patch94 -p1 +%patch95 -p1 +%patch96 -p1 +%patch97 -p1 cp -vi %{S:22} CAUTION ++++++ s390-tools-sles15sp1-01-zdev-use-libutil-provided-path-functions.patch ++++++ ++++ 797 lines (skipped) ++++++ s390-tools-sles15sp1-02-zdev-Prepare-for-firmware-configuration-file-support.patch ++++++ Subject: zdev: Prepare for firmware configuration file support From: Peter Oberparleiter <[email protected]> Summary: zdev: Add support for handling I/O configuration data Description: LPARs that are running in IBM Dynamic Partition Manager (DPM) mode can access a firmware-generated I/O configuration data file that contains s390-specific information about available I/O devices such as qeth device numbers and parameters, and FCP device IDs. This data file is intended to remove the need for users to manually enter the corresponding device data during installation. Linux kernels with the corresponding support make the I/O configuration data available at the following location: /sys/firmware/sclp_sd/config/data This patch set adds support for handling this data file using the chzdev and lszdev tools: - I/O configuration data can be applied using chzdev's --import option - Initial RAM-Disk scripts automatically apply the I/O configuration data to the system configuration - lszdev can be used to display the applied auto-configuration data - chzdev can be used to manually override the auto-configuration data Upstream-ID: ab4445c261749caa7aee2154e3b26c767b6c5e60 Problem-ID: LS1604 Upstream-Description: zdev: Prepare for firmware configuration file support Apply some changes to existing functions and data structures to simplify the firmware configuration file support implementation. - Make qeth and dasd subtype objects non-static - Change the existing helper functions for reading file contents into memory to also support binary functions - Move some configuration file import functions to make them available for use in other source files Signed-off-by: Peter Oberparleiter <[email protected]> Signed-off-by: Jan Höppner <[email protected]> Signed-off-by: Peter Oberparleiter <[email protected]> --- zdev/include/dasd.h | 3 ++ zdev/include/device.h | 2 + zdev/include/export.h | 1 zdev/include/misc.h | 1 zdev/include/qeth.h | 2 + zdev/src/dasd.c | 4 +-- zdev/src/device.c | 13 +++++++++++ zdev/src/export.c | 17 +------------- zdev/src/misc.c | 48 ++++++++++++++++++++++++++++++------------ zdev/src/qeth.c | 2 - 10 files changed, 62 insertions(+), 31 deletions(-) --- a/zdev/include/dasd.h +++ b/zdev/include/dasd.h @@ -11,7 +11,10 @@ #define DASD_H struct devtype; +struct subtype; extern struct devtype dasd_devtype; +extern struct subtype dasd_subtype_eckd; +extern struct subtype dasd_subtype_fba; #endif /* DASD_H */ --- a/zdev/include/device.h +++ b/zdev/include/device.h @@ -94,5 +94,7 @@ void device_list_add(struct device_list struct device *device_list_find(struct device_list *, const char *, struct device *); void device_list_print(struct device_list *, int); +struct setting_list *device_get_setting_list(struct device *dev, + config_t config); #endif /* DEVICE_H */ --- a/zdev/include/export.h +++ b/zdev/include/export.h @@ -31,6 +31,7 @@ struct export_object { } ptr; }; +struct export_object *object_new(export_t type, void *ptr); exit_code_t export_write_device(FILE *, struct device *, config_t, int *); exit_code_t export_write_devtype(FILE *, struct devtype *, config_t, int *); exit_code_t export_read(FILE *, const char *, struct util_list *); --- a/zdev/include/misc.h +++ b/zdev/include/misc.h @@ -159,6 +159,7 @@ bool misc_read_dir(const char *, struct bool (*)(const char *, void *), void *); bool file_is_devnode(const char *); exit_code_t remove_file(const char *); +exit_code_t misc_read_fd(FILE *fd, void **buffer, size_t *size_ptr); char *misc_read_text_file(const char *, int, err_t); char *misc_read_cmd_output(const char *, int, err_t); char *config_read_cmd_output(const char *, int, err_t); --- a/zdev/include/qeth.h +++ b/zdev/include/qeth.h @@ -17,9 +17,11 @@ #define QETH_NUM_DEVS 3 struct devtype; +struct subtype; struct namespace; extern struct devtype qeth_devtype; +extern struct subtype qeth_subtype_qeth; extern struct namespace qeth_namespace; #endif /* QETH_H */ --- a/zdev/src/dasd.c +++ b/zdev/src/dasd.c @@ -589,7 +589,7 @@ static struct ccw_subtype_data dasd_eckd .mod = "dasd_eckd_mod", }; -static struct subtype dasd_subtype_eckd = { +struct subtype dasd_subtype_eckd = { .super = &ccw_subtype, .devtype = &dasd_devtype, .name = "dasd-eckd", @@ -626,7 +626,7 @@ static struct ccw_subtype_data dasd_fba_ .mod = "dasd_fba_mod", }; -static struct subtype dasd_subtype_fba = { +struct subtype dasd_subtype_fba = { .super = &ccw_subtype, .devtype = &dasd_devtype, .name = "dasd-fba", --- a/zdev/src/device.c +++ b/zdev/src/device.c @@ -570,3 +570,16 @@ exit_code_t device_check_settings(struct return EXIT_OK; } + +struct setting_list *device_get_setting_list(struct device *dev, + config_t config) +{ + struct setting_list *settings = NULL; + + if (config == config_active) + settings = dev->active.settings; + else + settings = dev->persistent.settings; + + return settings; +} --- a/zdev/src/export.c +++ b/zdev/src/export.c @@ -282,19 +282,6 @@ static bool parse_setting(const char *li return true; } -static struct setting_list *dev_get_setting_list(struct device *dev, - config_t config) -{ - struct setting_list *settings = NULL; - - if (config == config_active) - settings = dev->active.settings; - else - settings = dev->persistent.settings; - - return settings; -} - static struct setting_list *dt_get_setting_list(struct devtype *dt, config_t config) { @@ -426,7 +413,7 @@ static exit_code_t handle_setting(const } else if (dev) { /* We're inside a device section. */ attribs = dev->subtype->dev_attribs; - list = dev_get_setting_list(dev, config); + list = device_get_setting_list(dev, config); } else return EXIT_OK; @@ -444,7 +431,7 @@ static exit_code_t handle_setting(const return EXIT_OK; } -static struct export_object *object_new(export_t type, void *ptr) +struct export_object *object_new(export_t type, void *ptr) { struct export_object *obj; --- a/zdev/src/misc.c +++ b/zdev/src/misc.c @@ -98,26 +98,47 @@ static void dryrun_end_data(void) #define READ_CHUNK_SIZE 4096 -/* Read text from @fd and return resulting NULL-terminated text buffer. - * If @chomp is non-zero, remove trailing newline character. Return %NULL - * on error or when unprintable characters are read. */ -static char *read_fd(FILE *fd, int chomp) +/* Read all data from @fd and return address of resulting buffer in + * @buffer_ptr. If @size_ptr is non-zero, use it to store the size of the + * resulting buffer. Return %EXIT_OK on success. */ +exit_code_t misc_read_fd(FILE *fd, void **buffer_ptr, size_t *size_ptr) { char *buffer = NULL; - size_t done, i; + size_t done = 0; - done = 0; while (!feof(fd)) { - buffer = realloc(buffer, done + READ_CHUNK_SIZE + 1); + buffer = realloc(buffer, done + READ_CHUNK_SIZE); if (!buffer) oom(); done += fread(&buffer[done], 1, READ_CHUNK_SIZE, fd); if (ferror(fd)) { free(buffer); - return NULL; + return EXIT_RUNTIME_ERROR; } } + buffer = realloc(buffer, done); + if (!buffer && done > 0) + oom(); + + *buffer_ptr = buffer; + if (size_ptr) + *size_ptr = done; + + return EXIT_OK; +} + +/* Read text from @fd and return resulting NULL-terminated text buffer. + * If @chomp is non-zero, remove trailing newline character. Return %NULL + * on error or when unprintable characters are read. */ +static char *read_fd(FILE *fd, int chomp) +{ + char *buffer; + size_t done, i; + + if (misc_read_fd(fd, (void **) &buffer, &done)) + return NULL; + /* Check if this is a text file at all (required to filter out * binary sysfs attributes). */ for (i = 0; i < done; i++) { @@ -131,12 +152,13 @@ static char *read_fd(FILE *fd, int chomp if (chomp && done > 0 && buffer[done - 1] == '\n') done--; - if (buffer) { - /* NULL-terminate. */ - buffer[done++] = 0; - } + /* NULL-terminate. */ + buffer = realloc(buffer, done + 1); + if (!buffer) + oom(); + buffer[done] = 0; - return realloc(buffer, done); + return buffer; } static int count_newline(const char *str) --- a/zdev/src/qeth.c +++ b/zdev/src/qeth.c @@ -1369,7 +1369,7 @@ static struct ccwgroup_subtype_data qeth .num_devs = QETH_NUM_DEVS, }; -static struct subtype qeth_subtype_qeth = { +struct subtype qeth_subtype_qeth = { .super = &ccwgroup_subtype, .devtype = &qeth_devtype, .name = "qeth", ++++++ s390-tools-sles15sp1-03-zdev-Add-support-for-reading-firmware-configuration-.patch ++++++ ++++ 874 lines (skipped) ++++++ s390-tools-sles15sp1-04-zdev-Implement-no-settle.patch ++++++ Subject: zdev: Implement --no-settle From: Peter Oberparleiter <[email protected]> Summary: zdev: Add support for handling I/O configuration data Description: LPARs that are running in IBM Dynamic Partition Manager (DPM) mode can access a firmware-generated I/O configuration data file that contains s390-specific information about available I/O devices such as qeth device numbers and parameters, and FCP device IDs. This data file is intended to remove the need for users to manually enter the corresponding device data during installation. Linux kernels with the corresponding support make the I/O configuration data available at the following location: /sys/firmware/sclp_sd/config/data This patch set adds support for handling this data file using the chzdev and lszdev tools: - I/O configuration data can be applied using chzdev's --import option - Initial RAM-Disk scripts automatically apply the I/O configuration data to the system configuration - lszdev can be used to display the applied auto-configuration data - chzdev can be used to manually override the auto-configuration data Upstream-ID: f32bff96881a04bb68b895c23b13ae50daa9e7b4 Problem-ID: LS1604 Upstream-Description: zdev: Implement --no-settle There are some situations where running "udevadm settle" can result in a deadlock, such as in the early stages of initial RAM-disk processing. Introduce a new command-line option --no-settle that can be used to suppress calling "udevadm settle" to allow chzdev to be run in such situations. Signed-off-by: Peter Oberparleiter <[email protected]> Signed-off-by: Jan Höppner <[email protected]> Signed-off-by: Peter Oberparleiter <[email protected]> --- zdev/include/udev.h | 1 + zdev/man/chzdev.8 | 9 +++++++++ zdev/src/chzdev.c | 9 +++++++++ zdev/src/chzdev_usage.txt | 1 + zdev/src/udev.c | 3 +++ 5 files changed, 23 insertions(+) --- a/zdev/include/udev.h +++ b/zdev/include/udev.h @@ -14,6 +14,7 @@ #include "exit_code.h" extern int udev_need_settle; +extern int udev_no_settle; /* Single key-operator-value entry in a udev rule line.*/ struct udev_entry_node { --- a/zdev/man/chzdev.8 +++ b/zdev/man/chzdev.8 @@ -528,6 +528,15 @@ device configuration persistent. Typical initial RAM disk, or modifying the kernel command line. .PP . +.OD no-settle "" "" +Do not wait for udev processing to complete. + +Skips all calls to the udevadm tool that are intended to wait for udev to +finish processing before continuing. There is typically no need to use this +option unless chzdev is run in an environment where udev is not fully +functional (such as in the early phase of an initial RAM disk). +.PP +. .OD persistent "p" "" Apply changes to persistent configuration only. --- a/zdev/src/chzdev.c +++ b/zdev/src/chzdev.c @@ -95,6 +95,7 @@ struct options { struct util_list *base; /* List of struct strlist_node */ unsigned int verbose:1; unsigned int quiet:1; + unsigned int no_settle:1; }; /* Makefile converts chzdev_usage.txt into C file which we include here. */ @@ -136,6 +137,7 @@ enum { OPT_VERSION = 'v', OPT_VERBOSE = 'V', OPT_QUIET = 'q', + OPT_NO_SETTLE = (OPT_ANONYMOUS_BASE+__COUNTER__), }; static struct opts_conflict conflict_list[] = { @@ -217,6 +219,7 @@ static const struct option opt_list[] = { "base", required_argument, NULL, OPT_BASE }, { "verbose", no_argument, NULL, OPT_VERBOSE }, { "quiet", no_argument, NULL, OPT_QUIET }, + { "no-settle", no_argument, NULL, OPT_NO_SETTLE }, { NULL, no_argument, NULL, 0 }, }; @@ -937,6 +940,11 @@ static exit_code_t parse_options(struct opts->quiet = 1; break; + case OPT_NO_SETTLE: + /* --no-settle */ + opts->no_settle = 1; + break; + case ':': /* Missing option argument. */ syntax("Option '%s' requires an argument\n", @@ -2904,6 +2912,7 @@ int main(int argc, char *argv[]) force = opts.force; yes = opts.yes; dryrun = opts.dryrun; + udev_no_settle = opts.no_settle; path_set_base(opts.base); if (dryrun) --- a/zdev/src/chzdev_usage.txt +++ b/zdev/src/chzdev_usage.txt @@ -54,5 +54,6 @@ OPTIONS --no-root-update Skip root device update --dry-run Display changes without applying --base PATH Use PATH as base for accessing files + --no-settle Do not wait for udev to settle -V, --verbose Print additional run-time information -q, --quiet Print only minimal run-time information --- a/zdev/src/udev.c +++ b/zdev/src/udev.c @@ -24,6 +24,7 @@ #include "udev.h" int udev_need_settle = 0; +int udev_no_settle; /* Create a newly allocated udev entry. */ static struct udev_entry_node *udev_entry_node_new(const char *key, @@ -403,5 +404,7 @@ exit_code_t udev_remove_rule(const char /* Wait for all current udev events to finish. */ void udev_settle(void) { + if (udev_no_settle) + return; misc_system(err_ignore, "%s settle", PATH_UDEVADM); } ++++++ s390-tools-sles15sp1-05-zdev-Write-zfcp-lun-udev-rules-to-separate-files.patch ++++++ Subject: zdev: Write zfcp-lun udev rules to separate files From: Peter Oberparleiter <[email protected]> Summary: zdev: Add support for handling I/O configuration data Description: LPARs that are running in IBM Dynamic Partition Manager (DPM) mode can access a firmware-generated I/O configuration data file that contains s390-specific information about available I/O devices such as qeth device numbers and parameters, and FCP device IDs. This data file is intended to remove the need for users to manually enter the corresponding device data during installation. Linux kernels with the corresponding support make the I/O configuration data available at the following location: /sys/firmware/sclp_sd/config/data This patch set adds support for handling this data file using the chzdev and lszdev tools: - I/O configuration data can be applied using chzdev's --import option - Initial RAM-Disk scripts automatically apply the I/O configuration data to the system configuration - lszdev can be used to display the applied auto-configuration data - chzdev can be used to manually override the auto-configuration data Upstream-ID: a86fb8b09118e6de7463882f889eff7e278163cd Problem-ID: LS1604 Upstream-Description: zdev: Write zfcp-lun udev rules to separate files Change chzdev's udev rule generation from the previous approach of combining all zfcp-lun udev rules associated with an FCP device into a single file to storing zfcp-lun udev rules in one file per zfcp-lun. This is done to enable per-device udev rule masking. With udev rule masking, if a udev rule file by the same name exists in both /etc and /run, the udev daemon will only consider the rules found in /etc. The auto-configuration feature will make use of per-device udev rule masking to introduce a new class of configuration data (stored in /run) that is only active if no user-provided configuration data (in /etc) exists. In addition, change chzdev to allow the regeneration of udev rules by using the --force command line like in the following example: # chzdev zfcp-lun --configured --enable --persistent --force This can be used to convert all existing zfcp-lun udev rules from the old format to the new one. Signed-off-by: Peter Oberparleiter <[email protected]> Signed-off-by: Jan Höppner <[email protected]> Signed-off-by: Peter Oberparleiter <[email protected]> --- zdev/src/chzdev.c | 6 +++- zdev/src/root.c | 2 - zdev/src/udev_zfcp_lun.c | 56 ++++++++++++++++++++++++++++++++++----- 3 files changed, 55 insertions(+), 9 deletions(-) --- a/zdev/src/chzdev.c +++ b/zdev/src/chzdev.c @@ -1333,7 +1333,7 @@ static exit_code_t cfg_write(struct devi struct subtype *st = dev->subtype; exit_code_t rc = EXIT_OK; - if (!device_needs_writing(dev, config)) + if (!device_needs_writing(dev, config) && !force) goto out; if (check_active && config == config_persistent && @@ -1624,6 +1624,10 @@ static exit_code_t print_config_result(s already = device_needs_writing(dev, config) ? 0 : 1; } + /* Re-do actions if run with --force */ + if (force) + already = 0; + if (dev) { devname = dev->subtype->devname; devid = dev->id; --- a/zdev/src/root.c +++ b/zdev/src/root.c @@ -60,7 +60,7 @@ exit_code_t root_check(void) /* Check devices. */ dev = device_list_find(sel->st->devices, sel->id, NULL); if (dev && dev->persistent.exists && - device_needs_writing(dev, config_persistent)) { + (device_needs_writing(dev, config_persistent) || force)) { strlist_add(mod, "%s %s", dev->subtype->devname, dev->id); } --- a/zdev/src/udev_zfcp_lun.c +++ b/zdev/src/udev_zfcp_lun.c @@ -385,6 +385,8 @@ void udev_zfcp_lun_add_device_ids(struct free(cb_data.prefix); } +/* Return path to zfcp lun udev rule file containing configuration data for + * all LUNs of a zfcp device. */ static char *get_zfcp_lun_path(const char *id) { char *copy, *e, *path; @@ -399,6 +401,13 @@ static char *get_zfcp_lun_path(const cha return path; } +/* Return path to zfcp lun udev rule file containing configuration data for + * a single LUN. */ +static char *get_single_zfcp_lun_path(const char *id) +{ + return path_get_udev_rule(ZFCP_LUN_NAME, id); +} + /* Apply the settings found in NODE to STATE. */ static void zfcp_lun_node_to_state(struct zfcp_lun_node *node, struct attrib **attribs, @@ -437,7 +446,12 @@ exit_code_t udev_zfcp_lun_read_device(st exit_code_t rc = EXIT_OK; char *path; - path = get_zfcp_lun_path(dev->id); + /* Check for single lun file first then try multi lun file. */ + path = get_single_zfcp_lun_path(dev->id); + if (!util_path_exists(path)) { + free(path); + path = get_zfcp_lun_path(dev->id); + } /* Get previous rule data. */ luns = zfcp_lun_node_list_new(); @@ -599,8 +613,10 @@ out: /* Update the udev rule file that configures the zfcp lun with the specified * ID. If @state is %NULL, remove the rule, otherwise create a rule that - * applies the corresponding parameters. */ -static exit_code_t update_lun_rule(const char *id, struct device_state *state) + * applies the corresponding parameters. If @single is set, update a single + * lun rule file, otherwise update a multi lun rule file. */ +static exit_code_t update_lun_rule(const char *id, struct device_state *state, + bool single) { struct zfcp_lun_devid devid; struct util_list *luns; @@ -612,7 +628,7 @@ static exit_code_t update_lun_rule(const rc = zfcp_lun_parse_devid(&devid, id, err_delayed_print); if (rc) return rc; - path = get_zfcp_lun_path(id); + path = single ? get_single_zfcp_lun_path(id) : get_zfcp_lun_path(id); /* Get previous rule data. */ luns = zfcp_lun_node_list_new(); @@ -650,24 +666,50 @@ static exit_code_t update_lun_rule(const * device state. */ exit_code_t udev_zfcp_lun_write_device(struct device *dev) { - return update_lun_rule(dev->id, &dev->persistent); + exit_code_t rc; + + rc = update_lun_rule(dev->id, &dev->persistent, true); + + /* We only want single lun rule files so remove any remaining + * references in multi lun rule files. */ + update_lun_rule(dev->id, NULL, false); + + return rc; } /* Remove the UDEV rule used to configure the zfcp lun with the specified ID. */ exit_code_t udev_zfcp_lun_remove_rule(const char *id) { - return update_lun_rule(id, NULL); + exit_code_t rc, rc2; + + rc = update_lun_rule(id, NULL, true); + rc2 = update_lun_rule(id, NULL, false); + + if (rc) + return rc; + + return rc2; } /* Determine if a udev rule exists for configuring the specified zfcp lun. */ bool udev_zfcp_lun_exists(const char *id) { struct zfcp_lun_devid devid; - char *path, *rule, *pattern = NULL; + char *path, *rule = NULL, *pattern = NULL; bool rc = false; if (zfcp_lun_parse_devid(&devid, id, err_ignore) != EXIT_OK) return false; + + /* Check for single lun rule file first. */ + path = get_single_zfcp_lun_path(id); + if (util_path_exists(path)) { + rc = true; + goto out; + } + free(path); + + /* Check multi lun rule file next. */ path = get_zfcp_lun_path(id); rule = misc_read_text_file(path, 1, err_ignore); if (!rule) ++++++ s390-tools-sles15sp1-06-zdev-Add-support-for-handling-auto-configuration-dat.patch ++++++ ++++ 3040 lines (skipped) ++++++ s390-tools-sles15sp1-07-zdev-Integrate-firmware-auto-configuration-with-drac.patch ++++++ Subject: zdev: Integrate firmware auto-configuration with dracut From: Peter Oberparleiter <[email protected]> Summary: zdev: Add support for handling I/O configuration data Description: LPARs that are running in IBM Dynamic Partition Manager (DPM) mode can access a firmware-generated I/O configuration data file that contains s390-specific information about available I/O devices such as qeth device numbers and parameters, and FCP device IDs. This data file is intended to remove the need for users to manually enter the corresponding device data during installation. Linux kernels with the corresponding support make the I/O configuration data available at the following location: /sys/firmware/sclp_sd/config/data This patch set adds support for handling this data file using the chzdev and lszdev tools: - I/O configuration data can be applied using chzdev's --import option - Initial RAM-Disk scripts automatically apply the I/O configuration data to the system configuration - lszdev can be used to display the applied auto-configuration data - chzdev can be used to manually override the auto-configuration data Upstream-ID: 3fb356ebd297e4384208b7688d49cb3eb8f5b3e1 Problem-ID: LS1604 Upstream-Description: zdev: Integrate firmware auto-configuration with dracut Add a dracut hook that applies firmware-provided I/O configuration data as auto-configuration during boot. This way, all I/O devices configured by DPM are automatically brought online without further user interaction. This mechanism is active by default. It can be deactivated by specifying the following parameter on the kernel command line: rd.zdev=no-auto Signed-off-by: Peter Oberparleiter <[email protected]> Signed-off-by: Jan Höppner <[email protected]> Signed-off-by: Peter Oberparleiter <[email protected]> --- zdev/dracut/95zdev/module-setup.sh | 19 ++++++++++---- zdev/dracut/95zdev/parse-zdev.sh | 38 +++++++++++++++++++++++++++++ zdev/dracut/Makefile | 3 ++ 3 files changed, 55 insertions(+), 5 deletions(-) --- a/zdev/dracut/95zdev/module-setup.sh +++ b/zdev/dracut/95zdev/module-setup.sh @@ -9,7 +9,8 @@ # 95zdev/module_setup.sh # This module installs configuration files (udev rules and modprobe.conf # files) required to enable the root device on s390. It will only work when -# the root device was configured using the chzdev tool. +# the root device was configured using the chzdev tool. In addition, +# a hook is installed to parse rd.zdev= kernel parameters. # check() { @@ -29,15 +30,23 @@ depends() { } installkernel() { - local _modules=$(lszdev --by-path / --columns MODULES --no-headings 2>/dev/null) - - [ -z "$_modules" ] && return 0 - [ ! -z "$_modules" ] && instmods $_modules + # Add modules for all device types supported by chzdev (required for + # auto-configuration) + instmods lcs qeth qeth_l2 qeth_l3 dasd_mod dasd_eckd_mod dasd_fba_mod \ + dasd_diag_mod zfcp } install() { local _tempfile + # Ensure that required tools are available + inst_multiple chzdev lszdev vmcp + + # Hook to parse zdev kernel parameter + inst_hook cmdline 95 "$moddir/parse-zdev.sh" + + # Obtain root device configuration + # Exit early if root device type is unknown if ! lszdev --by-path / >/dev/null 2>&1 ; then return 0 --- /dev/null +++ b/zdev/dracut/95zdev/parse-zdev.sh @@ -0,0 +1,38 @@ +#!/bin/sh +# +# Copyright IBM Corp. 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. +# +# 95zdev/parse-zdev.sh +# Parse the kernel command line for rd.zdev kernel parameters. These +# parameters are evaluated and used to configure z Systems specific devices. +# +# Format: +# rd.zdev=no-auto +# +# where +# +# no-auto: Indicates that firmware-provided I/O configuration data +# should not be applied. +# + +zdev_fw_file="/sys/firmware/sclp_sd/config/data" +zdev_base_args="--force --yes --no-root-update --no-settle --auto-conf --quiet" + +if [ -e "$zdev_fw_file" ] ; then + zdev_auto=1 +else + zdev_auto=0 +fi + +for zdev_arg in $(getargs rd.zdev); do + if [ "$zdev_arg" = "no-auto" ] ; then + zdev_auto=0 + fi +done + +if [ $zdev_auto -eq 1 ] ; then + chzdev --import "$zdev_fw_file" $zdev_base_args +fi --- a/zdev/dracut/Makefile +++ b/zdev/dracut/Makefile @@ -11,11 +11,14 @@ ZDEVDIR := 95zdev # performs the following functions when dracut is run: # # - copy the persistent root device configuration to the initial ram disk +# - install a boot-time hook to apply firmware-provided configuration data +# to the system # ifeq ($(HAVE_DRACUT),1) install: $(INSTALL) -m 755 -d $(DESTDIR)$(MODDIR) $(INSTALL) -m 755 -d $(DESTDIR)$(MODDIR)/$(ZDEVDIR) $(INSTALL) -m 755 $(ZDEVDIR)/module-setup.sh \ + $(ZDEVDIR)/parse-zdev.sh \ $(DESTDIR)$(MODDIR)/$(ZDEVDIR)/ endif ++++++ s390-tools-sles15sp1-08-zdev-Integrate-firmware-auto-configuration-with-init.patch ++++++ Subject: zdev: Integrate firmware auto-configuration with initramfs-tools From: Peter Oberparleiter <[email protected]> Summary: zdev: Add support for handling I/O configuration data Description: LPARs that are running in IBM Dynamic Partition Manager (DPM) mode can access a firmware-generated I/O configuration data file that contains s390-specific information about available I/O devices such as qeth device numbers and parameters, and FCP device IDs. This data file is intended to remove the need for users to manually enter the corresponding device data during installation. Linux kernels with the corresponding support make the I/O configuration data available at the following location: /sys/firmware/sclp_sd/config/data This patch set adds support for handling this data file using the chzdev and lszdev tools: - I/O configuration data can be applied using chzdev's --import option - Initial RAM-Disk scripts automatically apply the I/O configuration data to the system configuration - lszdev can be used to display the applied auto-configuration data - chzdev can be used to manually override the auto-configuration data Upstream-ID: 3c5644ccfd46aab27df6e0ed783e94a620bc3fe6 Problem-ID: LS1604 Upstream-Description: zdev: Integrate firmware auto-configuration with initramfs-tools Add initramfs-tools scripts that apply firmware-provided I/O configuration data as auto-configuration during boot. This way, all I/O devices configured by DPM are automatically brought online without further user interaction. This mechanism is active by default. It can be deactivated by specifying the following parameter on the kernel command line: rd.zdev=no-auto Signed-off-by: Peter Oberparleiter <[email protected]> Signed-off-by: Jan Höppner <[email protected]> Signed-off-by: Peter Oberparleiter <[email protected]> --- README.md | 1 zdev/Makefile | 1 zdev/initramfs/Makefile | 22 ++++++++ zdev/initramfs/hooks/zdev | 39 +++++++++++++++ zdev/initramfs/scripts/init-top/zdev | 67 +++++++++++++++++++++++++++ 5 files changed, 130 insertions(+) --- a/README.md +++ b/README.md @@ -272,6 +272,7 @@ This table lists additional build or ins | __COMPONENT__ | __OPTION__ | __TOOLS__ | |----------------|:----------------:|:-------------------------------:| | dracut | `HAVE_DRACUT` | zdev | +| initramfs-tools| `HAVE_INITRAMFS` | zdev | The s390-tools build process uses "pkg-config" if available and hard-coded compiler and linker options otherwise. --- a/zdev/Makefile +++ b/zdev/Makefile @@ -8,6 +8,7 @@ install: all $(MAKE) -C src install $(MAKE) -C man install $(MAKE) -C dracut install + $(MAKE) -C initramfs install clean: $(MAKE) -C src clean --- /dev/null +++ b/zdev/initramfs/Makefile @@ -0,0 +1,22 @@ +# Common definitions +include ../../common.mak + +INITRAMFSDIR := /usr/share/initramfs-tools +HOOKDIR := $(INITRAMFSDIR)/hooks +INITTOP := $(INITRAMFSDIR)/scripts/init-top + +# HAVE_INITRAMFS +# +# This install time parameter determines whether the zdev initramfs support is +# installed (HAVE_INITRAMFS=1) or not (default). When installed, the module +# performs the following functions when mkinitramfs is run: +# +# - install a boot-time hook to apply firmware-provided configuration data +# to the system +# +ifeq ($(HAVE_INITRAMFS),1) +install: + $(INSTALL) -m 755 -d $(DESTDIR)/$(HOOKDIR) $(DESTDIR)/$(INITTOP) + $(INSTALL) -m 755 hooks/zdev $(DESTDIR)/$(HOOKDIR) + $(INSTALL) -m 755 scripts/init-top/zdev $(DESTDIR)/$(INITTOP) +endif --- /dev/null +++ b/zdev/initramfs/hooks/zdev @@ -0,0 +1,39 @@ +#!/bin/sh +# +# Copyright IBM Corp. 2016, 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. +# +# hooks/zdev +# This hook script adds files required to apply firmware-provided I/O +# configuration data during boot. +# + +PREREQ="" + +prereqs() +{ + echo "$PREREQ" +} + +case $1 in + prereqs) + prereqs + exit 0 + ;; +esac + +. /usr/share/initramfs-tools/hook-functions + +# Add modules for all device types supported by chzdev (required for +# auto-configuration) +zdev_modules="lcs qeth qeth_l2 qeth_l3 dasd_mod dasd_eckd_mod dasd_fba_mod dasd_diag_mod zfcp" + +for x in $zdev_modules ; do + manual_add_modules ${x} +done + +copy_exec /sbin/chzdev +copy_exec /sbin/lszdev +copy_exec /sbin/vmcp --- /dev/null +++ b/zdev/initramfs/scripts/init-top/zdev @@ -0,0 +1,67 @@ +#!/bin/sh +# +# Copyright IBM Corp. 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. +# +# scripts/init-top/zdev +# Parse the kernel command line for rd.zdev kernel parameters. These +# parameters are evaluated and used to configure z Systems specific devices. +# +# Format: +# rd.zdev=no-auto +# +# where +# +# no-auto: Indicates that firmware-provided I/O configuration data +# should not be applied. +# + +PREREQ="udev" + +prereqs() +{ + echo "$PREREQ" +} + +case $1 in +prereqs) + prereqs + exit 0 + ;; +esac + +. /scripts/functions + +zdev_fw_file="/sys/firmware/sclp_sd/config/data" +zdev_base_args="--force --yes --no-root-update --no-settle --auto-conf --quiet" + +if [ -e "$zdev_fw_file" ] ; then + zdev_auto=1 +else + zdev_auto=0 +fi + +for x in $(cat /proc/cmdline); do + case ${x} in + rd.zdev=*) + zdev_arg=${x#*=} + if [ "$zdev_arg" = "no-auto" ] ; then + zdev_auto=0 + fi + ;; + esac +done + +if [ $zdev_auto -eq 1 ] ; then + log_begin_msg "Starting firmware auto-configuration" + chzdev --import "$zdev_fw_file" $zdev_base_args + log_end_msg + + # Repeat cold-plug after creating udev rules + udevadm control --reload + udevadm trigger --type=subsystems --action=add + udevadm trigger --action=add + udevadm settle || true +fi ++++++ s390-tools-sles15sp1-09-zdev-Implement-internal-device-attributes.patch ++++++ Subject: zdev: Implement internal device attributes From: Peter Oberparleiter <[email protected]> Summary: zdev: Add support for handling I/O configuration data Description: LPARs that are running in IBM Dynamic Partition Manager (DPM) mode can access a firmware-generated I/O configuration data file that contains s390-specific information about available I/O devices such as qeth device numbers and parameters, and FCP device IDs. This data file is intended to remove the need for users to manually enter the corresponding device data during installation. Linux kernels with the corresponding support make the I/O configuration data available at the following location: /sys/firmware/sclp_sd/config/data This patch set adds support for handling this data file using the chzdev and lszdev tools: - I/O configuration data can be applied using chzdev's --import option - Initial RAM-Disk scripts automatically apply the I/O configuration data to the system configuration - lszdev can be used to display the applied auto-configuration data - chzdev can be used to manually override the auto-configuration data Upstream-ID: c0392efa39e48cb12fdf3524b2f9e683e46f0f14 Problem-ID: LS1604 Upstream-Description: zdev: Implement internal device attributes This change adds base infrastructure for implementing internal device attributes. In the context of the zdev tools, an internal device attribute is a new type of device attribute with the following characteristics: - Can be set and removed like normal device attributes - Affects zdev-internal handling only - Does not correspond to an actual device attribute, that is it has no representation in SysFS - Can not be set in the active configuration - Name starts with "zdev:" to prevent conflicts with actual device attributes Values for internal device attributes are stored in udev rules alongside the normal persistent configuration of a device. They are encoded as udev environment variables. Note that they have no further effect on udev processing. Signed-off-by: Peter Oberparleiter <[email protected]> Signed-off-by: Jan Höppner <[email protected]> Signed-off-by: Peter Oberparleiter <[email protected]> --- zdev/include/attrib.h | 2 zdev/include/internal.h | 20 +++++++++ zdev/include/misc.h | 1 zdev/include/udev.h | 7 +++ zdev/src/Makefile | 4 - zdev/src/device.c | 15 +++++++ zdev/src/internal.c | 25 ++++++++++++ zdev/src/misc.c | 15 +++++++ zdev/src/udev.c | 32 +++++++++++++++ zdev/src/udev_ccw.c | 16 +++++++ zdev/src/udev_ccwgroup.c | 11 +++++ zdev/src/udev_zfcp_lun.c | 80 ++++++++++++++++++++++++++++++++++++--- 12 files changed, 220 insertions(+), 8 deletions(-) --- a/zdev/include/attrib.h +++ b/zdev/include/attrib.h @@ -189,6 +189,7 @@ struct value_map { * in the persistent configuration * @nounload: (Device type attributes only) This attribute can be set while * the corresponding kernel module remains loaded. + * @internal: This attribute only affects internal handling * @order: A number indicating the order in which to apply attribute * @order_cmp: A function determining if a setting for this attribute should * be applied before (-1) or after (1) another setting, or @@ -216,6 +217,7 @@ struct attrib { unsigned int activerem :1; unsigned int defunset :1; unsigned int nounload :1; + unsigned int internal :1; /* Optional */ int order; --- /dev/null +++ b/zdev/include/internal.h @@ -0,0 +1,20 @@ +/* + * zdev - Modify and display the persistent configuration of devices + * + * Copyright IBM Corp. 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 INTERNAL_H +#define INTERNAL_H + +#include <stdbool.h> + +#define INTERNAL_ATTR_PREFIX "zdev:" + +const char *internal_get_name(const char *name); +bool internal_by_name(const char *name); + +#endif /* INTERNAL_H */ --- a/zdev/include/misc.h +++ b/zdev/include/misc.h @@ -183,6 +183,7 @@ bool str_to_config(const char *, config_ char *quote_str(const char *, int); char *unquote_str(const char *); char *shrink_str(const char *); +char *misc_strrstr(const char *haystack, const char *needle); struct util_list *strlist_new(void); void strlist_free(struct util_list *); --- a/zdev/include/udev.h +++ b/zdev/include/udev.h @@ -13,6 +13,9 @@ #include "lib/util_list.h" #include "exit_code.h" +struct attrib; +struct setting_list; + extern int udev_need_settle; extern int udev_no_settle; @@ -46,4 +49,8 @@ exit_code_t udev_remove_rule(const char void udev_settle(void); +void udev_add_internal_from_entry(struct setting_list *list, + struct udev_entry_node *entry, + struct attrib **attribs); + #endif /* UDEV_H */ --- a/zdev/src/Makefile +++ b/zdev/src/Makefile @@ -8,7 +8,7 @@ ALL_CPPFLAGS += -I ../include -std=gnu99 chzdev_objects += attrib.o chzdev.o device.o devnode.o devtype.o exit_code.o \ export.o hash.o inuse.o misc.o namespace.o opts.o path.o \ root.o select.o setting.o subtype.o table.o table_attribs.o \ - table_types.o net.o firmware.o + table_types.o net.o firmware.o internal.o # Devtype Helpers chzdev_objects += blkinfo.o ccw.o ccwgroup.o findmnt.o modprobe.o module.o \ @@ -38,7 +38,7 @@ chzdev_objects += generic_ccw.o lszdev_objects += attrib.o lszdev.o device.o devnode.o devtype.o exit_code.o \ export.o hash.o inuse.o misc.o namespace.o opts.o path.o \ root.o select.o setting.o subtype.o table.o table_types.o \ - net.o + net.o internal.o # Devtype Helpers lszdev_objects += blkinfo.o ccw.o ccwgroup.o findmnt.o modprobe.o module.o \ --- a/zdev/src/device.c +++ b/zdev/src/device.c @@ -16,6 +16,7 @@ #include "attrib.h" #include "device.h" #include "devtype.h" +#include "internal.h" #include "misc.h" #include "namespace.h" #include "setting.h" @@ -221,6 +222,9 @@ static exit_code_t apply_setting(struct goto err_activeonly_forceable; if (!force && SCOPE_AUTOCONF(config) && a->activeonly) goto err_activeonly_forceable; + /* Check for internal. */ + if (config == config_active && a->internal) + goto err_int_noactive; /* Check for multiple values. */ if (!force && !a->multi && strlist_find(processed, key)) goto err_multi_forceable; @@ -230,6 +234,9 @@ static exit_code_t apply_setting(struct goto err_unknown; if (!force) goto err_unknown_forceable; + /* Check for internal. */ + if (config == config_active && internal_by_name(key)) + goto err_int_noactive; } strlist_add(processed, "%s", key); @@ -294,6 +301,11 @@ err_activeonly_forceable: delayed_forceable("Attribute '%s' should only be changed in the active " "config\n", a->name); return EXIT_INVALID_SETTING; + +err_int_noactive: + delayed_err("Internal attribute '%s' cannot be set in the active config\n", + key); + return EXIT_INVALID_SETTING; } /* Apply device settings from strlist to device. */ @@ -542,6 +554,9 @@ exit_code_t device_write_active_settings s = p->ptr; if (!s->modified || s->removed) continue; + if ((s->attrib && s->attrib->internal) || + internal_by_name(s->name)) + continue; path = subtype_get_active_attrib_path(st, dev, s->name); if (!path) { --- /dev/null +++ b/zdev/src/internal.c @@ -0,0 +1,25 @@ +/* + * zdev - Modify and display the persistent configuration of devices + * + * Copyright IBM Corp. 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. + */ + +#include <stdbool.h> + +#include "internal.h" +#include "misc.h" + +/* Return identifier of internal attribute with specified @name. */ +const char *internal_get_name(const char *name) +{ + return name + sizeof(INTERNAL_ATTR_PREFIX) - 1; +} + +/* Check if attribute is internal by name. */ +bool internal_by_name(const char *name) +{ + return starts_with(name, INTERNAL_ATTR_PREFIX); +} --- a/zdev/src/misc.c +++ b/zdev/src/misc.c @@ -1717,3 +1717,18 @@ void debug_init(int argc, char *argv[]) fprintf(stderr, "%s\"%s\"", i > 0 ? ", " : "", argv[i]); fprintf(stderr, "\n"); } + +/* Return the last occurrence of @needle in @haystack, or %NULL if @needle + * was not found. */ +char *misc_strrstr(const char *haystack, const char *needle) +{ + char *result, *next; + + result = strstr(haystack, needle); + if (result) { + while ((next = strstr(result + 1, needle))) + result = next; + } + + return result; +} --- a/zdev/src/udev.c +++ b/zdev/src/udev.c @@ -409,3 +409,35 @@ void udev_settle(void) return; misc_system(err_ignore, "%s settle", PATH_UDEVADM); } + +/* Extract internal attribute settings from @entry and add to @list. + * Associate corresponding attribute if found in @attribs. */ +void udev_add_internal_from_entry(struct setting_list *list, + struct udev_entry_node *entry, + struct attrib **attribs) +{ + char *copy, *name, *end, *u; + struct attrib *a; + + /* ENV{zdev_var}="1" */ + copy = misc_strdup(entry->key); + + /* Find attribute name start. */ + name = strchr(copy, '{'); + end = strrchr(copy, '}'); + if (!name || !end) + goto out; + *end = 0; + name++; + + /* zdev_ => zdev: */ + u = strchr(name, '_'); + if (u) + *u = ':'; + + a = attrib_find(attribs, name); + setting_list_apply_actual(list, a, name, entry->value); + +out: + free(copy); +} --- a/zdev/src/udev_ccw.c +++ b/zdev/src/udev_ccw.c @@ -18,6 +18,7 @@ #include "attrib.h" #include "ccw.h" #include "device.h" +#include "internal.h" #include "misc.h" #include "path.h" #include "setting.h" @@ -49,6 +50,12 @@ static void add_setting_from_entry(struc char *copy, *name, *end; struct attrib *a; + /* ENV{zdev_var}="1" */ + if (starts_with(entry->key, "ENV{zdev_") && + strcmp(entry->op, "=") == 0) { + udev_add_internal_from_entry(list, entry, attribs); + return; + } /* ATTR{[ccw/0.0.37bf]online}=1 */ if (strncmp(entry->key, "ATTR{[ccw/", 10) != 0 || strcmp(entry->op, "=") != 0) @@ -190,7 +197,14 @@ exit_code_t udev_ccw_write_device(struct s = p->ptr; if (s->removed) continue; - fprintf(fd, "ATTR{[ccw/%s]%s}=\"%s\"\n", id, s->name, s->value); + if ((s->attrib && s->attrib->internal) || + internal_by_name(s->name)) { + fprintf(fd, "ENV{zdev_%s}=\"%s\"\n", + internal_get_name(s->name), s->value); + } else { + fprintf(fd, "ATTR{[ccw/%s]%s}=\"%s\"\n", id, s->name, + s->value); + } } /* Write udev rule epilog. */ --- a/zdev/src/udev_ccwgroup.c +++ b/zdev/src/udev_ccwgroup.c @@ -18,6 +18,7 @@ #include "attrib.h" #include "ccwgroup.h" #include "device.h" +#include "internal.h" #include "misc.h" #include "path.h" #include "setting.h" @@ -68,6 +69,12 @@ static void add_setting_from_entry(struc char *copy, *name, *end; struct attrib *a; + /* ENV{zdev_var}="1" */ + if (starts_with(entry->key, "ENV{zdev_") && + strcmp(entry->op, "=") == 0) { + udev_add_internal_from_entry(list, entry, attribs); + return; + } /* ATTR{[ccwgroup/0.0.f5f0]online}=1 */ if (strncmp(entry->key, "ATTR{[ccwgroup/", 10) != 0 || strcmp(entry->op, "=") != 0) @@ -282,6 +289,10 @@ exit_code_t udev_ccwgroup_write_device(s fprintf(fd, "ATTR{[ccwgroup/%s]%s}=\"%s\"\n", ccw_id, s->name, str->str); } + } else if ((s->attrib && s->attrib->internal) || + internal_by_name(s->name)) { + fprintf(fd, "ENV{zdev_%s}=\"%s\"\n", + internal_get_name(s->name), s->value); } else { fprintf(fd, "ATTR{[ccwgroup/%s]%s}=\"%s\"\n", ccw_id, s->name, s->value); --- a/zdev/src/udev_zfcp_lun.c +++ b/zdev/src/udev_zfcp_lun.c @@ -18,6 +18,7 @@ #include "attrib.h" #include "device.h" +#include "internal.h" #include "misc.h" #include "path.h" #include "scsi.h" @@ -128,7 +129,7 @@ static bool zfcp_lun_devid_from_entry(st struct udev_entry_node *entry) { struct zfcp_lun_devid id; - char *copy = NULL, *s; + char *copy = NULL, *s, *e, *u; int i; bool rc = false; @@ -182,6 +183,28 @@ static bool zfcp_lun_devid_from_entry(st goto out; } + /*ENV{zdev_var__0_0_1941_0x500507630510c1ae_0x402340d400000000}="1"*/ + if (starts_with(entry->key, "ENV{zdev_")) { + copy = misc_strdup(entry->key); + + /* Find ID start (last __) and end (last }). */ + s = misc_strrstr(copy, "__"); + e = strrchr(copy, '}'); + if (!s || !e) + goto out; + *e = 0; + s += 2; + /* Convert variable name to ID format. */ + for (i = 0, u = s; (u = strchr(u, '_')); i++, u++) { + if (i < 2) + *u = '.'; + else + *u = ':'; + } + rc = zfcp_lun_parse_devid(&id, s, err_ignore) == EXIT_OK ? + true : false; + } + out: free(copy); if (rc) @@ -211,11 +234,46 @@ static struct zfcp_lun_node *zfcp_lun_no return node; } +static void add_internal_setting_from_entry(struct udev_entry_node *entry, + struct zfcp_lun_node *node) +{ + char *copy, *name, *end, *u; + struct attrib *a; + + /*ENV{zdev_var__0_0_1941_0x500507630510c1ae_0x402340d400000000}="1"*/ + copy = misc_strdup(entry->key); + + /* Find attribute name start and end. */ + name = strchr(copy, '{'); + end = misc_strrstr(copy, "__"); + if (!name || !end) + goto out; + *end = 0; + name++; + + /* zdev_ => zdev: */ + u = strchr(name, '_'); + if (u) + *u = ':'; + + a = attrib_find(zfcp_lun_subtype.dev_attribs, name); + setting_list_apply_actual(node->fc_settings, a, name, entry->value); + +out: + free(copy); +} + static void add_fc_setting_from_entry(struct udev_entry_node *entry, struct zfcp_lun_node *node) { char *copy, *s, *e; + /*ENV{zdev_var__0_0_1941_0x500507630510c1ae_0x402340d400000000}="1"*/ + if (starts_with(entry->key, "ENV{zdev_") && + strcmp(entry->op, "=") == 0) { + add_internal_setting_from_entry(entry, node); + return; + } /*ATTR{[ccw/0.0.1941]0x500507630510c1ae/0x402340d400000000/failed}="0"*/ if (!starts_with(entry->key, "ATTR{[ccw/")) return; @@ -490,7 +548,7 @@ static struct zfcp_lun_node *state_to_zf s->value); setting_list_add(node->scsi_settings, n); } else { - n = setting_new(NULL, s->name, s->value); + n = setting_new(s->attrib, s->name, s->value); setting_list_add(node->fc_settings, n); } } @@ -580,9 +638,21 @@ static exit_code_t write_luns_rule(const node->id.lun); util_list_iterate(&node->fc_settings->list, s) { - fprintf(fd, "ATTR{[ccw/%s]0x%016" PRIx64 "/0x%016" - PRIx64 "/%s}=\"%s\"\n", hba_id, node->id.wwpn, - node->id.lun, s->name, s->value); + if ((s->attrib && s->attrib->internal) || + internal_by_name(s->name)) { + fprintf(fd, "ENV{zdev_%s__%x_%x_%04x_0x%016" + PRIx64 "_0x%016" PRIx64 "}=\"%s\"\n", + internal_get_name(s->name), + node->id.fcp_dev.cssid, + node->id.fcp_dev.ssid, + node->id.fcp_dev.devno, node->id.wwpn, + node->id.lun, s->value); + } else { + fprintf(fd, "ATTR{[ccw/%s]0x%016" PRIx64 + "/0x%016" PRIx64 "/%s}=\"%s\"\n", + hba_id, node->id.wwpn, node->id.lun, + s->name, s->value); + } } last_node = node; } ++++++ s390-tools-sles15sp1-10-zdev-Implement-support-for-early-device-configuratio.patch ++++++ Subject: zdev: Implement support for early device configuration From: Peter Oberparleiter <[email protected]> Summary: zdev: Add support for handling I/O configuration data Description: LPARs that are running in IBM Dynamic Partition Manager (DPM) mode can access a firmware-generated I/O configuration data file that contains s390-specific information about available I/O devices such as qeth device numbers and parameters, and FCP device IDs. This data file is intended to remove the need for users to manually enter the corresponding device data during installation. Linux kernels with the corresponding support make the I/O configuration data available at the following location: /sys/firmware/sclp_sd/config/data This patch set adds support for handling this data file using the chzdev and lszdev tools: - I/O configuration data can be applied using chzdev's --import option - Initial RAM-Disk scripts automatically apply the I/O configuration data to the system configuration - lszdev can be used to display the applied auto-configuration data - chzdev can be used to manually override the auto-configuration data Upstream-ID: 156450f359bb13776fac2130a1cac00a48c2deda Problem-ID: LS1604 Upstream-Description: zdev: Implement support for early device configuration Enable user to specify that a device should be configured early, that is during the initial RAM-disk boot phase. This may be necessary, e.g. to override auto-configuration for a device which is also applied during that boot phase. It may also be used to manually specify devices that are required to access the root file system, such as networking devices. Users can mark devices as requiring early configuration by specifying a value of 1 for the newly added internal attribute zdev:early: # chzdev dasd-eckd 0.0.1234 -p zdev:early=1 This can be changed back by removing the attribute setting, or by setting the attribute value to 0: # chzdev dasd-eckd 0.0.1234 -p -r zdev:early or # chzdev dasd-eckd 0.0.1234 -p zdev:early=0 Signed-off-by: Peter Oberparleiter <[email protected]> Signed-off-by: Jan Höppner <[email protected]> Signed-off-by: Peter Oberparleiter <[email protected]> --- zdev/dracut/95zdev/module-setup.sh | 21 +------ zdev/include/internal.h | 5 + zdev/initramfs/hooks/zdev | 19 ++++++ zdev/man/chzdev.8 | 29 ++++++++++ zdev/src/chzdev.c | 4 - zdev/src/ctc.c | 2 zdev/src/dasd.c | 3 + zdev/src/generic_ccw.c | 2 zdev/src/internal.c | 13 ++++ zdev/src/lcs.c | 2 zdev/src/qeth.c | 2 zdev/src/root.c | 82 ++++++++++++++++++++++------- zdev/src/zfcp_host.c | 2 zdev/src/zfcp_lun.c | 2 14 files changed, 152 insertions(+), 36 deletions(-) --- a/zdev/dracut/95zdev/module-setup.sh +++ b/zdev/dracut/95zdev/module-setup.sh @@ -45,23 +45,12 @@ install() { # Hook to parse zdev kernel parameter inst_hook cmdline 95 "$moddir/parse-zdev.sh" - # Obtain root device configuration - - # Exit early if root device type is unknown - if ! lszdev --by-path / >/dev/null 2>&1 ; then - return 0 - fi - + # Obtain early + root device configuration _tempfile=$(mktemp --tmpdir dracut-zdev.XXXXXX) - - if chzdev --export - --persistent --by-path / >/dev/null 2>&1 ; then - # Use persistent configuration - chzdev --export "$_tempfile" --persistent --by-path / --quiet --type - else - # Use active configuration - chzdev --export "$_tempfile" --active --by-path / --quiet --type - sed -i -e 's/active/persistent/g' "$_tempfile" - fi + chzdev --export "$_tempfile" --persistent --by-path / --quiet \ + --type 2>/dev/null + chzdev --export - --persistent --by-attrib "zdev:early=1" --quiet \ + --type 2>/dev/null >> "$_tempfile" # Apply via --import to prevent other devices from being configured chzdev --import "$_tempfile" --persistent --base "/etc=$initdir/etc" \ --- a/zdev/include/internal.h +++ b/zdev/include/internal.h @@ -12,7 +12,12 @@ #include <stdbool.h> +#include "attrib.h" + #define INTERNAL_ATTR_PREFIX "zdev:" +#define INTERNAL_ATTR_EARLY INTERNAL_ATTR_PREFIX "early" + +extern struct attrib internal_attr_early; const char *internal_get_name(const char *name); bool internal_by_name(const char *name); --- a/zdev/initramfs/hooks/zdev +++ b/zdev/initramfs/hooks/zdev @@ -10,7 +10,8 @@ # configuration data during boot. # -PREREQ="" +# Needs to run after udev or resulting udev rules could be overwritten +PREREQ="udev" prereqs() { @@ -37,3 +38,19 @@ done copy_exec /sbin/chzdev copy_exec /sbin/lszdev copy_exec /sbin/vmcp + +_tempfile=$(mktemp --tmpdir initramfs-zdev.XXXXXX) + +# Obtain early + root device configuration +chzdev --export "$_tempfile" --persistent --by-path / \ + --by-attrib "zdev:early=1" --quiet --type 2>/dev/null + +# Apply via --import to prevent other devices from being configured. +# Rename the resulting cio-ignore rule to ensure that it does not override +# the one copied by the initramfs udev hook to /lib/udev. +chzdev --import "$_tempfile" --persistent \ + --base "/etc/udev/rules.d/41-cio-ignore.rules=$DESTDIR/etc/udev/rules.d/41-cio-ignore-root.rules" \ + --base "/etc=$DESTDIR/etc" --yes --quiet --no-root-update --force \ + >/dev/null + +rm -f "$_tempfile" --- a/zdev/man/chzdev.8 +++ b/zdev/man/chzdev.8 @@ -334,6 +334,35 @@ a specific attribute. .PP . . +.SS "Special settings" +The following special settings affect how devices are handled by chzdev: +.PP +. +.BR zdev:early =0|1 +.RS 4 +Control in which stage of the boot process a device is activated: +.TP 4 +.B 0 +Device is activated normally during boot (default). +.PP +.TP 4 +.B 1 +Device is activated early in the boot process, by the initial RAM-disk. +.PP +Specify a value of 1 for this attribute in any of the following situations: +.TP 4 +\(bu +To ensure that your settings override auto-configuration settings. +.PP +.TP 4 +\(bu +To ensure that a device required to access the root file system is correctly +enabled during boot. An example would be a networking device, or a device that +is intended to extend a logical volume that provides the root file system. +.PP +.RE +. +. .SH ACTIONS You can use one of the action options listed below to specify the .B main tool action --- a/zdev/src/chzdev.c +++ b/zdev/src/chzdev.c @@ -3025,8 +3025,8 @@ int main(int argc, char *argv[]) if ((pers_mod_devs || pers_mod_devtypes) && !opts.no_root_check && !dryrun) { - /* If the root device/device type has been modified, additional - * work might be necessary. */ + /* If the root device/device type or early devices have been + * modified, additional work might be necessary. */ rc = root_check(); if (rc && !drc) drc = rc; --- a/zdev/src/ctc.c +++ b/zdev/src/ctc.c @@ -17,6 +17,7 @@ #include "ctc_auto.h" #include "device.h" #include "devtype.h" +#include "internal.h" #include "misc.h" #include "namespace.h" #include "path.h" @@ -425,6 +426,7 @@ static struct subtype ctc_subtype = { &ccw_attr_online, &ctc_attr_buffer, &ctc_attr_protocol, + &internal_attr_early, ), .unknown_dev_attribs = 1, .support_definable = 1, --- a/zdev/src/dasd.c +++ b/zdev/src/dasd.c @@ -16,6 +16,7 @@ #include "dasd.h" #include "device.h" #include "devtype.h" +#include "internal.h" #include "misc.h" #include "modprobe.h" #include "module.h" @@ -616,6 +617,7 @@ struct subtype dasd_subtype_eckd = { &dasd_attr_reservation_policy, &dasd_attr_last_known_reservation_state, &dasd_attr_safe_offline, + &internal_attr_early, ), .unknown_dev_attribs = 1, @@ -651,6 +653,7 @@ struct subtype dasd_subtype_fba = { &dasd_attr_reservation_policy, &dasd_attr_last_known_reservation_state, &dasd_attr_safe_offline, + &internal_attr_early, ), .unknown_dev_attribs = 1, --- a/zdev/src/generic_ccw.c +++ b/zdev/src/generic_ccw.c @@ -17,6 +17,7 @@ #include "devnode.h" #include "devtype.h" #include "generic_ccw.h" +#include "internal.h" #include "namespace.h" #include "path.h" #include "subtype.h" @@ -182,6 +183,7 @@ static struct subtype generic_ccw_subtyp .dev_attribs = ATTRIB_ARRAY( &ccw_attr_online, &ccw_attr_cmb_enable, + &internal_attr_early, ), .unknown_dev_attribs = 1, .generic = 1, --- a/zdev/src/internal.c +++ b/zdev/src/internal.c @@ -9,9 +9,22 @@ #include <stdbool.h> +#include "attrib.h" #include "internal.h" #include "misc.h" +struct attrib internal_attr_early = { + .name = INTERNAL_ATTR_EARLY, + .title = "Activate device early during boot", + .desc = "Control the time of activation of a device:\n" + " 0: Device is activated normally during boot\n" + " 1: Device is activated early in the boot process, by the\n" + " initial RAM-disk\n", + .defval = "0", + .accept = ACCEPT_ARRAY(ACCEPT_RANGE(0, 1)), + .internal = 1, +}; + /* Return identifier of internal attribute with specified @name. */ const char *internal_get_name(const char *name) { --- a/zdev/src/lcs.c +++ b/zdev/src/lcs.c @@ -15,6 +15,7 @@ #include "ccwgroup.h" #include "device.h" #include "devtype.h" +#include "internal.h" #include "lcs.h" #include "lcs_auto.h" #include "misc.h" @@ -362,6 +363,7 @@ static struct subtype lcs_subtype = { &ccw_attr_online, &lcs_attr_lancmd_timeout, &lcs_attr_recover, + &internal_attr_early, ), .unknown_dev_attribs = 1, .support_definable = 1, --- a/zdev/src/qeth.c +++ b/zdev/src/qeth.c @@ -15,6 +15,7 @@ #include "ccwgroup.h" #include "device.h" #include "devtype.h" +#include "internal.h" #include "misc.h" #include "namespace.h" #include "nic.h" @@ -1445,6 +1446,7 @@ struct subtype qeth_subtype_qeth = { &qeth_attr_vnicc_takeover_learning, &qeth_attr_vnicc_bridge_invisible, &qeth_attr_vnicc_rx_bcast, + &internal_attr_early, ), .unknown_dev_attribs = 1, .support_definable = 1, --- a/zdev/src/root.c +++ b/zdev/src/root.c @@ -8,11 +8,13 @@ */ #include <stdlib.h> +#include <string.h> #include "lib/util_path.h" #include "device.h" #include "devtype.h" +#include "internal.h" #include "misc.h" #include "path.h" #include "root.h" @@ -20,31 +22,78 @@ #include "setting.h" #include "subtype.h" -/* Determine if the root device was modified. If it was modified, run the - * corresponding root-install scripts. */ +static bool is_early_removed(struct device *dev) +{ + struct setting *s; + + s = setting_list_find(dev->persistent.settings, + internal_attr_early.name); + if (!s || !s->modified) + return false; + if (!s->actual_value || strcmp(s->actual_value, "1") != 0) + return false; + if (s->removed || strcmp(s->value, "0") == 0) + return true; + return false; +} + +static void add_early_removed(struct util_list *selected) +{ + int i, j; + struct devtype *dt; + struct subtype *st; + struct device *dev; + + for (i = 0; devtypes[i]; i++) { + dt = devtypes[i]; + for (j = 0; dt->subtypes[j]; j++) { + st = dt->subtypes[j]; + util_list_iterate(&st->devices->hash.list, dev) { + if (is_early_removed(dev)) { + selected_dev_list_add(selected, dt, st, + dev->id, NULL, EXIT_OK); + } + } + } + } +} + +/* Determine if initial RAM-disk needs updating. If so, run the corresponding + * scripts if available. */ exit_code_t root_check(void) { struct util_list *selected, *params, *mod = NULL; struct selected_dev_node *sel; struct device *dev; char *params_str; - exit_code_t rc; + exit_code_t rc = EXIT_OK; struct strlist_node *s; struct devtype *dt; + struct select_opts *select; - debug("Checking for modified root device configuration\n"); + debug("Checking for required initial RAM-disk update\n"); - /* Get list of devices that provide the root device. */ + /* Get list of devices that provide the root device or require + * early configuration. */ selected = selected_dev_list_new(); - rc = select_by_path(NULL, selected, config_active, scope_mandatory, - NULL, NULL, PATH_ROOT, err_ignore); - if (rc) { + /* First add devices that had zdev:early removed or changed to 0. + * The subsequent call to select_devices() will filter out any + * duplicates. */ + add_early_removed(selected); + /* Now add devices required for root file system. */ + if (select_by_path(NULL, selected, config_active, scope_mandatory, + NULL, NULL, PATH_ROOT, err_ignore)) { /* Running from an unknown root device is not an error. */ verb("Note: Could not determine if root device configuration " "needs to be updated\n"); - rc = 0; - goto out; } + /* Finally add devices with zdev:early=1. */ + select = select_opts_new(); + strlist_add(&select->by_attr, "%s=1", INTERNAL_ATTR_EARLY); + select_devices(select, selected, 1, 0, 0, + config_active | config_persistent, scope_mandatory, + err_ignore); + select_opts_free(select); /* Determine if any of the devices or device types has been modified. */ mod = strlist_new(); @@ -68,19 +117,18 @@ exit_code_t root_check(void) if (util_list_is_empty(mod)) goto out; - info("Note: Some of the changes affect devices providing the root " - "file system:\n"); + info("Note: The initial RAM-disk must be updated for these changes to take effect:\n"); util_list_iterate(mod, s) info(" - %s\n", s->str); - info(" Additional steps such as rebuilding the RAM-disk might be " - "required.\n"); /* Check if script is available. */ - if (!util_path_is_reg_file(PATH_ROOT_SCRIPT)) + if (!util_path_is_reg_file(PATH_ROOT_SCRIPT)) { + warn("A manual update of the initial RAM-disk is required.\n"); goto out; + } /* Ask for confirmation. */ - if (!confirm("Update persistent root device configuration now?")) { + if (!confirm("Update initial RAM-disk now?")) { rc = EXIT_ABORTED; goto out; } @@ -97,7 +145,7 @@ exit_code_t root_check(void) /* Run update command. */ if (misc_system(err_delayed_print, "%s %s", PATH_ROOT_SCRIPT, params_str) != 0) { - error("Failure while updating root device configuration\n"); + error("Failure while updating initial RAM-disk\n"); delayed_print(DELAY_INDENT); rc = EXIT_RUNTIME_ERROR; } --- a/zdev/src/zfcp_host.c +++ b/zdev/src/zfcp_host.c @@ -17,6 +17,7 @@ #include "ccw.h" #include "device.h" #include "devtype.h" +#include "internal.h" #include "misc.h" #include "path.h" #include "setting.h" @@ -247,6 +248,7 @@ struct subtype zfcp_host_subtype = { &zfcp_host_attr_failed, &zfcp_host_attr_port_remove, &zfcp_host_attr_port_rescan, + &internal_attr_early, ), .unknown_dev_attribs = 1, --- a/zdev/src/zfcp_lun.c +++ b/zdev/src/zfcp_lun.c @@ -21,6 +21,7 @@ #include "devnode.h" #include "devtype.h" #include "misc.h" +#include "internal.h" #include "namespace.h" #include "path.h" #include "scsi.h" @@ -1097,6 +1098,7 @@ struct subtype zfcp_lun_subtype = { &zfcp_lun_attr_scsi_timeout, &zfcp_lun_attr_scsi_state, &zfcp_lun_attr_scsi_delete, + &internal_attr_early, ), .prefixes = STRING_ARRAY(SCSI_ATTR_PREFIX), .unknown_dev_attribs = 1, ++++++ s390-tools-sles15sp1-11-zdev-Do-not-call-zipl-on-initrd-update.patch ++++++ Subject: zdev: Add support for handling I/O configuration data From: Peter Oberparleiter <[email protected]> Summary: zdev: Add support for handling I/O configuration data Description: LPARs that are running in IBM Dynamic Partition Manager (DPM) mode can access a firmware-generated I/O configuration data file that contains s390-specific information about available I/O devices such as qeth device numbers and parameters, and FCP device IDs. This data file is intended to remove the need for users to manually enter the corresponding device data during installation. Linux kernels with the corresponding support make the I/O configuration data available at the following location: /sys/firmware/sclp_sd/config/data This patch set adds support for handling this data file using the chzdev and lszdev tools: - I/O configuration data can be applied using chzdev's --import option - Initial RAM-Disk scripts automatically apply the I/O configuration data to the system configuration - lszdev can be used to display the applied auto-configuration data - chzdev can be used to manually override the auto-configuration data Upstream-ID: - Problem-ID: LS1604 Signed-off-by: Peter Oberparleiter <[email protected]> --- zdev/src/zdev-root-update.dracut | 6 ------ 1 file changed, 6 deletions(-) --- a/zdev/src/zdev-root-update.dracut +++ b/zdev/src/zdev-root-update.dracut @@ -20,10 +20,4 @@ dracut -f || { exit 1 } -echo "Installing IPL record" -zipl --noninteractive || { - echo "${TOOLNAME}: Error: Could not install IPL record" >&2 - exit 1 -} - exit 0 ++++++ s390-tools-sles15sp1-zdev-fix-qeth-BridgePort-and-VNICC-conflict-checking.patch ++++++ Subject: zdev: qeth BridgePort and VNICC attribute conflict From: Hans Wippel <[email protected]> Description: zdev: qeth BridgePort and VNICC attribute conflict Symptom: chzdev cannot set VNICC attributes due to a conflict with BridgePort attributes. Problem: Existing conflict checking always assumes a BridgePort and a VNICC attribute are active. Solution: Introduce a function that determines if BridgePort or VNICC attributes are active and use only active attributes for conflict checking. Reproduction: Set VNICC attribute with chzdev w/o active BridgePort attributes. Upstream-ID: df01c470c2a680a924ccdba3b6657af4669002b2 Problem-ID: 172409 Signed-off-by: Hans Wippel <[email protected]> --- zdev/src/qeth.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) --- a/zdev/src/qeth.c +++ b/zdev/src/qeth.c @@ -1171,6 +1171,37 @@ static exit_code_t check_ineffective_set return rc; } +/* Check if a possibly conflicting setting is active in the configuration */ +static bool conflict_setting_active(struct setting *s) +{ + enum qeth_attr_group_type t; + + t = get_attr_group_type(s); + if (t != group_bridge && t != group_vnicc) { + /* Check BridgePort and VNICC attributes only */ + return false; + } + if (s->specified) { + /* Specified on the command line: We are strict here and do not + * allow to specify VNICC and BridgePort attributes in the same + * command to avoid issues when attributes are enabled/disabled + * in the wrong order. Example: disable VNICC and enable + * BridgePort in the same command would result in an error + * because BridgePort attributes are set first. + */ + return true; + } + if (attrib_match_default(s->attrib, s->value)) { + /* Not active if set to default value */ + return false; + } + if (s->actual_value && strncmp(s->actual_value, "n/a", 3) == 0) { + /* Not active if in n/a state (conflicting attribute set) */ + return false; + } + return true; +} + /* Check if there are conflicting attribute settings */ static exit_code_t check_conflicting_settings(struct setting_list *list) { @@ -1182,6 +1213,8 @@ static exit_code_t check_conflicting_set util_list_iterate(&list->list, s) { if (s->removed) continue; + if (!conflict_setting_active(s)) + continue; t = get_attr_group_type(s); if (t == group_bridge && (!bridge || !bridge->specified)) bridge = s;
