forked from pool/s390-tools
158 lines
5.2 KiB
Diff
158 lines
5.2 KiB
Diff
|
Subject: zdev: Implement --no-settle
|
||
|
From: Peter Oberparleiter <oberpar@linux.ibm.com>
|
||
|
|
||
|
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 <oberpar@linux.vnet.ibm.com>
|
||
|
Signed-off-by: Jan Höppner <hoeppner@linux.ibm.com>
|
||
|
|
||
|
|
||
|
Signed-off-by: Peter Oberparleiter <oberpar@linux.ibm.com>
|
||
|
---
|
||
|
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);
|
||
|
}
|