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 - mpost@suse.com
+
+- 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
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
Signed-off-by: Jan Höppner
Signed-off-by: Peter Oberparleiter
---
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
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
Signed-off-by: Jan Höppner
Signed-off-by: Peter Oberparleiter
---
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
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
Signed-off-by: Jan Höppner
Signed-off-by: Peter Oberparleiter
---
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
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
Signed-off-by: Jan Höppner
Signed-off-by: Peter Oberparleiter
---
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
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
Signed-off-by: Jan Höppner
Signed-off-by: Peter Oberparleiter
---
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
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
Signed-off-by: Jan Höppner
Signed-off-by: Peter Oberparleiter
---
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
+
+#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
+
+#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
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
Signed-off-by: Jan Höppner
Signed-off-by: Peter Oberparleiter
---
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
+#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
+#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
+#include
#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
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
---
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
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
---
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;