parent
6ab82307f5
commit
0b15456cd5
27
0001-s390-tools-1.5.3-zipl-zfcpdump-2.patch
Normal file
27
0001-s390-tools-1.5.3-zipl-zfcpdump-2.patch
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
From 2b8336a93376953ba0ed84223264be55243ac7f8 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Dan Horak <dan@danny.cz>
|
||||||
|
Date: Sun, 20 Jul 2008 09:24:05 +0200
|
||||||
|
Subject: [PATCH 1/9] s390-tools-1.5.3-zipl-zfcpdump-2
|
||||||
|
|
||||||
|
---
|
||||||
|
common.mak | 4 ++--
|
||||||
|
1 files changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/common.mak b/common.mak
|
||||||
|
index 8b248f1..0a7916e 100644
|
||||||
|
--- a/common.mak
|
||||||
|
+++ b/common.mak
|
||||||
|
@@ -63,8 +63,8 @@ GROUP = $(shell id -gn)
|
||||||
|
export INSTROOT BINDIR LIBDIR MANDIR OWNER GROUP
|
||||||
|
|
||||||
|
# Special defines for zfcpdump
|
||||||
|
-ZFCPDUMP_DIR = /usr/local/share/zfcpdump
|
||||||
|
-ZFCPDUMP_IMAGE = zfcpdump.image
|
||||||
|
+ZFCPDUMP_DIR = /boot
|
||||||
|
+ZFCPDUMP_IMAGE = zfcpdump
|
||||||
|
ZFCPDUMP_RD = zfcpdump.rd
|
||||||
|
export ZFCPDUMP_DIR ZFCPDUMP_IMAGE ZFCPDUMP_RD
|
||||||
|
|
||||||
|
--
|
||||||
|
1.6.3.3
|
||||||
|
|
423
0002-s390-tools-1.8.1-zipl-automenu.patch
Normal file
423
0002-s390-tools-1.8.1-zipl-automenu.patch
Normal file
@ -0,0 +1,423 @@
|
|||||||
|
From 2513c0f8096c681f962d77420dac731f7bb33e44 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?utf-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Thu, 23 Apr 2009 11:45:36 +0200
|
||||||
|
Subject: [PATCH 2/9] s390-tools-1.8.1-zipl-automenu
|
||||||
|
|
||||||
|
---
|
||||||
|
zipl/man/zipl.8 | 7 ++
|
||||||
|
zipl/src/job.c | 194 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
|
||||||
|
zipl/src/scan.c | 4 +-
|
||||||
|
zipl/src/zipl.c | 1 +
|
||||||
|
4 files changed, 197 insertions(+), 9 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/zipl/man/zipl.8 b/zipl/man/zipl.8
|
||||||
|
index 8a83c01..6ebf240 100644
|
||||||
|
--- a/zipl/man/zipl.8
|
||||||
|
+++ b/zipl/man/zipl.8
|
||||||
|
@@ -249,6 +249,13 @@ whether they contain a dump signature or not.
|
||||||
|
This option can only be used together with
|
||||||
|
.BR \-\-mvdump .
|
||||||
|
|
||||||
|
+.TP
|
||||||
|
+.BR "\-x" " or " "\-\-no-automenu"
|
||||||
|
+Disables the automatic creation of a multiboot menu. Specifying a menu with the
|
||||||
|
+"-m <MENU>" option or a section disables this feature, too. This option was
|
||||||
|
+added for compatibility with previous versions of the multiboot version of
|
||||||
|
+zipl.
|
||||||
|
+
|
||||||
|
.SH EXAMPLE
|
||||||
|
1. Scenario: prepare disk for booting a Linux kernel image using the
|
||||||
|
following parameters:
|
||||||
|
diff --git a/zipl/src/job.c b/zipl/src/job.c
|
||||||
|
index c5c85d8..6a526e4 100644
|
||||||
|
--- a/zipl/src/job.c
|
||||||
|
+++ b/zipl/src/job.c
|
||||||
|
@@ -43,6 +43,7 @@ static struct option options[] = {
|
||||||
|
{ "version", no_argument, NULL, 'v'},
|
||||||
|
{ "verbose", no_argument, NULL, 'V'},
|
||||||
|
{ "add-files", no_argument, NULL, 'a'},
|
||||||
|
+ { "no-automenu", no_argument, NULL, 'x'},
|
||||||
|
{ "tape", required_argument, NULL, 'T'},
|
||||||
|
{ "dry-run", no_argument, NULL, '0'},
|
||||||
|
{ "force", no_argument, NULL, 'f'},
|
||||||
|
@@ -50,7 +51,7 @@ static struct option options[] = {
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Command line option abbreviations */
|
||||||
|
-static const char option_string[] = "-c:t:i:r:p:P:d:D:M:s:m:hHnVvaT:f";
|
||||||
|
+static const char option_string[] = "-c:t:i:r:p:P:d:D:M:s:m:hHnVvaxT:f";
|
||||||
|
|
||||||
|
struct command_line {
|
||||||
|
char* data[SCAN_KEYWORD_NUM];
|
||||||
|
@@ -62,11 +63,14 @@ struct command_line {
|
||||||
|
int version;
|
||||||
|
int verbose;
|
||||||
|
int add_files;
|
||||||
|
+ int automenu;
|
||||||
|
int dry_run;
|
||||||
|
int force;
|
||||||
|
enum scan_section_type type;
|
||||||
|
};
|
||||||
|
|
||||||
|
+/* Global variable for default boot target. Ugly but necessary... */
|
||||||
|
+static char *default_target;
|
||||||
|
|
||||||
|
static int
|
||||||
|
store_option(struct command_line* cmdline, enum scan_keyword_id keyword,
|
||||||
|
@@ -92,6 +96,7 @@ get_command_line(int argc, char* argv[], struct command_line* line)
|
||||||
|
int i;
|
||||||
|
|
||||||
|
memset((void *) &cmdline, 0, sizeof(struct command_line));
|
||||||
|
+ cmdline.automenu = 1;
|
||||||
|
cmdline.type = section_invalid;
|
||||||
|
is_keyword = 0;
|
||||||
|
/* Process options */
|
||||||
|
@@ -101,16 +106,22 @@ get_command_line(int argc, char* argv[], struct command_line* line)
|
||||||
|
switch (opt) {
|
||||||
|
case 'd':
|
||||||
|
is_keyword = 1;
|
||||||
|
+ cmdline.automenu = 0;
|
||||||
|
+ scan_key_table[1][8] = req;
|
||||||
|
rc = store_option(&cmdline, scan_keyword_dumpto,
|
||||||
|
optarg);
|
||||||
|
break;
|
||||||
|
case 'D':
|
||||||
|
is_keyword = 1;
|
||||||
|
+ cmdline.automenu = 0;
|
||||||
|
+ scan_key_table[1][8] = req;
|
||||||
|
rc = store_option(&cmdline, scan_keyword_dumptofs,
|
||||||
|
optarg);
|
||||||
|
break;
|
||||||
|
case 'M':
|
||||||
|
is_keyword = 1;
|
||||||
|
+ cmdline.automenu = 0;
|
||||||
|
+ scan_key_table[1][8] = req;
|
||||||
|
rc = store_option(&cmdline, scan_keyword_mvdump,
|
||||||
|
optarg);
|
||||||
|
#ifndef __s390x__
|
||||||
|
@@ -121,35 +132,49 @@ get_command_line(int argc, char* argv[], struct command_line* line)
|
||||||
|
break;
|
||||||
|
case 'i':
|
||||||
|
is_keyword = 1;
|
||||||
|
+ cmdline.automenu = 0;
|
||||||
|
+ scan_key_table[1][8] = req;
|
||||||
|
rc = store_option(&cmdline, scan_keyword_image,
|
||||||
|
optarg);
|
||||||
|
break;
|
||||||
|
case 'P':
|
||||||
|
+ cmdline.automenu = 0;
|
||||||
|
+ scan_key_table[1][8] = req;
|
||||||
|
rc = store_option(&cmdline, scan_keyword_parameters,
|
||||||
|
optarg);
|
||||||
|
break;
|
||||||
|
case 'p':
|
||||||
|
is_keyword = 1;
|
||||||
|
+ cmdline.automenu = 0;
|
||||||
|
+ scan_key_table[1][8] = req;
|
||||||
|
rc = store_option(&cmdline, scan_keyword_parmfile,
|
||||||
|
optarg);
|
||||||
|
break;
|
||||||
|
case 'r':
|
||||||
|
is_keyword = 1;
|
||||||
|
+ cmdline.automenu = 0;
|
||||||
|
+ scan_key_table[1][8] = req;
|
||||||
|
rc = store_option(&cmdline, scan_keyword_ramdisk,
|
||||||
|
optarg);
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
is_keyword = 1;
|
||||||
|
+ cmdline.automenu = 0;
|
||||||
|
+ scan_key_table[1][8] = req;
|
||||||
|
rc = store_option(&cmdline, scan_keyword_segment,
|
||||||
|
optarg);
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
is_keyword = 1;
|
||||||
|
+ cmdline.automenu = 0;
|
||||||
|
+ scan_key_table[1][8] = req;
|
||||||
|
rc = store_option(&cmdline, scan_keyword_target,
|
||||||
|
optarg);
|
||||||
|
break;
|
||||||
|
case 'T':
|
||||||
|
is_keyword = 1;
|
||||||
|
+ cmdline.automenu = 0;
|
||||||
|
+ scan_key_table[1][8] = req;
|
||||||
|
rc = store_option(&cmdline, scan_keyword_tape,
|
||||||
|
optarg);
|
||||||
|
break;
|
||||||
|
@@ -190,6 +215,10 @@ get_command_line(int argc, char* argv[], struct command_line* line)
|
||||||
|
case 'f':
|
||||||
|
cmdline.force = 1;
|
||||||
|
break;
|
||||||
|
+ case 'x':
|
||||||
|
+ cmdline.automenu = 0;
|
||||||
|
+ scan_key_table[1][8] = req;
|
||||||
|
+ break;
|
||||||
|
case 1:
|
||||||
|
/* Non-option is interpreted as section name */
|
||||||
|
if (cmdline.section != NULL) {
|
||||||
|
@@ -214,6 +243,9 @@ get_command_line(int argc, char* argv[], struct command_line* line)
|
||||||
|
if (cmdline.help || cmdline.version) {
|
||||||
|
/* Always accept --help and --version */
|
||||||
|
} else if ((cmdline.menu != NULL) || (cmdline.section != NULL)) {
|
||||||
|
+ /* If either menu or section has been selected disable
|
||||||
|
+ automenu generation */
|
||||||
|
+ cmdline.automenu = 0;
|
||||||
|
/* Config file mode */
|
||||||
|
if ((cmdline.menu != NULL) && (cmdline.section != NULL)) {
|
||||||
|
error_reason("Option 'menu' cannot be used when "
|
||||||
|
@@ -832,7 +864,14 @@ get_job_from_section_data(char* data[], struct job_data* job, char* section)
|
||||||
|
/* IPL job */
|
||||||
|
job->id = job_ipl;
|
||||||
|
/* Fill in name of bootmap directory */
|
||||||
|
- job->bootmap_dir = misc_strdup(data[(int) scan_keyword_target]);
|
||||||
|
+ if (data[(int) scan_keyword_target] == NULL) {
|
||||||
|
+ if (default_target == NULL) {
|
||||||
|
+ error_text("Unable to find default section in your config file.");
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ job->bootmap_dir = misc_strdup(default_target);
|
||||||
|
+ } else
|
||||||
|
+ job->bootmap_dir = misc_strdup(data[(int) scan_keyword_target]);
|
||||||
|
if (job->bootmap_dir == NULL)
|
||||||
|
return -1;
|
||||||
|
/* Fill in name and address of image file */
|
||||||
|
@@ -1102,6 +1141,8 @@ get_menu_job(struct scan_token* scan, char* menu, struct job_data* job)
|
||||||
|
if (temp_job == NULL)
|
||||||
|
return -1;
|
||||||
|
memset((void *) temp_job, 0, sizeof(struct job_data));
|
||||||
|
+ if (data[(int) scan_keyword_target] == NULL)
|
||||||
|
+ data[(int) scan_keyword_target] = misc_strdup(job->bootmap_dir);
|
||||||
|
rc = get_job_from_section_data(data, temp_job,
|
||||||
|
job->data.menu.entry[current].name);
|
||||||
|
if (rc) {
|
||||||
|
@@ -1150,6 +1191,7 @@ get_default_section(struct scan_token* scan, char** section, int* is_menu)
|
||||||
|
i = scan_find_section(scan, DEFAULTBOOT_SECTION,
|
||||||
|
scan_id_section_heading, 0);
|
||||||
|
if (i<0) {
|
||||||
|
+ *section = NULL;
|
||||||
|
error_reason("No '" DEFAULTBOOT_SECTION "' section found and "
|
||||||
|
"no section specified on command line");
|
||||||
|
return -1;
|
||||||
|
@@ -1169,6 +1211,7 @@ get_default_section(struct scan_token* scan, char** section, int* is_menu)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Should not happen */
|
||||||
|
+ *section = NULL;
|
||||||
|
error_reason("No default section specified");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
@@ -1184,19 +1227,35 @@ get_section_job(struct scan_token* scan, char* section, struct job_data* job,
|
||||||
|
{
|
||||||
|
char* data[SCAN_KEYWORD_NUM];
|
||||||
|
char* buffer;
|
||||||
|
+ char* default_section;
|
||||||
|
int rc;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
+ rc = get_default_section(scan, &default_section, &i);
|
||||||
|
+ if (rc)
|
||||||
|
+ return rc;
|
||||||
|
if (section == NULL) {
|
||||||
|
- rc = get_default_section(scan, §ion, &i);
|
||||||
|
- if (rc)
|
||||||
|
- return rc;
|
||||||
|
+ section = default_section;
|
||||||
|
if (i) {
|
||||||
|
/* 'defaultmenu' was specified */
|
||||||
|
rc = get_menu_job(scan, section, job);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ char* name = NULL;
|
||||||
|
+
|
||||||
|
+ for (i = 0; (int) scan[i].id != 0; i++) {
|
||||||
|
+ if (scan[i].id == scan_id_section_heading) {
|
||||||
|
+ name = scan[i].content.section.name;
|
||||||
|
+ }
|
||||||
|
+ if (scan[i].id == scan_id_keyword_assignment &&
|
||||||
|
+ scan[i].content.keyword.keyword == scan_keyword_target &&
|
||||||
|
+ !strcmp(DEFAULTBOOT_SECTION, name))
|
||||||
|
+ default_target = misc_strdup(scan[i].content.keyword.value);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
if (strcmp(section, DEFAULTBOOT_SECTION) == 0) {
|
||||||
|
error_reason("Special section '" DEFAULTBOOT_SECTION "' cannot "
|
||||||
|
"be used as target section");
|
||||||
|
@@ -1268,10 +1327,118 @@ get_section_job(struct scan_token* scan, char* section, struct job_data* job,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
+/* Create a fake menu to simulate the old s390utils-1.1.7 multiboot
|
||||||
|
+ * behaviour. */
|
||||||
|
+static struct scan_token *
|
||||||
|
+create_fake_menu(struct scan_token *scan)
|
||||||
|
+{
|
||||||
|
+ int i, j, pos, numsec, size, defaultpos;
|
||||||
|
+ char *name;
|
||||||
|
+ char *target;
|
||||||
|
+ char *timeout;
|
||||||
|
+ char *seclist[1024];
|
||||||
|
+ char *defaultsection;
|
||||||
|
+ char buf[1024];
|
||||||
|
+ struct scan_token *tmp;
|
||||||
|
+
|
||||||
|
+ /* Count # of sections */
|
||||||
|
+ numsec = 0;
|
||||||
|
+ name = NULL;
|
||||||
|
+ target = NULL;
|
||||||
|
+ timeout = NULL;
|
||||||
|
+ for (i = 0; (int) scan[i].id != 0; i++) {
|
||||||
|
+ if (scan[i].id == scan_id_section_heading) {
|
||||||
|
+ name = scan[i].content.section.name;
|
||||||
|
+ if (strcmp(DEFAULTBOOT_SECTION, name))
|
||||||
|
+ seclist[numsec++] = name;
|
||||||
|
+ }
|
||||||
|
+ if (scan[i].id == scan_id_keyword_assignment &&
|
||||||
|
+ (scan[i].content.keyword.keyword == scan_keyword_dumpto ||
|
||||||
|
+ scan[i].content.keyword.keyword == scan_keyword_dumptofs)) {
|
||||||
|
+ numsec--;
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+ if (scan[i].id == scan_id_keyword_assignment &&
|
||||||
|
+ scan[i].content.keyword.keyword == scan_keyword_target &&
|
||||||
|
+ !strcmp(DEFAULTBOOT_SECTION, name))
|
||||||
|
+ target = scan[i].content.keyword.value;
|
||||||
|
+
|
||||||
|
+ if (scan[i].id == scan_id_keyword_assignment &&
|
||||||
|
+ scan[i].content.keyword.keyword == scan_keyword_timeout)
|
||||||
|
+ timeout = scan[i].content.keyword.value;
|
||||||
|
+ }
|
||||||
|
+ get_default_section(scan, &defaultsection, &j);
|
||||||
|
+
|
||||||
|
+ if (defaultsection == NULL) {
|
||||||
|
+ error_text("Unable to find default section in your config file.");
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (target == NULL) {
|
||||||
|
+ error_text("Keyword target is missing in default section.");
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ default_target = misc_strdup(target);
|
||||||
|
+
|
||||||
|
+ size = i+6+numsec;
|
||||||
|
+ tmp = (struct scan_token *) misc_malloc(size * sizeof(struct scan_token));
|
||||||
|
+ if (tmp == NULL) {
|
||||||
|
+ error_text("Couldn't allocate memory for menu entries");
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ memset(tmp, 0, size * sizeof(struct scan_token));
|
||||||
|
+ memcpy(tmp, scan, i * sizeof(struct scan_token));
|
||||||
|
+ free(scan);
|
||||||
|
+ scan = tmp;
|
||||||
|
+
|
||||||
|
+ defaultpos = 0;
|
||||||
|
+ for (j = 0; j < numsec; j++) {
|
||||||
|
+ if (!strcmp(defaultsection, seclist[j]))
|
||||||
|
+ defaultpos = j+1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ snprintf(buf, 1024, "%d", defaultpos);
|
||||||
|
+
|
||||||
|
+ scan[i].id = scan_id_menu_heading;
|
||||||
|
+ scan[i].line = i;
|
||||||
|
+ scan[i++].content.menu.name = misc_strdup("rh-automatic-menu");
|
||||||
|
+ scan[i].id = scan_id_keyword_assignment;
|
||||||
|
+ scan[i].line = i;
|
||||||
|
+ scan[i].content.keyword.keyword = scan_keyword_target;
|
||||||
|
+ scan[i++].content.keyword.value = misc_strdup(target);
|
||||||
|
+ scan[i].id = scan_id_keyword_assignment;
|
||||||
|
+ scan[i].line = i;
|
||||||
|
+ scan[i].content.keyword.keyword = scan_keyword_default;
|
||||||
|
+ scan[i++].content.keyword.value = misc_strdup(buf);
|
||||||
|
+ scan[i].id = scan_id_keyword_assignment;
|
||||||
|
+ scan[i].line = i;
|
||||||
|
+ scan[i].content.keyword.keyword = scan_keyword_prompt;
|
||||||
|
+ scan[i++].content.keyword.value = misc_strdup("1");
|
||||||
|
+ scan[i].id = scan_id_keyword_assignment;
|
||||||
|
+ scan[i].line = i;
|
||||||
|
+ scan[i].content.keyword.keyword = scan_keyword_timeout;
|
||||||
|
+ if (timeout)
|
||||||
|
+ scan[i++].content.keyword.value = misc_strdup(timeout);
|
||||||
|
+ else
|
||||||
|
+ scan[i++].content.keyword.value = misc_strdup("15");
|
||||||
|
+
|
||||||
|
+ pos = i;
|
||||||
|
+ for (i = 0; i<numsec; i++) {
|
||||||
|
+ scan[pos].id = scan_id_number_assignment;
|
||||||
|
+ scan[pos].line = pos;
|
||||||
|
+ scan[pos].content.number.number = i+1;
|
||||||
|
+ scan[pos++].content.number.value = misc_strdup(seclist[i]);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return scan;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int
|
||||||
|
get_job_from_config_file(struct command_line* cmdline, struct job_data* job)
|
||||||
|
{
|
||||||
|
- struct scan_token* scan;
|
||||||
|
+ struct scan_token* scan, *nscan;
|
||||||
|
char* filename;
|
||||||
|
char* source;
|
||||||
|
int rc;
|
||||||
|
@@ -1303,9 +1470,22 @@ get_job_from_config_file(struct command_line* cmdline, struct job_data* job)
|
||||||
|
scan_free(scan);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ if (cmdline->automenu) {
|
||||||
|
+ nscan = create_fake_menu(scan);
|
||||||
|
+ if (nscan == NULL) {
|
||||||
|
+ scan_free(scan);
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+ scan = nscan;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* Get job from config file data */
|
||||||
|
- if (cmdline->menu != NULL)
|
||||||
|
+ if (cmdline->menu != NULL || cmdline->automenu) {
|
||||||
|
+ if (cmdline->automenu)
|
||||||
|
+ cmdline->menu = misc_strdup("rh-automatic-menu");
|
||||||
|
rc = get_menu_job(scan, cmdline->menu, job);
|
||||||
|
+ }
|
||||||
|
else {
|
||||||
|
rc = get_section_job(scan, cmdline->section, job,
|
||||||
|
cmdline->data[(int) scan_keyword_parameters]);
|
||||||
|
diff --git a/zipl/src/scan.c b/zipl/src/scan.c
|
||||||
|
index 9948092..caca3cf 100644
|
||||||
|
--- a/zipl/src/scan.c
|
||||||
|
+++ b/zipl/src/scan.c
|
||||||
|
@@ -33,9 +33,9 @@ enum scan_key_state scan_key_table[SCAN_SECTION_NUM][SCAN_KEYWORD_NUM] = {
|
||||||
|
* rs enu
|
||||||
|
*/
|
||||||
|
/* defaultboot */
|
||||||
|
- {opt, inv, inv, inv, inv, inv, inv, inv, inv, inv, inv, opt, inv, inv},
|
||||||
|
+ {opt, inv, inv, inv, inv, inv, inv, inv, req, inv, opt, opt, inv, inv},
|
||||||
|
/* ipl */
|
||||||
|
- {inv, inv, inv, req, opt, opt, opt, inv, req, inv, inv, inv, inv, inv},
|
||||||
|
+ {inv, inv, inv, req, opt, opt, opt, inv, opt, inv, inv, inv, inv, inv},
|
||||||
|
/* segment load */
|
||||||
|
{inv, inv, inv, inv, inv, inv, inv, req, req, inv, inv, inv, inv, inv},
|
||||||
|
/* part dump */
|
||||||
|
diff --git a/zipl/src/zipl.c b/zipl/src/zipl.c
|
||||||
|
index 9cb764c..4d9fd36 100644
|
||||||
|
--- a/zipl/src/zipl.c
|
||||||
|
+++ b/zipl/src/zipl.c
|
||||||
|
@@ -73,6 +73,7 @@ static const char* usage_text[] = {
|
||||||
|
"-n, --noninteractive Answer all confirmation questions with 'yes'",
|
||||||
|
"-V, --verbose Provide more verbose output",
|
||||||
|
"-a, --add-files Add all referenced files to bootmap file",
|
||||||
|
+"-x, --no-automenu Don't autogenerate multiboot menu",
|
||||||
|
" --dry-run Simulate run but don't modify IPL records"
|
||||||
|
};
|
||||||
|
|
||||||
|
--
|
||||||
|
1.6.3.3
|
||||||
|
|
33
0003-s390-tools-1.8.1-fdasd-su.patch
Normal file
33
0003-s390-tools-1.8.1-fdasd-su.patch
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
From f8acd63e169cdec39c47ac0d8c1b98e115cf24a1 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?utf-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Thu, 23 Apr 2009 11:46:01 +0200
|
||||||
|
Subject: [PATCH 3/9] s390-tools-1.8.1-fdasd-su
|
||||||
|
|
||||||
|
---
|
||||||
|
fdasd/fdasd.c | 10 ++++++----
|
||||||
|
1 files changed, 6 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/fdasd/fdasd.c b/fdasd/fdasd.c
|
||||||
|
index aa16659..3a54968 100644
|
||||||
|
--- a/fdasd/fdasd.c
|
||||||
|
+++ b/fdasd/fdasd.c
|
||||||
|
@@ -2009,10 +2009,12 @@ fdasd_get_geometry (fdasd_anchor_t *anc)
|
||||||
|
if (anc->verbose) printf("disk type check : ok\n");
|
||||||
|
|
||||||
|
if (dasd_info.FBA_layout != 0) {
|
||||||
|
- snprintf(err_str, ERROR_STRING_SIZE,
|
||||||
|
- "%s is not formatted with z/OS compatible "
|
||||||
|
- "disk layout!", options.device);
|
||||||
|
- fdasd_error(anc, wrong_disk_format, err_str);
|
||||||
|
+ if(!anc->silent) {
|
||||||
|
+ snprintf(err_str, ERROR_STRING_SIZE,
|
||||||
|
+ "%s is not formatted with z/OS compatible "
|
||||||
|
+ "disk layout!", options.device);
|
||||||
|
+ fdasd_error(anc, wrong_disk_format, err_str);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (anc->verbose) printf("disk layout check : ok\n");
|
||||||
|
--
|
||||||
|
1.6.3.3
|
||||||
|
|
153
0004-s390-tools-1.8.1-fdasd-raid-lvm.patch
Normal file
153
0004-s390-tools-1.8.1-fdasd-raid-lvm.patch
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
From 35298f5f9512835071b8c08e843731bbfbb15b7e Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?utf-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Thu, 23 Apr 2009 11:46:16 +0200
|
||||||
|
Subject: [PATCH 4/9] s390-tools-1.8.1-fdasd-raid-lvm
|
||||||
|
|
||||||
|
---
|
||||||
|
fdasd/fdasd.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++----------
|
||||||
|
1 files changed, 53 insertions(+), 12 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/fdasd/fdasd.c b/fdasd/fdasd.c
|
||||||
|
index 3a54968..a526d7f 100644
|
||||||
|
--- a/fdasd/fdasd.c
|
||||||
|
+++ b/fdasd/fdasd.c
|
||||||
|
@@ -258,10 +258,10 @@ fdasd_error(fdasd_anchor_t *anc, enum fdasd_failure why, char *str)
|
||||||
|
static int
|
||||||
|
read_line(void)
|
||||||
|
{
|
||||||
|
- bzero(line_buffer, LINE_LENGTH);
|
||||||
|
line_ptr = line_buffer;
|
||||||
|
if (!fgets(line_buffer, LINE_LENGTH, stdin))
|
||||||
|
return 0;
|
||||||
|
+ line_buffer[LINE_LENGTH-1] = 0;
|
||||||
|
while (*line_ptr && !isgraph(*line_ptr))
|
||||||
|
line_ptr++;
|
||||||
|
return *line_ptr;
|
||||||
|
@@ -312,6 +312,10 @@ fdasd_partition_type (char *str)
|
||||||
|
strcpy(str, "Linux native");
|
||||||
|
else if (strncmp("SWAP ", str, 6) == 0)
|
||||||
|
strcpy(str, "Linux swap");
|
||||||
|
+ else if (strncmp("RAID ", str, 6) == 0)
|
||||||
|
+ strcpy(str, "Linux Raid");
|
||||||
|
+ else if (strncmp("LVM ", str, 6) == 0)
|
||||||
|
+ strcpy(str, "Linux LVM");
|
||||||
|
else
|
||||||
|
strcpy(str, "unknown");
|
||||||
|
|
||||||
|
@@ -1122,14 +1126,24 @@ fdasd_write_vtoc_labels (fdasd_anchor_t *anc)
|
||||||
|
strncpy(c1, s2, 31);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
+ char str[20];
|
||||||
|
char *tmp = strstr(ch, "SWAP");
|
||||||
|
+ char *tmp1 = strstr(ch, "RAID");
|
||||||
|
|
||||||
|
/* create a new data set name */
|
||||||
|
while (getpos(anc, k) > -1)
|
||||||
|
k++;
|
||||||
|
|
||||||
|
setpos(anc, k, i-1);
|
||||||
|
-
|
||||||
|
+
|
||||||
|
+ strncpy(s2, ch, 44);
|
||||||
|
+ s2[44]=0;
|
||||||
|
+ vtoc_ebcdic_dec(s2, s2, 44);
|
||||||
|
+ c2 = strstr(s2, "PART");
|
||||||
|
+ if (c2 != NULL) strncpy(str, c2+=9, 6);
|
||||||
|
+ str[6] = '\0';
|
||||||
|
+ fdasd_partition_type(str);
|
||||||
|
+
|
||||||
|
strncpy(ch, "LINUX.V "
|
||||||
|
" ", 44);
|
||||||
|
|
||||||
|
@@ -1145,10 +1159,21 @@ fdasd_write_vtoc_labels (fdasd_anchor_t *anc)
|
||||||
|
strncpy(c1, dsno, 4);
|
||||||
|
|
||||||
|
c1 += 4;
|
||||||
|
- if (tmp)
|
||||||
|
- strncpy(c1, ".SWAP", 5);
|
||||||
|
- else
|
||||||
|
- strncpy(c1, ".NATIVE", 7);
|
||||||
|
+ if (tmp || tmp1) {
|
||||||
|
+ if (tmp)
|
||||||
|
+ strncpy(c1, ".SWAP", 5);
|
||||||
|
+ if (tmp1)
|
||||||
|
+ strncpy(c1, ".RAID", 5);
|
||||||
|
+ } else {
|
||||||
|
+ if (strcmp("unknown", str) == 0) {
|
||||||
|
+ strncpy(c1, ".NATIVE", 7);
|
||||||
|
+ }
|
||||||
|
+ else {
|
||||||
|
+ strncpy(c1, ".", 1);
|
||||||
|
+ strncpy(c1+1, c2, 6);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
}
|
||||||
|
vtoc_ebcdic_enc(ch, ch, 44);
|
||||||
|
if (anc->verbose) printf("%2x ", part_info->f1->DS1FMTID);
|
||||||
|
@@ -1433,9 +1458,10 @@ fdasd_change_part_type (fdasd_anchor_t *anc)
|
||||||
|
|
||||||
|
printf("current partition type is: %s\n\n", fdasd_partition_type(str));
|
||||||
|
printf(" 1 Linux native\n" \
|
||||||
|
- " 2 Linux swap\n\n");
|
||||||
|
+ " 2 Linux swap\n" \
|
||||||
|
+ " 3 Linux raid\n\n");
|
||||||
|
part_type = 0;
|
||||||
|
- while ((part_type < 1) || (part_type > 2)) {
|
||||||
|
+ while ((part_type < 1) || (part_type > 3)) {
|
||||||
|
while (!isdigit(part_type =
|
||||||
|
read_char("new partition type: ")));
|
||||||
|
part_type -= 48;
|
||||||
|
@@ -1448,6 +1474,9 @@ fdasd_change_part_type (fdasd_anchor_t *anc)
|
||||||
|
case 2:
|
||||||
|
strncpy(str, "SWAP ", 6);
|
||||||
|
break;
|
||||||
|
+ case 3:
|
||||||
|
+ strncpy(str, "RAID ", 6);
|
||||||
|
+ break;
|
||||||
|
default:
|
||||||
|
printf("'%d' is not supported!\n", part_type);
|
||||||
|
}
|
||||||
|
@@ -1625,7 +1654,7 @@ fdasd_process_invalid_vtoc(fdasd_anchor_t *anc)
|
||||||
|
static void
|
||||||
|
fdasd_process_valid_vtoc(fdasd_anchor_t *anc, unsigned long blk)
|
||||||
|
{
|
||||||
|
- int f1_counter = 0, f7_counter = 0, f5_counter = 0;
|
||||||
|
+ int f1_counter = 0, f7_counter = 0, f5_counter = 0, oldfmt = 0;
|
||||||
|
int i, part_no, f1_size = sizeof(format1_label_t);
|
||||||
|
partition_info_t *part_info = anc->first;
|
||||||
|
format1_label_t f1_label;
|
||||||
|
@@ -1677,14 +1706,26 @@ fdasd_process_valid_vtoc(fdasd_anchor_t *anc, unsigned long blk)
|
||||||
|
vtoc_ebcdic_enc(part_info->f1->DS1DSNAM,
|
||||||
|
part_info->f1->DS1DSNAM, 44);
|
||||||
|
|
||||||
|
- if ((part_no < 0) || (part_no >= USABLE_PARTITIONS))
|
||||||
|
+ /* this dasd has data set names 0000-0002
|
||||||
|
+ but we use now 0001-0003 */
|
||||||
|
+ if (part_no == -1)
|
||||||
|
+ oldfmt++;
|
||||||
|
+
|
||||||
|
+ if (((oldfmt == 0) && (part_no < 0))
|
||||||
|
+ || (part_no >= USABLE_PARTITIONS))
|
||||||
|
printf("WARNING: partition number (%i) found "
|
||||||
|
"in data set name of an existing "
|
||||||
|
"partition\ndoes not match range of "
|
||||||
|
"possible partition numbers (1-%d)\n\n",
|
||||||
|
part_no + 1, USABLE_PARTITIONS);
|
||||||
|
- else
|
||||||
|
- setpos(anc, part_no, f1_counter);
|
||||||
|
+ else {
|
||||||
|
+ if (oldfmt) /* correct +1 */ {
|
||||||
|
+ setpos(anc, part_no+1, f1_counter);
|
||||||
|
+ printf("Correcting f1 header number!\n");
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ setpos(anc, part_no, f1_counter);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
part_info = part_info->next;
|
||||||
|
f1_counter++;
|
||||||
|
--
|
||||||
|
1.6.3.3
|
||||||
|
|
59
0005-don-t-create-automenu-when-default-menu-exists.patch
Normal file
59
0005-don-t-create-automenu-when-default-menu-exists.patch
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
From 1efcfe8d7ad20f7a3f584628375da60682b4579c Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?utf-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Thu, 23 Apr 2009 15:28:06 +0200
|
||||||
|
Subject: [PATCH 5/9] don't create automenu when default menu exists
|
||||||
|
|
||||||
|
---
|
||||||
|
zipl/src/job.c | 25 +++++++++++++++----------
|
||||||
|
1 files changed, 15 insertions(+), 10 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/zipl/src/job.c b/zipl/src/job.c
|
||||||
|
index 6a526e4..89c8c23 100644
|
||||||
|
--- a/zipl/src/job.c
|
||||||
|
+++ b/zipl/src/job.c
|
||||||
|
@@ -1441,6 +1441,8 @@ get_job_from_config_file(struct command_line* cmdline, struct job_data* job)
|
||||||
|
struct scan_token* scan, *nscan;
|
||||||
|
char* filename;
|
||||||
|
char* source;
|
||||||
|
+ char* default_section;
|
||||||
|
+ int is_menu;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
/* Read configuration file */
|
||||||
|
@@ -1470,20 +1472,23 @@ get_job_from_config_file(struct command_line* cmdline, struct job_data* job)
|
||||||
|
scan_free(scan);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
-
|
||||||
|
- if (cmdline->automenu) {
|
||||||
|
- nscan = create_fake_menu(scan);
|
||||||
|
- if (nscan == NULL) {
|
||||||
|
- scan_free(scan);
|
||||||
|
- return -1;
|
||||||
|
- }
|
||||||
|
- scan = nscan;
|
||||||
|
- }
|
||||||
|
+
|
||||||
|
+ /* disable automenu iff default menu exists */
|
||||||
|
+ rc = get_default_section(scan, &default_section, &is_menu);
|
||||||
|
+ if (!rc && is_menu)
|
||||||
|
+ cmdline->automenu = 0;
|
||||||
|
|
||||||
|
/* Get job from config file data */
|
||||||
|
if (cmdline->menu != NULL || cmdline->automenu) {
|
||||||
|
- if (cmdline->automenu)
|
||||||
|
+ if (cmdline->automenu) {
|
||||||
|
+ nscan = create_fake_menu(scan);
|
||||||
|
+ if (nscan == NULL) {
|
||||||
|
+ scan_free(scan);
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+ scan = nscan;
|
||||||
|
cmdline->menu = misc_strdup("rh-automatic-menu");
|
||||||
|
+ }
|
||||||
|
rc = get_menu_job(scan, cmdline->menu, job);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
--
|
||||||
|
1.6.3.3
|
||||||
|
|
31
0006-s390-tools-1.8.1-zipl-kdump-man.patch
Normal file
31
0006-s390-tools-1.8.1-zipl-kdump-man.patch
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
From 894de5382653e4389dc8490f2ee4a2a9c59eb86d Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?utf-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Fri, 19 Jun 2009 10:01:30 +0200
|
||||||
|
Subject: [PATCH 6/9] s390-tools-1.8.1-zipl-kdump-man
|
||||||
|
|
||||||
|
Description: Add kdump kernel installation instruction to zipl man page.
|
||||||
|
Symptom: User wants to prepare SCSI disk for dump, but has not installed
|
||||||
|
the kdump kernel rpm.
|
||||||
|
Problem: The installation of the kdump kernel rpm is prereq for preparing
|
||||||
|
a SCSI dump disk for dump.
|
||||||
|
Solution: Document that in the zipl man page.
|
||||||
|
---
|
||||||
|
zipl/man/zipl.8 | 2 ++
|
||||||
|
1 files changed, 2 insertions(+), 0 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/zipl/man/zipl.8 b/zipl/man/zipl.8
|
||||||
|
index 6ebf240..6df6026 100644
|
||||||
|
--- a/zipl/man/zipl.8
|
||||||
|
+++ b/zipl/man/zipl.8
|
||||||
|
@@ -176,6 +176,8 @@ will be incomplete.
|
||||||
|
It is not possible to specify both this parameter and the name of a menu
|
||||||
|
or configuration section on the command line at the same time.
|
||||||
|
|
||||||
|
+.B Note that before using this option the "kernel-kdump" rpm has to be
|
||||||
|
+.B installed.
|
||||||
|
.TP
|
||||||
|
.BR "\-M <DUMPLIST[,SIZE]>" " or " "--mvdump=<DUMPLIST[,SIZE]>"
|
||||||
|
Install a multi-volume dump record on each device associated with one of the
|
||||||
|
--
|
||||||
|
1.6.3.3
|
||||||
|
|
25
0007-s390-tools-1.8.1-lszfcp-perf.patch
Normal file
25
0007-s390-tools-1.8.1-lszfcp-perf.patch
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
From 80e1e88e108b774c7aa7c201326f1a92cf1b7e35 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?utf-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Wed, 26 Aug 2009 14:21:14 +0200
|
||||||
|
Subject: [PATCH 7/9] s390-tools-1.8.1-lszfcp-perf
|
||||||
|
|
||||||
|
---
|
||||||
|
zconf/lszfcp | 2 +-
|
||||||
|
1 files changed, 1 insertions(+), 1 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/zconf/lszfcp b/zconf/lszfcp
|
||||||
|
index d0bf84f..a872d05 100755
|
||||||
|
--- a/zconf/lszfcp
|
||||||
|
+++ b/zconf/lszfcp
|
||||||
|
@@ -233,7 +233,7 @@ show_devices()
|
||||||
|
# Differentiate old and new sysfs layout
|
||||||
|
if $FC_CLASS; then
|
||||||
|
SCSI_DEVICE_LIST=`ls -d \
|
||||||
|
- $SYSFS/devices/css0/*/*/host*/rport*/target*/*/ \
|
||||||
|
+ $SYSFS/bus/ccw/drivers/zfcp/*/host*/rport*/target*/*/ \
|
||||||
|
2>/dev/null |grep -P '\d+:\d+:\d+:\d+'`
|
||||||
|
else
|
||||||
|
SCSI_DEVICE_LIST=`ls -d $SYSFS/devices/css0/*/*/host*/*/`
|
||||||
|
--
|
||||||
|
1.6.3.3
|
||||||
|
|
28
0008-fix-string-overflow-in-vtoc_volume_label_init.patch
Normal file
28
0008-fix-string-overflow-in-vtoc_volume_label_init.patch
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
From d0c06736586d8f85f2e7c64291f3f289c12a0caa Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?utf-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Thu, 24 Sep 2009 09:12:39 +0200
|
||||||
|
Subject: [PATCH 8/9] fix string overflow in vtoc_volume_label_init
|
||||||
|
|
||||||
|
Originaly it tries to copy a 84B string into 4B field and reset also
|
||||||
|
the other fields thru the overflow. This doesn't work with recent GCC
|
||||||
|
and the security-related compile flags that are used in Fedora.
|
||||||
|
---
|
||||||
|
libvtoc/vtoc.c | 2 +-
|
||||||
|
1 files changed, 1 insertions(+), 1 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/libvtoc/vtoc.c b/libvtoc/vtoc.c
|
||||||
|
index 62a02a0..cebd5a4 100644
|
||||||
|
--- a/libvtoc/vtoc.c
|
||||||
|
+++ b/libvtoc/vtoc.c
|
||||||
|
@@ -326,7 +326,7 @@ void vtoc_volume_label_init (volume_label_t *vlabel)
|
||||||
|
{
|
||||||
|
sprintf(buffer, "%84s", " ");
|
||||||
|
vtoc_ebcdic_enc(buffer, buffer, 84);
|
||||||
|
- strncpy(vlabel->volkey, buffer, 84);
|
||||||
|
+ memcpy(vlabel, buffer, 84);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
1.6.3.3
|
||||||
|
|
27
0009-change-default-load-address-for-ramdisk.patch
Normal file
27
0009-change-default-load-address-for-ramdisk.patch
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
From 1697d4f40be133c78cd09fb0af14af22e8c6219e Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?utf-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Sun, 4 Oct 2009 17:46:16 +0200
|
||||||
|
Subject: [PATCH 9/9] change default load address for ramdisk
|
||||||
|
|
||||||
|
The default load address for the initial ramdisk is changed from
|
||||||
|
0x800000 to 0x2000000 to allow larger kernels to be loaded.
|
||||||
|
---
|
||||||
|
zipl/include/zipl.h | 2 +-
|
||||||
|
1 files changed, 1 insertions(+), 1 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/zipl/include/zipl.h b/zipl/include/zipl.h
|
||||||
|
index 1f70e48..d2d26dd 100644
|
||||||
|
--- a/zipl/include/zipl.h
|
||||||
|
+++ b/zipl/include/zipl.h
|
||||||
|
@@ -22,7 +22,7 @@
|
||||||
|
#define DEFAULT_PARMFILE_ADDRESS 0x1000LL
|
||||||
|
#define DEFAULT_STAGE3_ADDRESS 0xa000LL
|
||||||
|
#define DEFAULT_IMAGE_ADDRESS 0x10000LL
|
||||||
|
-#define DEFAULT_RAMDISK_ADDRESS 0x800000LL
|
||||||
|
+#define DEFAULT_RAMDISK_ADDRESS 0x2000000LL
|
||||||
|
|
||||||
|
#define PSW_ADDRESS_MASK 0x000000007fffffffLL
|
||||||
|
#define PSW_LOAD 0x0008000080000000LL
|
||||||
|
--
|
||||||
|
1.6.3.3
|
||||||
|
|
189
0010-improve-mon_statd-init-script.patch
Normal file
189
0010-improve-mon_statd-init-script.patch
Normal file
@ -0,0 +1,189 @@
|
|||||||
|
From 7cd1f2254e27cae8e061d1b42fa6c78bc10a5f39 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?utf-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Thu, 8 Oct 2009 10:29:23 +0200
|
||||||
|
Subject: [PATCH] improve mon_statd init script
|
||||||
|
|
||||||
|
- stop: do not print error messages if a daemon is not configured
|
||||||
|
- start: do not load module if no daemon is configured
|
||||||
|
- remove useless newlines
|
||||||
|
---
|
||||||
|
etc/init.d/mon_statd | 113 ++++++++++++++++++++++++++++----------------------
|
||||||
|
1 files changed, 64 insertions(+), 49 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/etc/init.d/mon_statd b/etc/init.d/mon_statd
|
||||||
|
index 4d84b5b..60bcf00 100755
|
||||||
|
--- a/etc/init.d/mon_statd
|
||||||
|
+++ b/etc/init.d/mon_statd
|
||||||
|
@@ -22,7 +22,6 @@ PROCD_PATH=/usr/sbin/$PROCD
|
||||||
|
CONFIG_FILE=/etc/sysconfig/$DAEMON
|
||||||
|
FSSTATD_PID_FILE=/var/run/$FSSTATD.pid
|
||||||
|
PROCD_PID_FILE=/var/run/$PROCD.pid
|
||||||
|
-RETVAL=0
|
||||||
|
|
||||||
|
# source function library
|
||||||
|
. /lib/lsb/init-functions
|
||||||
|
@@ -32,68 +31,81 @@ if [ -f $CONFIG_FILE ]; then
|
||||||
|
. $CONFIG_FILE
|
||||||
|
fi
|
||||||
|
|
||||||
|
-start()
|
||||||
|
+load_kernel_module()
|
||||||
|
{
|
||||||
|
if [ ! -e /dev/monwriter ]; then
|
||||||
|
echo "Loading monwriter module..."
|
||||||
|
modprobe monwriter 2>&1
|
||||||
|
- if [ "$?" -ne 0 ]; then
|
||||||
|
+ if [ $? -ne 0 ]; then
|
||||||
|
+ exit 1
|
||||||
|
+ fi
|
||||||
|
+ udevsettle
|
||||||
|
+ if [ $? -ne 0 ]; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
- while [ ! -e /dev/monwriter ]; do
|
||||||
|
- sleep 0
|
||||||
|
- done
|
||||||
|
fi
|
||||||
|
+}
|
||||||
|
|
||||||
|
- if [ ! -f $FSSTATD_PID_FILE -a "$FSSTAT" = "yes" ]; then
|
||||||
|
- echo -n $"Starting $FSSTATD:"
|
||||||
|
- $FSSTATD_PATH -i $FSSTAT_INTERVAL
|
||||||
|
- if [ $? == 0 ]; then
|
||||||
|
+start_daemon()
|
||||||
|
+{
|
||||||
|
+ local daemon_name=$1
|
||||||
|
+ local daemon_interval=$2
|
||||||
|
+ local daemon_pid_file=$3
|
||||||
|
+ local daemon_path=$4
|
||||||
|
+
|
||||||
|
+ if [ ! -f $daemon_pid_file ]; then
|
||||||
|
+ load_kernel_module
|
||||||
|
+ echo -n "Starting $daemon_name:"
|
||||||
|
+ $daemon_path -i $daemon_interval
|
||||||
|
+ if [ $? -eq 0 ]; then
|
||||||
|
touch /var/lock/subsys/mon_statd
|
||||||
|
log_success_msg
|
||||||
|
else
|
||||||
|
log_failure_msg
|
||||||
|
fi
|
||||||
|
- elif [ "$FSSTAT" = "yes" ]; then
|
||||||
|
- echo "$FSSTATD (pid $(cat $FSSTATD_PID_FILE)) is already running..."
|
||||||
|
+ else
|
||||||
|
+ echo "$daemon_name (pid $(cat $daemon_pid_file)) is already running..."
|
||||||
|
+ fi
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+start()
|
||||||
|
+{
|
||||||
|
+ if [ "$FSSTAT" = "yes" ]; then
|
||||||
|
+ start_daemon $FSSTATD $FSSTAT_INTERVAL $FSSTATD_PID_FILE \
|
||||||
|
+ $FSSTATD_PATH
|
||||||
|
fi
|
||||||
|
|
||||||
|
- if [ ! -f $PROCD_PID_FILE -a "$PROC" = "yes" ]; then
|
||||||
|
- echo -n $"Starting $PROCD:"
|
||||||
|
- $PROCD_PATH -i $PROC_INTERVAL
|
||||||
|
- if [ $? == 0 ]; then
|
||||||
|
- touch /var/lock/subsys/mon_statd
|
||||||
|
- log_success_msg
|
||||||
|
- else
|
||||||
|
- log_failure_msg
|
||||||
|
- fi
|
||||||
|
- elif [ "$PROC" = "yes" ]; then
|
||||||
|
- echo "$PROCD (pid $(cat $PROCD_PID_FILE)) is already running..."
|
||||||
|
+ if [ "$PROC" = "yes" ]; then
|
||||||
|
+ start_daemon $PROCD $PROC_INTERVAL $PROCD_PID_FILE \
|
||||||
|
+ $PROCD_PATH
|
||||||
|
fi
|
||||||
|
- echo
|
||||||
|
}
|
||||||
|
|
||||||
|
-stop()
|
||||||
|
+stop_daemon()
|
||||||
|
{
|
||||||
|
- echo -n $"Stopping $FSSTATD:"
|
||||||
|
- if [ -f $FSSTATD_PID_FILE ]; then
|
||||||
|
- killproc $FSSTATD_PATH -TERM
|
||||||
|
+ local daemon_name=$1
|
||||||
|
+ local daemon_pid_file=$2
|
||||||
|
+ local daemon_path=$3
|
||||||
|
+
|
||||||
|
+ echo -n "Stopping $daemon_name:"
|
||||||
|
+ if [ -f $daemon_pid_file ]; then
|
||||||
|
+ killproc $daemon_path -TERM
|
||||||
|
log_success_msg
|
||||||
|
- rm -f $FSSTATD_PID_FILE
|
||||||
|
+ rm -f $daemon_pid_file
|
||||||
|
else
|
||||||
|
log_failure_msg
|
||||||
|
fi
|
||||||
|
+}
|
||||||
|
|
||||||
|
- echo -n $"Stopping $PROCD:"
|
||||||
|
- if [ -f $PROCD_PID_FILE ]; then
|
||||||
|
- killproc $PROCD_PATH -TERM
|
||||||
|
- log_success_msg
|
||||||
|
- rm -f $PROCD_PID_FILE
|
||||||
|
- else
|
||||||
|
- log_failure_msg
|
||||||
|
+stop()
|
||||||
|
+{
|
||||||
|
+ if [ "$FSSTAT" = "yes" ]; then
|
||||||
|
+ stop_daemon $FSSTATD $FSSTATD_PID_FILE $FSSTATD_PATH
|
||||||
|
+ fi
|
||||||
|
+ if [ "$PROC" = "yes" ]; then
|
||||||
|
+ stop_daemon $PROCD $PROCD_PID_FILE $PROCD_PATH
|
||||||
|
fi
|
||||||
|
rm -f /var/lock/subsys/mon_statd
|
||||||
|
- echo
|
||||||
|
}
|
||||||
|
|
||||||
|
restart() {
|
||||||
|
@@ -101,20 +113,23 @@ restart() {
|
||||||
|
start
|
||||||
|
}
|
||||||
|
|
||||||
|
-status()
|
||||||
|
+status_daemon()
|
||||||
|
{
|
||||||
|
- if [ ! -f $FSSTATD_PID_FILE ]; then
|
||||||
|
- echo "$FSSTATD is not running."
|
||||||
|
- else
|
||||||
|
- echo "$FSSTATD (pid $(cat $FSSTATD_PID_FILE), interval: $FSSTAT_INTERVAL) is running."
|
||||||
|
- fi
|
||||||
|
+ local daemon_name=$1
|
||||||
|
+ local daemon_pid_file=$2
|
||||||
|
+ local daemon_interval=$3
|
||||||
|
|
||||||
|
- if [ ! -f $PROCD_PID_FILE ]; then
|
||||||
|
- echo "$PROCD is not running."
|
||||||
|
+ if [ ! -f $daemon_pid_file ]; then
|
||||||
|
+ echo "$daemon_name is not running."
|
||||||
|
else
|
||||||
|
- echo "$PROCD (pid $(cat $PROCD_PID_FILE), interval: $PROC_INTERVAL) is running."
|
||||||
|
+ echo "$daemon_name (pid $(cat $daemon_pid_file), interval: $daemon_interval) is running."
|
||||||
|
fi
|
||||||
|
- echo
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+status()
|
||||||
|
+{
|
||||||
|
+ status_daemon $FSSTATD $FSSTATD_PID_FILE $FSSTAT_INTERVAL
|
||||||
|
+ status_daemon $PROCD $PROCD_PID_FILE $PROC_INTERVAL
|
||||||
|
}
|
||||||
|
|
||||||
|
# How are we called?
|
||||||
|
@@ -133,7 +148,7 @@ case "$1" in
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Usage: $DAEMON {start|stop|status|restart|reload}"
|
||||||
|
- RETVAL=1
|
||||||
|
+ exit 1
|
||||||
|
esac
|
||||||
|
|
||||||
|
-exit $RETVAL
|
||||||
|
+exit 0
|
||||||
|
--
|
||||||
|
1.6.3.3
|
||||||
|
|
38
0011-update-readahead-value-for-better-performance.patch
Normal file
38
0011-update-readahead-value-for-better-performance.patch
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
From 5707bfdf0aac985e8e82c9a5004eb458d1d79801 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?utf-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Fri, 30 Oct 2009 11:23:08 +0100
|
||||||
|
Subject: [PATCH] update readahead value for better performance
|
||||||
|
|
||||||
|
Description: dasd,zfcp: Add udev rule to set increased "default max readahead"
|
||||||
|
Symptom: Sequential read performance on disks is not as good as it could be.
|
||||||
|
Problem: The current "default max readahead" defined by the kernel is too
|
||||||
|
small for s390 (128 kb).
|
||||||
|
Solution: Add udev rule to set a better default value (512 kb). This will
|
||||||
|
increase sequential read performance up to 40%.
|
||||||
|
---
|
||||||
|
etc/udev/rules.d/60-readahead.rules | 13 +++++++++++++
|
||||||
|
1 files changed, 13 insertions(+), 0 deletions(-)
|
||||||
|
create mode 100644 etc/udev/rules.d/60-readahead.rules
|
||||||
|
|
||||||
|
diff --git a/etc/udev/rules.d/60-readahead.rules b/etc/udev/rules.d/60-readahead.rules
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..3133c66
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/etc/udev/rules.d/60-readahead.rules
|
||||||
|
@@ -0,0 +1,13 @@
|
||||||
|
+#
|
||||||
|
+# Rules to set an increased default max readahead size for s390 disk devices
|
||||||
|
+# This file should be installed in /etc/udev/rules.d
|
||||||
|
+#
|
||||||
|
+
|
||||||
|
+SUBSYSTEM!="block", GOTO="ra_end"
|
||||||
|
+
|
||||||
|
+ACTION!="add", GOTO="ra_end"
|
||||||
|
+# on device add set initial readahead to 512 (instead of in kernel 128)
|
||||||
|
+KERNEL=="sd*[!0-9]", ATTR{queue/read_ahead_kb}="512"
|
||||||
|
+KERNEL=="dasd*[!0-9]", ATTR{queue/read_ahead_kb}="512"
|
||||||
|
+
|
||||||
|
+LABEL="ra_end"
|
||||||
|
--
|
||||||
|
1.6.3.3
|
||||||
|
|
33
0012-fix-multipath-device-detection-in-ziomon.patch
Normal file
33
0012-fix-multipath-device-detection-in-ziomon.patch
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
From e9c5f5e15122b143f5f202e9782773321f8cf6b9 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?utf-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Fri, 13 Nov 2009 10:46:57 +0100
|
||||||
|
Subject: [PATCH 12/14] fix multipath device detection in ziomon
|
||||||
|
|
||||||
|
Description: ziomon: Fix multipath device detection
|
||||||
|
Symptom: Running ziomon with a valid multipath device like
|
||||||
|
/dev/mapper/36005076303ffc56200000000000010cc
|
||||||
|
fails with "ziomon: The following devices do not seem
|
||||||
|
to exist:".
|
||||||
|
Problem: The output from multipath -l is not appended correctly to
|
||||||
|
the mp_arr array.
|
||||||
|
Solution: Properly initializing mp_arr to an empty array fixes this.
|
||||||
|
---
|
||||||
|
ziomon/ziomon | 2 +-
|
||||||
|
1 files changed, 1 insertions(+), 1 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/ziomon/ziomon b/ziomon/ziomon
|
||||||
|
index 7449843..924c1dd 100755
|
||||||
|
--- a/ziomon/ziomon
|
||||||
|
+++ b/ziomon/ziomon
|
||||||
|
@@ -471,7 +471,7 @@ function clean_devices() {
|
||||||
|
function check_for_multipath_devices() {
|
||||||
|
local i;
|
||||||
|
local j;
|
||||||
|
- local mp_arr;
|
||||||
|
+ local mp_arr=();
|
||||||
|
local line;
|
||||||
|
local devices_basenames;
|
||||||
|
local tmp;
|
||||||
|
--
|
||||||
|
1.6.3.3
|
||||||
|
|
119
0013-zipl-handle-status-during-ipl.patch
Normal file
119
0013-zipl-handle-status-during-ipl.patch
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
From 4770ba2827a5c582c6376139f1ec2d10519779e2 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?utf-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Fri, 13 Nov 2009 10:48:17 +0100
|
||||||
|
Subject: [PATCH 13/14] zipl - handle status during ipl
|
||||||
|
|
||||||
|
Description: zipl: handle status during ipl
|
||||||
|
Symptom: You encounter an error during IPL with "disabled wait" message.
|
||||||
|
Problem: During the IPL sequence the subchannel of the IPL device has
|
||||||
|
to be enabled. If there is a status pending or busy condition
|
||||||
|
on the subchannel the IPL code abborts the IPL and goes into
|
||||||
|
disabled wait.
|
||||||
|
Solution: To resolve the problem the IPL code accepts the status pending
|
||||||
|
or busy condition on the subchannel and does up to 256 retries.
|
||||||
|
---
|
||||||
|
zipl/boot/common.S | 65 ++++++++++++++++++++++++++++++++++-----------------
|
||||||
|
1 files changed, 43 insertions(+), 22 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/zipl/boot/common.S b/zipl/boot/common.S
|
||||||
|
index 620fed9..fa45e5a 100644
|
||||||
|
--- a/zipl/boot/common.S
|
||||||
|
+++ b/zipl/boot/common.S
|
||||||
|
@@ -6,6 +6,7 @@
|
||||||
|
#
|
||||||
|
|
||||||
|
# some definitions from kernel land
|
||||||
|
+__LC_IRB = 0x0300
|
||||||
|
__LC_IPLDEV = 0xC6C
|
||||||
|
__LC_PANIC_MAGIC= 0xE00
|
||||||
|
|
||||||
|
@@ -186,23 +187,33 @@ _load_blocklist:
|
||||||
|
_enable_device:
|
||||||
|
stm %r6,%r15,24(%r15)
|
||||||
|
basr %r13,0 # base register
|
||||||
|
-0: s %r15,1f-0b(%r13)
|
||||||
|
+0: s %r15,4f-0b(%r13)
|
||||||
|
lr %r1,%r2
|
||||||
|
- l %r2,4f-0b(%r13) # set panik code early
|
||||||
|
- stsch 2f-0b(%r13)
|
||||||
|
- oi 2f-0b+5(%r13),0x84 # enable ssch and multipath mode
|
||||||
|
- msch 2f-0b(%r13)
|
||||||
|
- bnz _panik-0b(%r13) # subchannel busy or in error ?
|
||||||
|
- lctl %c6,%c6,3f-0b(%r13) # enable all interrupt classes
|
||||||
|
+ l %r2,7f-0b(%r13) # set panik code early
|
||||||
|
+ stsch 5f-0b(%r13)
|
||||||
|
+ brc 1,3f # panic if not operational
|
||||||
|
+ oi 5f-0b+5(%r13),0x80 # enable subchannel
|
||||||
|
+ lhi %r6,256 # r6 retry counter
|
||||||
|
+1: # modify subchannel
|
||||||
|
+ msch 5f-0b(%r13)
|
||||||
|
+ brc 6,2f # status pending or busy
|
||||||
|
+ brc 1,3f # panic if not operational
|
||||||
|
+ lctl %c6,%c6,6f-0b(%r13) # enable all interrupt classes
|
||||||
|
sr %r2,%r2
|
||||||
|
- ic %r2,10+2f-0b(%r13) # return lpum in r2
|
||||||
|
+ ic %r2,10+5f-0b(%r13) # return lpum in r2
|
||||||
|
lm %r6,%r15,120(%r15)
|
||||||
|
br %r14
|
||||||
|
-1: .long 96
|
||||||
|
+2: # clear status and retry
|
||||||
|
+ tsch __LC_IRB
|
||||||
|
+ brc 1,3f # panic if not operational
|
||||||
|
+ brct %r6,1b # retry
|
||||||
|
+3: # panic
|
||||||
|
+ b _panik-0b(%r13) # panic
|
||||||
|
+4: .long 96
|
||||||
|
.align 8
|
||||||
|
-2: .fill 64,1,0
|
||||||
|
-3: .long 0xff000000 # CR6 initial value
|
||||||
|
-4: .long EENABLE_DEV
|
||||||
|
+5: .fill 64,1,0
|
||||||
|
+6: .long 0xff000000 # CR6 initial value
|
||||||
|
+7: .long EENABLE_DEV
|
||||||
|
|
||||||
|
#
|
||||||
|
# Disable I/O on the ipl device.
|
||||||
|
@@ -211,20 +222,30 @@ _enable_device:
|
||||||
|
_disable_device:
|
||||||
|
stm %r6,%r15,24(%r15)
|
||||||
|
basr %r13,0 # base register
|
||||||
|
-0: s %r15,1f-0b(%r13)
|
||||||
|
+0: s %r15,4f-0b(%r13)
|
||||||
|
lr %r1,%r2
|
||||||
|
- l %r2,3f-0b(%r13) # set panik code early
|
||||||
|
- lctl %c6,%c6,2f-0b(%r13) # disable all interrupt classes
|
||||||
|
- stsch 2f-0b(%r13)
|
||||||
|
- ni 2f-0b+5(%r13),0x7B # disable ssch and multipath mode
|
||||||
|
- msch 2f-0b(%r13)
|
||||||
|
- bnz _panik-0b(%r13) # subchannel busy or in error ?
|
||||||
|
+ l %r2,6f-0b(%r13) # set panik code early
|
||||||
|
+ lctl %c6,%c6,5f-0b(%r13) # disable all interrupt classes
|
||||||
|
+ stsch 5f-0b(%r13)
|
||||||
|
+ brc 1,3f # panic if not operational
|
||||||
|
+ ni 5f-0b+5(%r13),0x7F # disable subchannel
|
||||||
|
+ lhi %r6,256 # r6 retry counter
|
||||||
|
+1: # modify subchannel
|
||||||
|
+ msch 5f-0b(%r13)
|
||||||
|
+ brc 6,2f # status pending or busy
|
||||||
|
+ brc 1,3f # panic if not operational
|
||||||
|
lm %r6,%r15,120(%r15)
|
||||||
|
br %r14
|
||||||
|
-1: .long 96
|
||||||
|
+2: # clear status and retry
|
||||||
|
+ tsch __LC_IRB
|
||||||
|
+ brc 1,3f # panic if not operational
|
||||||
|
+ brct %r6,1b
|
||||||
|
+3: # panic
|
||||||
|
+ b _panik-0b(%r13) # panic
|
||||||
|
+4: .long 96
|
||||||
|
.align 8
|
||||||
|
-2: .long 0x00000000 # CR6 (all interrupts classes disabled)
|
||||||
|
-3: .long EDISABLE_DEV
|
||||||
|
+5: .long 0x00000000 # CR6 (all interrupts classes disabled)
|
||||||
|
+6: .long EDISABLE_DEV
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro io_subroutines
|
||||||
|
--
|
||||||
|
1.6.3.3
|
||||||
|
|
285
0014-dasdview-fdasd-fix-floating-point-error-for-unformat.patch
Normal file
285
0014-dasdview-fdasd-fix-floating-point-error-for-unformat.patch
Normal file
@ -0,0 +1,285 @@
|
|||||||
|
From 72168f2269dac94d25112e0ad548bd3fcdf907d9 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?utf-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Fri, 13 Nov 2009 10:49:37 +0100
|
||||||
|
Subject: [PATCH 14/14] dasdview, fdasd: fix floating point error for unformatted devices
|
||||||
|
|
||||||
|
When executed on an unformatted device the tools dasdview and fdasd
|
||||||
|
will end with an floating point exception error.
|
||||||
|
The reason for the error lies in the fact that we cannot rely on the
|
||||||
|
HDIO_GETGEO ioctl to report a correct number of cylinders and so we
|
||||||
|
compute the number of cylinders from the device size. However,
|
||||||
|
for unformatted devices the device size is zero and thus our
|
||||||
|
computation ends with a floating point exception.
|
||||||
|
To solve this issue read the correct number of cylinders from
|
||||||
|
the DASD device characteristics, which can be found in the data
|
||||||
|
returned by the BIODASDINFO ioctl.
|
||||||
|
---
|
||||||
|
dasdview/dasdview.c | 22 +++++++-------
|
||||||
|
dasdview/dasdview.h | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
fdasd/fdasd.c | 18 ++++++------
|
||||||
|
fdasd/fdasd.h | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
4 files changed, 168 insertions(+), 20 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/dasdview/dasdview.c b/dasdview/dasdview.c
|
||||||
|
index a74ae33..2909b16 100644
|
||||||
|
--- a/dasdview/dasdview.c
|
||||||
|
+++ b/dasdview/dasdview.c
|
||||||
|
@@ -169,7 +169,7 @@ static void
|
||||||
|
dasdview_get_info(dasdview_info_t *info)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
- u_int64_t device_size;
|
||||||
|
+ struct dasd_eckd_characteristics *characteristics;
|
||||||
|
|
||||||
|
fd = open(info->device, O_RDONLY);
|
||||||
|
if (fd == -1)
|
||||||
|
@@ -201,16 +201,6 @@ dasdview_get_info(dasdview_info_t *info)
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (ioctl(fd, BLKGETSIZE64, &device_size) != 0) {
|
||||||
|
- close(fd);
|
||||||
|
- zt_error_print("dasdview: ioctl error\n" \
|
||||||
|
- "Could not retrieve device size information.\n");
|
||||||
|
- exit(-1);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- info->hw_cylinders = ((device_size / info->blksize)
|
||||||
|
- / info->geo.sectors) / info->geo.heads;
|
||||||
|
-
|
||||||
|
/* get disk information */
|
||||||
|
if (ioctl(fd, BIODASDINFO2, &info->dasd_info) == 0) {
|
||||||
|
info->dasd_info_version = 2;
|
||||||
|
@@ -223,6 +213,16 @@ dasdview_get_info(dasdview_info_t *info)
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ characteristics = (struct dasd_eckd_characteristics *)
|
||||||
|
+ &info->dasd_info.characteristics;
|
||||||
|
+ if (characteristics->no_cyl == LV_COMPAT_CYL &&
|
||||||
|
+ characteristics->long_no_cyl)
|
||||||
|
+ info->hw_cylinders = characteristics->long_no_cyl;
|
||||||
|
+ else
|
||||||
|
+ info->hw_cylinders = characteristics->no_cyl;
|
||||||
|
+
|
||||||
|
+
|
||||||
|
close(fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/dasdview/dasdview.h b/dasdview/dasdview.h
|
||||||
|
index 39e1228..5388592 100644
|
||||||
|
--- a/dasdview/dasdview.h
|
||||||
|
+++ b/dasdview/dasdview.h
|
||||||
|
@@ -72,6 +72,80 @@ typedef struct dasd_information2_t {
|
||||||
|
unsigned int reserved7; /* reserved for further use ,... */
|
||||||
|
} dasd_information2_t;
|
||||||
|
|
||||||
|
+struct dasd_eckd_characteristics {
|
||||||
|
+ unsigned short cu_type;
|
||||||
|
+ struct {
|
||||||
|
+ unsigned char support:2;
|
||||||
|
+ unsigned char async:1;
|
||||||
|
+ unsigned char reserved:1;
|
||||||
|
+ unsigned char cache_info:1;
|
||||||
|
+ unsigned char model:3;
|
||||||
|
+ } __attribute__ ((packed)) cu_model;
|
||||||
|
+ unsigned short dev_type;
|
||||||
|
+ unsigned char dev_model;
|
||||||
|
+ struct {
|
||||||
|
+ unsigned char mult_burst:1;
|
||||||
|
+ unsigned char RT_in_LR:1;
|
||||||
|
+ unsigned char reserved1:1;
|
||||||
|
+ unsigned char RD_IN_LR:1;
|
||||||
|
+ unsigned char reserved2:4;
|
||||||
|
+ unsigned char reserved3:8;
|
||||||
|
+ unsigned char defect_wr:1;
|
||||||
|
+ unsigned char XRC_supported:1;
|
||||||
|
+ unsigned char reserved4:1;
|
||||||
|
+ unsigned char striping:1;
|
||||||
|
+ unsigned char reserved5:4;
|
||||||
|
+ unsigned char cfw:1;
|
||||||
|
+ unsigned char reserved6:2;
|
||||||
|
+ unsigned char cache:1;
|
||||||
|
+ unsigned char dual_copy:1;
|
||||||
|
+ unsigned char dfw:1;
|
||||||
|
+ unsigned char reset_alleg:1;
|
||||||
|
+ unsigned char sense_down:1;
|
||||||
|
+ } __attribute__ ((packed)) facilities;
|
||||||
|
+ unsigned char dev_class;
|
||||||
|
+ unsigned char unit_type;
|
||||||
|
+ unsigned short no_cyl;
|
||||||
|
+ unsigned short trk_per_cyl;
|
||||||
|
+ unsigned char sec_per_trk;
|
||||||
|
+ unsigned char byte_per_track[3];
|
||||||
|
+ unsigned short home_bytes;
|
||||||
|
+ unsigned char formula;
|
||||||
|
+ union {
|
||||||
|
+ struct {
|
||||||
|
+ unsigned char f1;
|
||||||
|
+ unsigned short f2;
|
||||||
|
+ unsigned short f3;
|
||||||
|
+ } __attribute__ ((packed)) f_0x01;
|
||||||
|
+ struct {
|
||||||
|
+ unsigned char f1;
|
||||||
|
+ unsigned char f2;
|
||||||
|
+ unsigned char f3;
|
||||||
|
+ unsigned char f4;
|
||||||
|
+ unsigned char f5;
|
||||||
|
+ } __attribute__ ((packed)) f_0x02;
|
||||||
|
+ } __attribute__ ((packed)) factors;
|
||||||
|
+ unsigned short first_alt_trk;
|
||||||
|
+ unsigned short no_alt_trk;
|
||||||
|
+ unsigned short first_dia_trk;
|
||||||
|
+ unsigned short no_dia_trk;
|
||||||
|
+ unsigned short first_sup_trk;
|
||||||
|
+ unsigned short no_sup_trk;
|
||||||
|
+ unsigned char MDR_ID;
|
||||||
|
+ unsigned char OBR_ID;
|
||||||
|
+ unsigned char director;
|
||||||
|
+ unsigned char rd_trk_set;
|
||||||
|
+ unsigned short max_rec_zero;
|
||||||
|
+ unsigned char reserved1;
|
||||||
|
+ unsigned char RWANY_in_LR;
|
||||||
|
+ unsigned char factor6;
|
||||||
|
+ unsigned char factor7;
|
||||||
|
+ unsigned char factor8;
|
||||||
|
+ unsigned char reserved2[3];
|
||||||
|
+ unsigned char reserved3[6];
|
||||||
|
+ unsigned int long_no_cyl;
|
||||||
|
+} __attribute__ ((packed));
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* values to be used for dasd_information2_t.format
|
||||||
|
* 0x00: NOT formatted
|
||||||
|
diff --git a/fdasd/fdasd.c b/fdasd/fdasd.c
|
||||||
|
index a526d7f..8f7f5aa 100644
|
||||||
|
--- a/fdasd/fdasd.c
|
||||||
|
+++ b/fdasd/fdasd.c
|
||||||
|
@@ -2002,7 +2002,7 @@ fdasd_get_geometry (fdasd_anchor_t *anc)
|
||||||
|
int fd, blksize = 0;
|
||||||
|
dasd_information_t dasd_info;
|
||||||
|
char err_str[ERROR_STRING_SIZE];
|
||||||
|
- u_int64_t device_size;
|
||||||
|
+ struct dasd_eckd_characteristics *characteristics;
|
||||||
|
|
||||||
|
if ((fd = open(options.device,O_RDONLY)) < 0) {
|
||||||
|
snprintf(err_str, ERROR_STRING_SIZE,
|
||||||
|
@@ -2023,14 +2023,6 @@ fdasd_get_geometry (fdasd_anchor_t *anc)
|
||||||
|
"Could not retrieve blocksize information.");
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (ioctl(fd, BLKGETSIZE64, &device_size) != 0) {
|
||||||
|
- close(fd);
|
||||||
|
- fdasd_error(anc, unable_to_ioctl,
|
||||||
|
- "Could not retrieve device size information.");
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- anc->hw_cylinders = ((device_size / blksize) / geo.sectors) / geo.heads;
|
||||||
|
-
|
||||||
|
/* get disk type */
|
||||||
|
if (ioctl(fd, BIODASDINFO, &dasd_info) != 0) {
|
||||||
|
close(fd);
|
||||||
|
@@ -2038,6 +2030,14 @@ fdasd_get_geometry (fdasd_anchor_t *anc)
|
||||||
|
"Could not retrieve disk information.");
|
||||||
|
}
|
||||||
|
|
||||||
|
+ characteristics =
|
||||||
|
+ (struct dasd_eckd_characteristics *) &dasd_info.characteristics;
|
||||||
|
+ if (characteristics->no_cyl == LV_COMPAT_CYL &&
|
||||||
|
+ characteristics->long_no_cyl)
|
||||||
|
+ anc->hw_cylinders = characteristics->long_no_cyl;
|
||||||
|
+ else
|
||||||
|
+ anc->hw_cylinders = characteristics->no_cyl;
|
||||||
|
+
|
||||||
|
close(fd);
|
||||||
|
|
||||||
|
if (strncmp(dasd_info.type, "ECKD", 4) != 0) {
|
||||||
|
diff --git a/fdasd/fdasd.h b/fdasd/fdasd.h
|
||||||
|
index 107e486..8a1bfd0 100644
|
||||||
|
--- a/fdasd/fdasd.h
|
||||||
|
+++ b/fdasd/fdasd.h
|
||||||
|
@@ -43,6 +43,80 @@ typedef struct dasd_information_t {
|
||||||
|
char configuration_data[256]; /* from read_configuration_data */
|
||||||
|
} dasd_information_t;
|
||||||
|
|
||||||
|
+struct dasd_eckd_characteristics {
|
||||||
|
+ unsigned short cu_type;
|
||||||
|
+ struct {
|
||||||
|
+ unsigned char support:2;
|
||||||
|
+ unsigned char async:1;
|
||||||
|
+ unsigned char reserved:1;
|
||||||
|
+ unsigned char cache_info:1;
|
||||||
|
+ unsigned char model:3;
|
||||||
|
+ } __attribute__ ((packed)) cu_model;
|
||||||
|
+ unsigned short dev_type;
|
||||||
|
+ unsigned char dev_model;
|
||||||
|
+ struct {
|
||||||
|
+ unsigned char mult_burst:1;
|
||||||
|
+ unsigned char RT_in_LR:1;
|
||||||
|
+ unsigned char reserved1:1;
|
||||||
|
+ unsigned char RD_IN_LR:1;
|
||||||
|
+ unsigned char reserved2:4;
|
||||||
|
+ unsigned char reserved3:8;
|
||||||
|
+ unsigned char defect_wr:1;
|
||||||
|
+ unsigned char XRC_supported:1;
|
||||||
|
+ unsigned char reserved4:1;
|
||||||
|
+ unsigned char striping:1;
|
||||||
|
+ unsigned char reserved5:4;
|
||||||
|
+ unsigned char cfw:1;
|
||||||
|
+ unsigned char reserved6:2;
|
||||||
|
+ unsigned char cache:1;
|
||||||
|
+ unsigned char dual_copy:1;
|
||||||
|
+ unsigned char dfw:1;
|
||||||
|
+ unsigned char reset_alleg:1;
|
||||||
|
+ unsigned char sense_down:1;
|
||||||
|
+ } __attribute__ ((packed)) facilities;
|
||||||
|
+ unsigned char dev_class;
|
||||||
|
+ unsigned char unit_type;
|
||||||
|
+ unsigned short no_cyl;
|
||||||
|
+ unsigned short trk_per_cyl;
|
||||||
|
+ unsigned char sec_per_trk;
|
||||||
|
+ unsigned char byte_per_track[3];
|
||||||
|
+ unsigned short home_bytes;
|
||||||
|
+ unsigned char formula;
|
||||||
|
+ union {
|
||||||
|
+ struct {
|
||||||
|
+ unsigned char f1;
|
||||||
|
+ unsigned short f2;
|
||||||
|
+ unsigned short f3;
|
||||||
|
+ } __attribute__ ((packed)) f_0x01;
|
||||||
|
+ struct {
|
||||||
|
+ unsigned char f1;
|
||||||
|
+ unsigned char f2;
|
||||||
|
+ unsigned char f3;
|
||||||
|
+ unsigned char f4;
|
||||||
|
+ unsigned char f5;
|
||||||
|
+ } __attribute__ ((packed)) f_0x02;
|
||||||
|
+ } __attribute__ ((packed)) factors;
|
||||||
|
+ unsigned short first_alt_trk;
|
||||||
|
+ unsigned short no_alt_trk;
|
||||||
|
+ unsigned short first_dia_trk;
|
||||||
|
+ unsigned short no_dia_trk;
|
||||||
|
+ unsigned short first_sup_trk;
|
||||||
|
+ unsigned short no_sup_trk;
|
||||||
|
+ unsigned char MDR_ID;
|
||||||
|
+ unsigned char OBR_ID;
|
||||||
|
+ unsigned char director;
|
||||||
|
+ unsigned char rd_trk_set;
|
||||||
|
+ unsigned short max_rec_zero;
|
||||||
|
+ unsigned char reserved1;
|
||||||
|
+ unsigned char RWANY_in_LR;
|
||||||
|
+ unsigned char factor6;
|
||||||
|
+ unsigned char factor7;
|
||||||
|
+ unsigned char factor8;
|
||||||
|
+ unsigned char reserved2[3];
|
||||||
|
+ unsigned char reserved3[6];
|
||||||
|
+ unsigned int long_no_cyl;
|
||||||
|
+} __attribute__ ((packed));
|
||||||
|
+
|
||||||
|
/* Get information on a dasd device (enhanced) */
|
||||||
|
#define BIODASDINFO _IOR(DASD_IOCTL_LETTER,1,dasd_information_t)
|
||||||
|
|
||||||
|
--
|
||||||
|
1.6.3.3
|
||||||
|
|
2716
0015-s390tools-1.8.2-zipl-dm.patch
Normal file
2716
0015-s390tools-1.8.2-zipl-dm.patch
Normal file
File diff suppressed because it is too large
Load Diff
376
0016-s390tools-1.8.2-lsreipl-nss.patch
Normal file
376
0016-s390tools-1.8.2-lsreipl-nss.patch
Normal file
@ -0,0 +1,376 @@
|
|||||||
|
From 62fb535a68f1df693869e4361150259b42c6f211 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?utf-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Thu, 10 Dec 2009 18:30:52 +0100
|
||||||
|
Subject: [PATCH 16/16] s390tools-1.8.2-lsreipl-nss
|
||||||
|
|
||||||
|
---
|
||||||
|
ipl_tools/ccw.c | 42 ++++++++++++++++---------------------
|
||||||
|
ipl_tools/chreipl.h | 9 +++++--
|
||||||
|
ipl_tools/fcp.c | 13 ++++++-----
|
||||||
|
ipl_tools/ipl.c | 57 +++++++++++++++++++++++++++++++-------------------
|
||||||
|
ipl_tools/main.c | 25 +++++++++++++++++-----
|
||||||
|
ipl_tools/system.c | 3 +-
|
||||||
|
6 files changed, 87 insertions(+), 62 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/ipl_tools/ccw.c b/ipl_tools/ccw.c
|
||||||
|
index 7959831..eef4550 100644
|
||||||
|
--- a/ipl_tools/ccw.c
|
||||||
|
+++ b/ipl_tools/ccw.c
|
||||||
|
@@ -52,22 +52,19 @@ int isccwdev(const char *devno)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
-int get_ccw_devno_old_sysfs(char *device, char *devno)
|
||||||
|
+int get_ccw_devno_old_sysfs(char *device)
|
||||||
|
{
|
||||||
|
FILE *filp;
|
||||||
|
- int len, errorpath, rc;
|
||||||
|
+ int errorpath;
|
||||||
|
char path1[4096];
|
||||||
|
char buf[4096];
|
||||||
|
- char *match, *s1, *s2;
|
||||||
|
+ char *match = NULL, *s1, *s2;
|
||||||
|
|
||||||
|
errorpath = 1;
|
||||||
|
- rc = 0;
|
||||||
|
sprintf(path1, "/sys/block/%s/uevent", device);
|
||||||
|
filp = fopen(path1, "r");
|
||||||
|
- if (!filp) {
|
||||||
|
- rc = -1;
|
||||||
|
- return rc;
|
||||||
|
- }
|
||||||
|
+ if (!filp)
|
||||||
|
+ return -1;
|
||||||
|
/*
|
||||||
|
* the uevent file contains an entry like this:
|
||||||
|
* PHYSDEVPATH=/devices/css0/0.0.206a/0.0.7e78
|
||||||
|
@@ -77,16 +74,16 @@ int get_ccw_devno_old_sysfs(char *device, char *devno)
|
||||||
|
if (match != NULL)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
+ fclose(filp);
|
||||||
|
+ if (!match)
|
||||||
|
+ return -1;
|
||||||
|
s1 = strchr(buf, '/');
|
||||||
|
s2 = strrchr(buf, '/');
|
||||||
|
- len = s2-s1;
|
||||||
|
- strncpy(devno, s2 + 1, sizeof(devno));
|
||||||
|
- devno[len] = '\0';
|
||||||
|
- fclose(filp);
|
||||||
|
+ strncpy(devno, s2 + 1, sizeof(devno) - 1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-int get_ccw_devno_new_sysfs(char *device, char *devno)
|
||||||
|
+int get_ccw_devno_new_sysfs(char *device)
|
||||||
|
{
|
||||||
|
int len, errorpath, rc;
|
||||||
|
char path2[4096];
|
||||||
|
@@ -119,8 +116,7 @@ int get_ccw_devno_new_sysfs(char *device, char *devno)
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- strncpy(devno, s2 + 1, sizeof(devno));
|
||||||
|
- devno[len] = '\0';
|
||||||
|
+ strncpy(devno, s2 + 1, sizeof(devno) - 1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -134,16 +130,14 @@ int get_ccw_devno_new_sysfs(char *device, char *devno)
|
||||||
|
*
|
||||||
|
* This does not work when booting from tape
|
||||||
|
*/
|
||||||
|
-int get_ccw_devno(char *device, char *devno)
|
||||||
|
+int get_ccw_devno(char *device)
|
||||||
|
{
|
||||||
|
- if (get_ccw_devno_old_sysfs(device, devno) != 0) {
|
||||||
|
- if (get_ccw_devno_new_sysfs(device, devno) != 0) {
|
||||||
|
- fprintf(stderr, "%s: Failed to lookup the device number\n",
|
||||||
|
- name);
|
||||||
|
- return -1;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- return 0;
|
||||||
|
+ if (get_ccw_devno_old_sysfs(device) == 0)
|
||||||
|
+ return 0;
|
||||||
|
+ if (get_ccw_devno_new_sysfs(device) == 0)
|
||||||
|
+ return 0;
|
||||||
|
+ fprintf(stderr, "%s: Failed to lookup the device number\n", name);
|
||||||
|
+ return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_ccw_dev(char *partition, char *device)
|
||||||
|
diff --git a/ipl_tools/chreipl.h b/ipl_tools/chreipl.h
|
||||||
|
index 19a83eb..37807a7 100644
|
||||||
|
--- a/ipl_tools/chreipl.h
|
||||||
|
+++ b/ipl_tools/chreipl.h
|
||||||
|
@@ -34,6 +34,9 @@ extern char saction[8];
|
||||||
|
extern char name[256];
|
||||||
|
extern int action;
|
||||||
|
|
||||||
|
+#define IPL_TYPE_LEN_MAX 100
|
||||||
|
+#define NSS_NAME_LEN_MAX 8
|
||||||
|
+
|
||||||
|
#define ACT_CCW 1
|
||||||
|
#define ACT_FCP 2
|
||||||
|
#define ACT_NODE 3
|
||||||
|
@@ -63,10 +66,10 @@ int is_valid_case(char *c);
|
||||||
|
int is_valid_action(char *action);
|
||||||
|
void parse_shutdown_options(int argc, char **argv);
|
||||||
|
void strlow(char *s);
|
||||||
|
-int get_ccw_devno(char *device, char *devno);
|
||||||
|
-int get_reipl_type(void);
|
||||||
|
+int get_ccw_devno(char *device);
|
||||||
|
+int get_reipl_type(char *reipltype);
|
||||||
|
void parse_lsreipl_options(int argc, char **argv);
|
||||||
|
-int get_ipl_type();
|
||||||
|
+int get_ipl_type(char *reipltype);
|
||||||
|
int get_ipl_loadparam(void);
|
||||||
|
void print_ipl_settings(void);
|
||||||
|
int get_sa(char *action, char *file);
|
||||||
|
diff --git a/ipl_tools/fcp.c b/ipl_tools/fcp.c
|
||||||
|
index 86fa95b..7a8b4c5 100644
|
||||||
|
--- a/ipl_tools/fcp.c
|
||||||
|
+++ b/ipl_tools/fcp.c
|
||||||
|
@@ -33,12 +33,11 @@
|
||||||
|
|
||||||
|
/*
|
||||||
|
* return the current reipl type from /sys/firmware/reipl/reipl_type
|
||||||
|
- * 0 = fcp, 1 = ccw, -1, error
|
||||||
|
+ * 0 = fcp, 1 = ccw, 2 = nss, -1 = unknown
|
||||||
|
*/
|
||||||
|
-int get_reipl_type(void)
|
||||||
|
+int get_reipl_type(char *reipltype)
|
||||||
|
{
|
||||||
|
FILE *filp;
|
||||||
|
- char reipltype[4];
|
||||||
|
char path[4096];
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
@@ -49,7 +48,7 @@ int get_reipl_type(void)
|
||||||
|
fprintf(stderr, "%s: Can not open /sys/firmware/"
|
||||||
|
"reipl/reipl_type: ", name);
|
||||||
|
fprintf(stderr, "%s\n", strerror(errno));
|
||||||
|
- return -1;
|
||||||
|
+ exit(1);
|
||||||
|
}
|
||||||
|
rc = fscanf(filp, "%s", reipltype);
|
||||||
|
fclose(filp);
|
||||||
|
@@ -57,17 +56,19 @@ int get_reipl_type(void)
|
||||||
|
fprintf(stderr, "%s: Failed to read "
|
||||||
|
"/sys/firmware/reipl/reipl_type:", name);
|
||||||
|
fprintf(stderr, "%s\n", strerror(errno));
|
||||||
|
- return -1;
|
||||||
|
+ exit(1);
|
||||||
|
}
|
||||||
|
if (strncmp(reipltype, "fcp", strlen("fcp")) == 0)
|
||||||
|
return T_FCP;
|
||||||
|
else if (strncmp(reipltype, "ccw", strlen("ccw")) == 0)
|
||||||
|
return T_CCW;
|
||||||
|
- /* TODO: add NSS support */
|
||||||
|
+ else if (strncmp(reipltype, "nss", strlen("nss")) == 0)
|
||||||
|
+ return T_NSS;
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "%s: Can not open /sys/firmware/reipl/"
|
||||||
|
"reipl_type:", name);
|
||||||
|
fprintf(stderr, " %s\n", strerror(errno));
|
||||||
|
+ exit(1);
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
diff --git a/ipl_tools/ipl.c b/ipl_tools/ipl.c
|
||||||
|
index 2bf817a..8cca700 100644
|
||||||
|
--- a/ipl_tools/ipl.c
|
||||||
|
+++ b/ipl_tools/ipl.c
|
||||||
|
@@ -33,12 +33,11 @@
|
||||||
|
|
||||||
|
/*
|
||||||
|
* return the ipl type based on /sys/firmware/ipl/ipl_type
|
||||||
|
- * returns 0 in case of fcp and 1 in case of ccw, -1 otherwise
|
||||||
|
+ * returns 0 in case of fcp and 1 in case of ccw, 2 for nss and -1 otherwise
|
||||||
|
*/
|
||||||
|
-int get_ipl_type()
|
||||||
|
+int get_ipl_type(char *reipltype)
|
||||||
|
{
|
||||||
|
FILE *filp;
|
||||||
|
- char reipltype[4];
|
||||||
|
char path[4096];
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
@@ -49,7 +48,7 @@ int get_ipl_type()
|
||||||
|
fprintf(stderr, "%s: Can not open /sys/firmware/ipl/"
|
||||||
|
"ipl_type: ", name);
|
||||||
|
fprintf(stderr, "%s\n", strerror(errno));
|
||||||
|
- return -1;
|
||||||
|
+ exit(1);
|
||||||
|
}
|
||||||
|
rc = fscanf(filp, "%s", reipltype);
|
||||||
|
fclose(filp);
|
||||||
|
@@ -57,12 +56,14 @@ int get_ipl_type()
|
||||||
|
fprintf(stderr, "%s: Failed to read "
|
||||||
|
"/sys/firmware/ipl/ipl_type: ", name);
|
||||||
|
fprintf(stderr, "%s\n", strerror(errno));
|
||||||
|
- return -1;
|
||||||
|
+ exit(1);
|
||||||
|
}
|
||||||
|
if (strncmp(reipltype, "fcp", strlen("fcp")) == 0)
|
||||||
|
return T_FCP;
|
||||||
|
else if (strncmp(reipltype, "ccw", strlen("ccw")) == 0)
|
||||||
|
return T_CCW;
|
||||||
|
+ else if (strncmp(reipltype, "nss", strlen("nss")) == 0)
|
||||||
|
+ return T_NSS;
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "%s: Can not open /sys/firmware/ipl/"
|
||||||
|
"ipl_type:", name);
|
||||||
|
@@ -111,30 +112,38 @@ int get_ipl_loadparam(void)
|
||||||
|
void print_ipl_settings(void)
|
||||||
|
{
|
||||||
|
int rc, type;
|
||||||
|
- char bootprog[1024], lba[1024];
|
||||||
|
+ char bootprog[1024], lba[1024], nss_name[NSS_NAME_LEN_MAX + 1];
|
||||||
|
+ char reipltype[IPL_TYPE_LEN_MAX + 1];
|
||||||
|
|
||||||
|
- type = get_ipl_type();
|
||||||
|
- /*
|
||||||
|
- * TODO: add nss support
|
||||||
|
- */
|
||||||
|
- if (type == 1)
|
||||||
|
+ type = get_ipl_type(reipltype);
|
||||||
|
+ switch (type) {
|
||||||
|
+ case T_NSS:
|
||||||
|
+ printf("IPL type: nss\n");
|
||||||
|
+ rc = strrd(nss_name, "/sys/firmware/ipl/name");
|
||||||
|
+ if (rc != 0)
|
||||||
|
+ exit(1);
|
||||||
|
+ printf("Name: %s\n", nss_name);
|
||||||
|
+ break;
|
||||||
|
+ case T_CCW:
|
||||||
|
printf("IPL type: ccw\n");
|
||||||
|
- if (type == 0)
|
||||||
|
- printf("IPL type: fcp\n");
|
||||||
|
- rc = strrd(devno, "/sys/firmware/ipl/device");
|
||||||
|
- if (rc != 0)
|
||||||
|
- exit(1) /* the error msg comes from get_ipl_device */;
|
||||||
|
- if (strlen(devno) > 0)
|
||||||
|
- printf("Device: %s\n", devno);
|
||||||
|
- if (type == 1) {
|
||||||
|
+ rc = strrd(devno, "/sys/firmware/ipl/device");
|
||||||
|
+ if (rc != 0)
|
||||||
|
+ exit(1);
|
||||||
|
+ if (strlen(devno) > 0)
|
||||||
|
+ printf("Device: %s\n", devno);
|
||||||
|
rc = get_ipl_loadparam();
|
||||||
|
if (rc != -1)
|
||||||
|
printf("Loadparm: %d\n", rc);
|
||||||
|
else
|
||||||
|
printf("Loadparm: \n");
|
||||||
|
- }
|
||||||
|
- if (type == 0) {
|
||||||
|
- /* these settings are only available for fcp */
|
||||||
|
+ break;
|
||||||
|
+ case T_FCP:
|
||||||
|
+ printf("IPL type: fcp\n");
|
||||||
|
+ rc = strrd(devno, "/sys/firmware/ipl/device");
|
||||||
|
+ if (rc != 0)
|
||||||
|
+ exit(1);
|
||||||
|
+ if (strlen(devno) > 0)
|
||||||
|
+ printf("Device: %s\n", devno);
|
||||||
|
rc = strrd(wwpn, "/sys/firmware/reipl/fcp/wwpn");
|
||||||
|
if (rc != -1 && strlen(wwpn) > 0)
|
||||||
|
printf("WWPN: %s\n", wwpn);
|
||||||
|
@@ -147,6 +156,10 @@ void print_ipl_settings(void)
|
||||||
|
rc = strrd(lba, "/sys/firmware/ipl/br_lba");
|
||||||
|
if (rc != -1 && strlen(lba) > 0)
|
||||||
|
printf("br_lba: %s\n", lba);
|
||||||
|
+ break;
|
||||||
|
+ default:
|
||||||
|
+ printf("IPL type: %s (unknown)\n", reipltype);
|
||||||
|
+ break;
|
||||||
|
}
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
diff --git a/ipl_tools/main.c b/ipl_tools/main.c
|
||||||
|
index 2eaa043..bcebabe 100644
|
||||||
|
--- a/ipl_tools/main.c
|
||||||
|
+++ b/ipl_tools/main.c
|
||||||
|
@@ -57,13 +57,22 @@ int action; /* either CCW, FCP or NODE */
|
||||||
|
int lsreipl(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
- char bootprog[1024], lba[1024], val[9];
|
||||||
|
+ char bootprog[1024], lba[1024], val[9], reipltype[IPL_TYPE_LEN_MAX + 1];
|
||||||
|
+ char nss_name[NSS_NAME_LEN_MAX + 1];
|
||||||
|
|
||||||
|
/* parse the command line options in getop.c */
|
||||||
|
parse_lsreipl_options(argc, argv);
|
||||||
|
|
||||||
|
- rc = get_reipl_type();
|
||||||
|
- if (rc == 0) {
|
||||||
|
+ rc = get_reipl_type(reipltype);
|
||||||
|
+ switch (rc) {
|
||||||
|
+ case T_NSS:
|
||||||
|
+ printf("Re-IPL type: nss\n");
|
||||||
|
+ rc = strrd(nss_name, "/sys/firmware/reipl/nss/name");
|
||||||
|
+ if (rc != 0)
|
||||||
|
+ exit(1);
|
||||||
|
+ printf("Name: %s\n", nss_name);
|
||||||
|
+ break;
|
||||||
|
+ case T_FCP:
|
||||||
|
printf("Re-IPL type: fcp\n");
|
||||||
|
rc = strrd(wwpn, "/sys/firmware/reipl/fcp/wwpn");
|
||||||
|
if (rc != 0)
|
||||||
|
@@ -90,8 +99,8 @@ int lsreipl(int argc, char *argv[])
|
||||||
|
printf("bootprog: %s\n", bootprog);
|
||||||
|
if (strlen(lba) > 0)
|
||||||
|
printf("br_lba: %s\n", lba);
|
||||||
|
- }
|
||||||
|
- if (rc == 1) {
|
||||||
|
+ break;
|
||||||
|
+ case T_CCW:
|
||||||
|
printf("Re-IPL type: ccw\n");
|
||||||
|
rc = strrd(devno, "/sys/firmware/reipl/ccw/device");
|
||||||
|
if (rc != 0)
|
||||||
|
@@ -106,6 +115,10 @@ int lsreipl(int argc, char *argv[])
|
||||||
|
printf("Loadparm: %s\n", val);
|
||||||
|
else
|
||||||
|
printf("Loadparm: \n");
|
||||||
|
+ break;
|
||||||
|
+ default:
|
||||||
|
+ printf("Re-IPL type: %s (unknown)\n", reipltype);
|
||||||
|
+ break;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@@ -134,7 +147,7 @@ int reipl(int argc, char *argv[])
|
||||||
|
"partition: %s\n", name, partition);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
- rc = get_ccw_devno(device, devno);
|
||||||
|
+ rc = get_ccw_devno(device);
|
||||||
|
if (rc != 0) {
|
||||||
|
fprintf(stderr, "%s: Unable to lookup device"
|
||||||
|
" number for device %s\n", name,
|
||||||
|
diff --git a/ipl_tools/system.c b/ipl_tools/system.c
|
||||||
|
index fd5b76b..ca6c5af 100644
|
||||||
|
--- a/ipl_tools/system.c
|
||||||
|
+++ b/ipl_tools/system.c
|
||||||
|
@@ -174,7 +174,7 @@ int strrd(char *string, char *file)
|
||||||
|
fprintf(stderr, "%s\n", strerror(errno));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
- rc = fread(string, 4096, 1, filp);
|
||||||
|
+ rc = fread(string, 1, 4096, filp);
|
||||||
|
fclose(filp);
|
||||||
|
/*
|
||||||
|
* special handling is required for
|
||||||
|
@@ -193,6 +193,7 @@ int strrd(char *string, char *file)
|
||||||
|
fprintf(stderr, "%s\n", strerror(errno));
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
+ string[rc] = 0;
|
||||||
|
if (string[strlen(string) - 1] == '\n')
|
||||||
|
string[strlen(string) - 1] = 0;
|
||||||
|
return 0;
|
||||||
|
--
|
||||||
|
1.6.3.3
|
||||||
|
|
1215
0017-qualified-return-codes-and-further-error-handling-in.patch
Normal file
1215
0017-qualified-return-codes-and-further-error-handling-in.patch
Normal file
File diff suppressed because it is too large
Load Diff
38
0018-fix-uppercase-conversion-in-lscss.patch
Normal file
38
0018-fix-uppercase-conversion-in-lscss.patch
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
From a8bcc744ec941c3b34c22c7a7729b52a390c7a08 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Wed, 13 Jan 2010 08:39:09 +0100
|
||||||
|
Subject: [PATCH] fix uppercase conversion in lscss
|
||||||
|
|
||||||
|
Description: lscss: fix uppercase conversion
|
||||||
|
Symptom: when invoking the -u option, lscss will fail with the message "tr: missing operand"
|
||||||
|
Problem: the bash option "nullglob" interferes with the tr operands
|
||||||
|
Solution: avoid expanding of those operands by placing quotes around them
|
||||||
|
---
|
||||||
|
zconf/lscss | 4 ++--
|
||||||
|
1 files changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/zconf/lscss b/zconf/lscss
|
||||||
|
index efdb9ca..fc40fe6 100755
|
||||||
|
--- a/zconf/lscss
|
||||||
|
+++ b/zconf/lscss
|
||||||
|
@@ -354,7 +354,7 @@ if [ $SCH_IO ] ;then
|
||||||
|
echo "----------------------------------------------------------------------"
|
||||||
|
fi
|
||||||
|
print_io | if [ $UPPERCASE ] ;then
|
||||||
|
- tr [:lower:] [:upper:]
|
||||||
|
+ tr "[:lower:]" "[:upper:]"
|
||||||
|
else
|
||||||
|
cat -
|
||||||
|
fi
|
||||||
|
@@ -368,7 +368,7 @@ if [ $SCH_CHSC ] ;then
|
||||||
|
echo "Device Subchan."
|
||||||
|
echo "-----------------"
|
||||||
|
print_chsc | if [ $UPPERCASE ] ;then
|
||||||
|
- tr [:lower:] [:upper:]
|
||||||
|
+ tr "[:lower:]" "[:upper:]"
|
||||||
|
else
|
||||||
|
cat -
|
||||||
|
fi
|
||||||
|
--
|
||||||
|
1.6.5.2
|
||||||
|
|
53
0019-ziorep-fix-return-codes.patch
Normal file
53
0019-ziorep-fix-return-codes.patch
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
From a8ffd7242da2adcc4ab5b0f23193cfe764dc376d Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Wed, 20 Jan 2010 08:42:52 +0100
|
||||||
|
Subject: [PATCH 19/22] ziorep: fix return codes
|
||||||
|
|
||||||
|
Description: ziomon: ziorep tools return 1 when using options -h and -v
|
||||||
|
Symptom: Using ziorep_traffic/utilization with these options give an
|
||||||
|
error.
|
||||||
|
Problem: 1 as been introduced as rc for parse_parms besides error codes,
|
||||||
|
but is not distinguished from them when parse_params is called.
|
||||||
|
Solution: After calling parse_parms check for rc 1 and substitute through 0.
|
||||||
|
---
|
||||||
|
ziomon/ziorep_traffic.cpp | 5 ++++-
|
||||||
|
ziomon/ziorep_utilization.cpp | 5 ++++-
|
||||||
|
2 files changed, 8 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/ziomon/ziorep_traffic.cpp b/ziomon/ziorep_traffic.cpp
|
||||||
|
index 1461e55..20ee32f 100644
|
||||||
|
--- a/ziomon/ziorep_traffic.cpp
|
||||||
|
+++ b/ziomon/ziorep_traffic.cpp
|
||||||
|
@@ -529,8 +529,11 @@ int main(int argc, char **argv)
|
||||||
|
verbose = 0;
|
||||||
|
|
||||||
|
init_opts(&opts);
|
||||||
|
- if ( (rc = parse_params(argc, argv, &opts)) )
|
||||||
|
+ if ( (rc = parse_params(argc, argv, &opts)) ) {
|
||||||
|
+ if (rc == 1)
|
||||||
|
+ rc = 0;
|
||||||
|
goto out;
|
||||||
|
+ }
|
||||||
|
if ( (rc = check_opts(&opts, &cfg)) )
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
diff --git a/ziomon/ziorep_utilization.cpp b/ziomon/ziorep_utilization.cpp
|
||||||
|
index 3f57a47..ac4576f 100644
|
||||||
|
--- a/ziomon/ziorep_utilization.cpp
|
||||||
|
+++ b/ziomon/ziorep_utilization.cpp
|
||||||
|
@@ -352,8 +352,11 @@ int main(int argc, char **argv)
|
||||||
|
verbose = 0;
|
||||||
|
|
||||||
|
init_opts(&opts);
|
||||||
|
- if ( (rc = parse_params(argc, argv, &opts)) )
|
||||||
|
+ if ( (rc = parse_params(argc, argv, &opts)) ) {
|
||||||
|
+ if (rc == 1)
|
||||||
|
+ rc = 0;
|
||||||
|
goto out;
|
||||||
|
+ }
|
||||||
|
if ( (rc = check_opts(&opts, &cfg)) )
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
--
|
||||||
|
1.6.5.2
|
||||||
|
|
31
0020-lstape-fix-return-code.patch
Normal file
31
0020-lstape-fix-return-code.patch
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
From 72ec5b5bd9a7fd23e2d1aaed455df8f2bda952ca Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Wed, 20 Jan 2010 08:44:43 +0100
|
||||||
|
Subject: [PATCH 20/22] lstape: fix return code
|
||||||
|
|
||||||
|
Description: lstape: help function returns 1, although it was successful
|
||||||
|
Symptom: Issuing "lstape -h" or "lstape --help" and then looking for the
|
||||||
|
error code on the console through e.g. "echo $?" shows 1. Which
|
||||||
|
looks like an error.
|
||||||
|
Problem: exit 1, where we chould have exit 0.
|
||||||
|
Solution: Return 0 after calling the help function with exit 0.
|
||||||
|
---
|
||||||
|
zconf/lstape | 2 +-
|
||||||
|
1 files changed, 1 insertions(+), 1 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/zconf/lstape b/zconf/lstape
|
||||||
|
index efacfc9..5671315 100755
|
||||||
|
--- a/zconf/lstape
|
||||||
|
+++ b/zconf/lstape
|
||||||
|
@@ -90,7 +90,7 @@ while [ $# -ne 0 ]; do
|
||||||
|
case $1 in
|
||||||
|
-h|--help)
|
||||||
|
PrintUsage
|
||||||
|
- exit 1
|
||||||
|
+ exit 0
|
||||||
|
;;
|
||||||
|
-t|--type)
|
||||||
|
if [ $# -lt 2 ]; then
|
||||||
|
--
|
||||||
|
1.6.5.2
|
||||||
|
|
@ -0,0 +1,32 @@
|
|||||||
|
From d3c4eb2ced3a8e3c8f7a528f88721324028534e9 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Wed, 20 Jan 2010 08:46:14 +0100
|
||||||
|
Subject: [PATCH 21/22] cpuplugd: fix reading the size of /proc/sys/vm/cmm_pages
|
||||||
|
|
||||||
|
Description: cpuplugd: fix fscanf file handling in get_cmmpages_size
|
||||||
|
Symptom: cpuplugd was not able to correctly read the size of the
|
||||||
|
/proc/sys/vm/cmm_pages file. This prevented cpuplugd from using
|
||||||
|
the cmm feature correctly.
|
||||||
|
Problem: The code checked for the wrong return code (!= 0 instead of ==0)
|
||||||
|
Solution: Check for the right return code in the get_cmmpages_size error
|
||||||
|
handling function.
|
||||||
|
---
|
||||||
|
cpuplugd/mem.c | 2 +-
|
||||||
|
1 files changed, 1 insertions(+), 1 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/cpuplugd/mem.c b/cpuplugd/mem.c
|
||||||
|
index a8f2a8e..8d5f05f 100644
|
||||||
|
--- a/cpuplugd/mem.c
|
||||||
|
+++ b/cpuplugd/mem.c
|
||||||
|
@@ -230,7 +230,7 @@ int get_cmmpages_size()
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
rc = fscanf(filp, "%d", &size);
|
||||||
|
- if (rc != 0) {
|
||||||
|
+ if (rc == 0) {
|
||||||
|
fprintf(stderr, "Can not read /proc/sys/vm/cmm_pages: %s\n",
|
||||||
|
strerror(errno));
|
||||||
|
if (foreground == 0)
|
||||||
|
--
|
||||||
|
1.6.5.2
|
||||||
|
|
74
0022-lsqeth-support-new-attributes.patch
Normal file
74
0022-lsqeth-support-new-attributes.patch
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
From c986172e782ae2afa41209e7c238315175d589e1 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Wed, 20 Jan 2010 08:48:52 +0100
|
||||||
|
Subject: [PATCH 22/22] lsqeth: support new attributes
|
||||||
|
|
||||||
|
Description: lsqeth: add recent qeth attributes
|
||||||
|
Symptom: no information about "isolation" and "sniffer" values
|
||||||
|
Problem: new sysfs attributes "isolation" and "sniffer" not mentioned in
|
||||||
|
lsqeth output.
|
||||||
|
Solution: add attributes "isolation" and "sniffer" to lsqeth.
|
||||||
|
---
|
||||||
|
README | 2 ++
|
||||||
|
zconf/lsqeth | 11 +++++++----
|
||||||
|
2 files changed, 9 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/README b/README
|
||||||
|
index 30ba06f..7c75563 100644
|
||||||
|
--- a/README
|
||||||
|
+++ b/README
|
||||||
|
@@ -192,6 +192,8 @@ Release History:
|
||||||
|
|
||||||
|
- lscss: Also show devices on the defunct subchannel.
|
||||||
|
|
||||||
|
+ - lsqeth: add attributes "isolation" and "sniffer"
|
||||||
|
+
|
||||||
|
- all: Reworked s390-tools build process.
|
||||||
|
|
||||||
|
Bug Fixes:
|
||||||
|
diff --git a/zconf/lsqeth b/zconf/lsqeth
|
||||||
|
index 9b155e9..b1c2809 100755
|
||||||
|
--- a/zconf/lsqeth
|
||||||
|
+++ b/zconf/lsqeth
|
||||||
|
@@ -3,7 +3,7 @@
|
||||||
|
# File...........: lsqeth
|
||||||
|
# Author(s)......: Steffen Thoss <thoss@de.ibm.com>
|
||||||
|
# Peter Tiedemann <ptiedem@de.ibm.com>
|
||||||
|
-# Copyright IBM Corp. 2004, 2009
|
||||||
|
+# Copyright IBM Corp. 2004, 2010
|
||||||
|
#
|
||||||
|
# History of changes:
|
||||||
|
#
|
||||||
|
@@ -63,7 +63,9 @@ output_array=( if_name
|
||||||
|
buffer_count
|
||||||
|
add_hhlen
|
||||||
|
layer2
|
||||||
|
- large_send )
|
||||||
|
+ large_send
|
||||||
|
+ isolation
|
||||||
|
+ sniffer )
|
||||||
|
# Array for sysfs values
|
||||||
|
sysfs_entries=( "sw checksumming" "hw checksumming" "no checksumming"
|
||||||
|
"always queue 0" "always queue 1"
|
||||||
|
@@ -87,7 +89,7 @@ parp_array=0
|
||||||
|
function PrintVersion
|
||||||
|
{
|
||||||
|
echo "$script_name: version %S390_TOOLS_VERSION%"
|
||||||
|
- echo "Copyright IBM Corp. 2003, 2009"
|
||||||
|
+ echo "Copyright IBM Corp. 2003, 2010"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -308,7 +310,8 @@ function __print_normal_format
|
||||||
|
function __layer2_print
|
||||||
|
{
|
||||||
|
del_layer2=( route4 route6
|
||||||
|
- fake_ll fake_broadcast )
|
||||||
|
+ fake_ll fake_broadcast
|
||||||
|
+ sniffer )
|
||||||
|
|
||||||
|
for l in ${del_layer2[@]}
|
||||||
|
do
|
||||||
|
--
|
||||||
|
1.6.5.2
|
||||||
|
|
47
0023-znetconf-use-hex-index-for-chpidtype-table.patch
Normal file
47
0023-znetconf-use-hex-index-for-chpidtype-table.patch
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
From 3ca0d01240ab14ab3217985bf8ed9c89111e36c9 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Wed, 3 Feb 2010 13:17:41 +0100
|
||||||
|
Subject: [PATCH] znetconf: use hex index for chpidtype table
|
||||||
|
|
||||||
|
Description: znetconf: index into chpidtype lookup table must be hex.
|
||||||
|
Symptom: Network subchannels with CHPID type containing non-decimal digits,
|
||||||
|
i.e. a-f, cause lsznet.raw errors like the following:
|
||||||
|
1a: value too great for base (error token is "1a")
|
||||||
|
Problem: The value of the sysfs attribute "type" of a CHPID is hex,
|
||||||
|
but the lookup table index in the bash script must be decimal.
|
||||||
|
Solution: Interpret "type" as hex number when used as lookup table index.
|
||||||
|
---
|
||||||
|
zconf/lsznet.raw | 10 +++++-----
|
||||||
|
1 files changed, 5 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/zconf/lsznet.raw b/zconf/lsznet.raw
|
||||||
|
index e5643ee..9821ba3 100755
|
||||||
|
--- a/zconf/lsznet.raw
|
||||||
|
+++ b/zconf/lsznet.raw
|
||||||
|
@@ -68,10 +68,10 @@ readonly -a CU_GROUPCHANNELS=(
|
||||||
|
)
|
||||||
|
|
||||||
|
readonly -a CHPIDTYPES=(
|
||||||
|
- [10]=OSE
|
||||||
|
- [11]=OSD
|
||||||
|
- [15]=OSN
|
||||||
|
- [24]=IQD
|
||||||
|
+ [0x10]=OSE
|
||||||
|
+ [0x11]=OSD
|
||||||
|
+ [0x15]=OSN
|
||||||
|
+ [0x24]=IQD
|
||||||
|
)
|
||||||
|
|
||||||
|
# whitelist of network devices for TCP/IP stack, e.g. for Linux installers
|
||||||
|
@@ -116,7 +116,7 @@ function search_cu_tcpip() {
|
||||||
|
# Always succeeds and returns 0.
|
||||||
|
function search_chpt() {
|
||||||
|
local chpidtype_number=$1
|
||||||
|
- chpidtype_symbolic=${CHPIDTYPES[$chpidtype_number]}
|
||||||
|
+ chpidtype_symbolic=${CHPIDTYPES[$((0x$chpidtype_number))]}
|
||||||
|
if [ "$chpidtype_symbolic" == "" ]; then
|
||||||
|
chpidtype_symbolic="?"
|
||||||
|
fi
|
||||||
|
--
|
||||||
|
1.6.6
|
||||||
|
|
230
0024-zipl-handle-SSCH-status.patch
Normal file
230
0024-zipl-handle-SSCH-status.patch
Normal file
@ -0,0 +1,230 @@
|
|||||||
|
From 9c94d906621e775f005fa34583671f08000f1723 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Thu, 4 Feb 2010 13:07:30 +0100
|
||||||
|
Subject: [PATCH] zipl: handle SSCH status
|
||||||
|
|
||||||
|
Description: zipl: handle status during IPL SSCH
|
||||||
|
Symptom: System enters disabled wait during IPL of DASD disk when an
|
||||||
|
unexpected status (e.g. triggered by a flashcopy operation)
|
||||||
|
is recognized on the IPL device.
|
||||||
|
Problem: Unexpected status is not handled correctly during the SSCH
|
||||||
|
portion of the IPL code.
|
||||||
|
Solution: Introduce a more robust SSCH result handling which performs
|
||||||
|
retries and clears status when encountering errors.
|
||||||
|
---
|
||||||
|
zipl/boot/common.S | 163 +++++++++++++++++++++++++++++++++++-----------------
|
||||||
|
zipl/boot/eckd2.S | 1 -
|
||||||
|
zipl/boot/fba2.S | 1 -
|
||||||
|
3 files changed, 110 insertions(+), 55 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/zipl/boot/common.S b/zipl/boot/common.S
|
||||||
|
index fa45e5a..108dbbf 100644
|
||||||
|
--- a/zipl/boot/common.S
|
||||||
|
+++ b/zipl/boot/common.S
|
||||||
|
@@ -249,69 +249,126 @@ _disable_device:
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro io_subroutines
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+__LC_IO_NEW_PSW = 0x78
|
||||||
|
+__LC_SUBCHANNEL_ID = 0xb8
|
||||||
|
+
|
||||||
|
+#
|
||||||
|
+# Wait for I/O interrupt.
|
||||||
|
+#
|
||||||
|
+# Wait until status for the specified subchannel is available.
|
||||||
|
+#
|
||||||
|
+# %r2 : subchannel id
|
||||||
|
+# %r3 : address of irb
|
||||||
|
+#
|
||||||
|
+
|
||||||
|
+_wait_for_int:
|
||||||
|
+ lr %r1,%r2
|
||||||
|
+ basr %r4,0 # get base register
|
||||||
|
+0:
|
||||||
|
+ mvc __LC_IO_NEW_PSW(8),4f-0b(%r4) # set i/o new psw
|
||||||
|
+1: # wait
|
||||||
|
+ lpsw 3f-0b(%r4)
|
||||||
|
+2: # continue
|
||||||
|
+ tsch 0(%r3) # get status
|
||||||
|
+ brc 4,1b # if cc=1 goto wait
|
||||||
|
+ br %r14 # return
|
||||||
|
+ .align 8
|
||||||
|
+3:
|
||||||
|
+ .long 0x020a0000,0x80000000+1b # enabled wait psw
|
||||||
|
+4:
|
||||||
|
+ .long 0x00080000,0x80000000+2b # io new psw
|
||||||
|
+
|
||||||
|
#
|
||||||
|
# Start I/O
|
||||||
|
-# %r2 : device subchannel id
|
||||||
|
+#
|
||||||
|
+# Attempt to start I/O defined by ORB on specified subchannel. Retry I/O
|
||||||
|
+# 256 times per path (recommended error recovery procedure for IFCCs) unless
|
||||||
|
+# a permanent path error condition is indicated. Try all paths twice to try to
|
||||||
|
+# work around "link flapping" (paths going down once each in the same order as
|
||||||
|
+# they are tried). Perform CLEAR SUBCHANNEL when switching paths to clear any
|
||||||
|
+# improper subchannel status.
|
||||||
|
+#
|
||||||
|
+# %r2 : subchannel id
|
||||||
|
# %r3 : address of orb
|
||||||
|
# %r4 : address of irb
|
||||||
|
-# %r5 : retry count
|
||||||
|
#
|
||||||
|
_ssch:
|
||||||
|
- stm %r6,%r15,24(%r15)
|
||||||
|
- basr %r13,0 # base register
|
||||||
|
-0: s %r15,6f-0b(%r13) # create stack frame
|
||||||
|
- lr %r12,%r2 # save subchannel id
|
||||||
|
- lr %r11,%r3 # save orb
|
||||||
|
- lr %r10,%r4 # save irb
|
||||||
|
- lr %r9,%r5 # save retry count
|
||||||
|
- ic %r0,.Llpm-0b(%r13) # copy lpm to orb lpm
|
||||||
|
- stc %r0,6(%r3)
|
||||||
|
-1: lr %r1,%r12
|
||||||
|
- ssch 0(%r11) # go
|
||||||
|
- bnz 4f-0b(%r13) # houston, we have a problem
|
||||||
|
-2: lr %r2,%r12 # call _wait4de with subchannel id
|
||||||
|
- lr %r3,%r10 # and irb address as parameters
|
||||||
|
- bas %r14,_wait4de-0b(%r13) # wait until DE or error
|
||||||
|
- tm 9(%r10),0xff # test channel status
|
||||||
|
- bnz 4f-0b(%r13)
|
||||||
|
- tm 8(%r10),0xf3 # test device status
|
||||||
|
- bz 5f-0b(%r13)
|
||||||
|
- bct %r9,1b-0b(%r13) # something went wrong, retry.
|
||||||
|
-4: l %r2,7f-0b(%r13)
|
||||||
|
- bas %r4,_panik-0b(%r13) # won't return
|
||||||
|
-5: lm %r6,%r15,120(%r15)
|
||||||
|
- br %r14
|
||||||
|
-6: .long 96
|
||||||
|
-7: .long ESSCH
|
||||||
|
+ stm %r6,%r15,24(%r15)
|
||||||
|
+ basr %r13,0 # get base register
|
||||||
|
+0:
|
||||||
|
+ ahi %r15,-96 # create stack frame
|
||||||
|
+ lr %r6,%r2 # r6: sid
|
||||||
|
+ lr %r7,%r3 # r7: orb
|
||||||
|
+ lr %r8,%r4 # r8: irb
|
||||||
|
+ sr %r9,%r9 # r9: initial lpm
|
||||||
|
+ ic %r9,.Llpm-0b(%r13)
|
||||||
|
+ l %r10,.Lmask-0b(%r13) # r10: path mask
|
||||||
|
+1: # restart_all
|
||||||
|
+ lhi %r11,256 # r11: retry counter
|
||||||
|
+2: # restart
|
||||||
|
+ stc %r9,6(%r7) # store initial lpm in orb
|
||||||
|
+ ltr %r9,%r9 # if non-zero initial lpm
|
||||||
|
+ jne 3f # then use initial lpm
|
||||||
|
+ stc %r10,6(%r7) # else use current path mask
|
||||||
|
+3: # gotlpm
|
||||||
|
+ lr %r1,%r6 # get sid
|
||||||
|
+ ssch 0(%r7) # start subchannel
|
||||||
|
+ brc 1,7f # if cc==3 goto next_path
|
||||||
|
+ brc 7,6f # if cc!=0 goto retry
|
||||||
|
+4: # wait_for_int_loop
|
||||||
|
+ lr %r2,%r6 # get sid
|
||||||
|
+ lr %r3,%r8 # get irb
|
||||||
|
+ bras %r14,_wait_for_int # wait for interrupt
|
||||||
|
+ jnz 9f # if cc!=0 goto panic
|
||||||
|
+ tm 0(%r8),0x3 # test irb deferred cc
|
||||||
|
+ brc 1,7f # if cc==3 goto next_path
|
||||||
|
+ jz 5f # if cc==0 goto no_stctl_check
|
||||||
|
+ tm 3(%r8),0x10 # test irb status control
|
||||||
|
+ jnz 6f # if alert goto retry
|
||||||
|
+5: # no_stctl_check
|
||||||
|
+ tm 9(%r8),0xff # test irb subchannel status
|
||||||
|
+ jnz 6f # if status!=0 goto retry
|
||||||
|
+ tm 8(%r8),0xf3 # test irb unusual device status
|
||||||
|
+ jnz 6f # if status!=0 goto retry
|
||||||
|
+ tm 8(%r8),0x4 # test irb device end
|
||||||
|
+ jz 4b # if !device_end goto wait_for_int_loop
|
||||||
|
+ lm %r6,%r15,120(%r15)
|
||||||
|
+ br %r14 # return
|
||||||
|
+
|
||||||
|
+6: # retry
|
||||||
|
+ lr %r1,%r6 # get sid
|
||||||
|
+ tsch 0(%r8) # clear status if necessary
|
||||||
|
+ brct %r11,2b # if --retries>0 goto restart
|
||||||
|
+7: # next_path
|
||||||
|
+ ltr %r9,%r9 # if initial lpm != 0
|
||||||
|
+ jnz 8f # then goto noshift
|
||||||
|
+ srl %r10,1 # path_mask >>= 1
|
||||||
|
+ ltr %r10,%r10 # if path_mask==0
|
||||||
|
+ jz 9f # then goto panic
|
||||||
|
+8: # noshift
|
||||||
|
+ sr %r9,%r9 # clear initial lpm
|
||||||
|
+ lr %r1,%r6 # get sid
|
||||||
|
+ csch # clear subchannel
|
||||||
|
+ brc 7,9f # if cc!=0 goto panic
|
||||||
|
+ lr %r2,%r6 # get sid
|
||||||
|
+ lr %r3,%r8 # get irb
|
||||||
|
+ bras %r14,_wait_for_int # wait for interrupt
|
||||||
|
+ j 1b # goto restart_all
|
||||||
|
+9: # panic
|
||||||
|
+ l %r2,.Lerrno-0b(%r13) # get error code
|
||||||
|
+ bras %r14,_panik # panic
|
||||||
|
+
|
||||||
|
+.Lerrno:
|
||||||
|
+ .long ESSCH
|
||||||
|
+.Lmask:
|
||||||
|
+ .long 0x8080
|
||||||
|
.Llpm:
|
||||||
|
- .byte 0xff
|
||||||
|
+ .byte 0x00
|
||||||
|
.align 2
|
||||||
|
|
||||||
|
#
|
||||||
|
-# Wait for interrupt subroutine
|
||||||
|
-# %r2 : device subchannel id
|
||||||
|
-# %r3 : address of irb
|
||||||
|
-#
|
||||||
|
-_wait4de:
|
||||||
|
- lr %r1,%r2
|
||||||
|
- basr %r4,0
|
||||||
|
-0: mvc 0x78(8),5f-0b(%r4) # set i/o new psw
|
||||||
|
-1: lpsw 4f-0b(%r4)
|
||||||
|
-2: c %r1,0xb8 # compare subchannel id
|
||||||
|
- bne 1b-0b(%r4) # unequal -> continue waiting
|
||||||
|
- tsch 0(%r3)
|
||||||
|
- tm 9(%r3),0xff # test channel status
|
||||||
|
- bnz 3f-0b(%r4)
|
||||||
|
- tm 8(%r3),0xf3 # got something unusual ?
|
||||||
|
- bnz 3f-0b(%r4)
|
||||||
|
- tm 8(%r3),0x04 # got device end ?
|
||||||
|
- bz 1b-0b(%r4) # still busy -> continue waiting
|
||||||
|
-3: br %r14
|
||||||
|
- .align 8
|
||||||
|
-4: .long 0x020a0000,0x80000000+1b
|
||||||
|
-5: .long 0x00080000,0x80000000+2b # io new psw
|
||||||
|
-
|
||||||
|
-#
|
||||||
|
# Panik routine. Loads a disabled wait psw
|
||||||
|
# %r2 : panik code
|
||||||
|
#
|
||||||
|
diff --git a/zipl/boot/eckd2.S b/zipl/boot/eckd2.S
|
||||||
|
index ba71db9..b59ab0e 100644
|
||||||
|
--- a/zipl/boot/eckd2.S
|
||||||
|
+++ b/zipl/boot/eckd2.S
|
||||||
|
@@ -85,7 +85,6 @@ _load_direct:
|
||||||
|
la %r3,.Lorb-.Lbase(%r13) # pass address of orb
|
||||||
|
la %r4,.Lirb-.Lbase(%r13) # and pass address of irb
|
||||||
|
lr %r2,%r11 # pass subchannel id
|
||||||
|
- la %r5,5 # 5 retries
|
||||||
|
bas %r14,_ssch-.Lbase(%r13) # read records
|
||||||
|
.Lexit:
|
||||||
|
lr %r2,%r12 # return updated load address
|
||||||
|
diff --git a/zipl/boot/fba2.S b/zipl/boot/fba2.S
|
||||||
|
index 82b1447..90bb2cd 100644
|
||||||
|
--- a/zipl/boot/fba2.S
|
||||||
|
+++ b/zipl/boot/fba2.S
|
||||||
|
@@ -98,7 +98,6 @@ _load_direct:
|
||||||
|
lr %r2,%r11 # pass subchannel id
|
||||||
|
la %r3,.Lorb-.Lbase(%r13) # pass address of orb
|
||||||
|
la %r4,.Lirb-.Lbase(%r13) # and pass address of irb
|
||||||
|
- la %r5,5 # 5 retries
|
||||||
|
bas %r14,_ssch-.Lbase(%r13) # read up to 128 blocks
|
||||||
|
b .Lmain-.Lbase(%r13)
|
||||||
|
.Lexit: lr %r2,%r12 # return updated load address
|
||||||
|
--
|
||||||
|
1.6.6
|
||||||
|
|
39
0025-vmconvert-shows-garbage-in-progress-bar.patch
Normal file
39
0025-vmconvert-shows-garbage-in-progress-bar.patch
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
From 04859d2270d1327873e1e8825bdd9d0eaf73f5cc Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Wed, 10 Mar 2010 11:52:18 +0100
|
||||||
|
Subject: [PATCH] vmconvert shows garbage in progress bar
|
||||||
|
|
||||||
|
Description: vmconvert: Progress bar shows garbage
|
||||||
|
Symptom: The progress bar shows control characters at end of line.
|
||||||
|
Problem: One variable responsible for the progress bar has not been
|
||||||
|
initialized.
|
||||||
|
Solution: Initialize variable.
|
||||||
|
---
|
||||||
|
vmconvert/dump.cpp | 3 ++-
|
||||||
|
1 files changed, 2 insertions(+), 1 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/vmconvert/dump.cpp b/vmconvert/dump.cpp
|
||||||
|
index f306b27..b4c97d6 100644
|
||||||
|
--- a/vmconvert/dump.cpp
|
||||||
|
+++ b/vmconvert/dump.cpp
|
||||||
|
@@ -46,8 +46,8 @@ ProgressBar::initProgress(void)
|
||||||
|
void
|
||||||
|
ProgressBar::displayProgress(uint64_t value, uint64_t maxValue)
|
||||||
|
{
|
||||||
|
+ char progress_bar[51];
|
||||||
|
int j;
|
||||||
|
- char progress_bar[50];
|
||||||
|
|
||||||
|
if (progressPercentage == (int) (value * 100 / maxValue))
|
||||||
|
fprintf(stderr, "%6lld of %6lld |\r",
|
||||||
|
@@ -58,6 +58,7 @@ ProgressBar::displayProgress(uint64_t value, uint64_t maxValue)
|
||||||
|
progress_bar[j] = '#';
|
||||||
|
for (j = progressPercentage / 2; j < 50; j++)
|
||||||
|
progress_bar[j] = '-';
|
||||||
|
+ progress_bar[50] = 0;
|
||||||
|
fprintf(stderr, "%6lld of %6lld |%s| %3d%% \r",
|
||||||
|
(long long) value, (long long) maxValue,
|
||||||
|
progress_bar, progressPercentage);
|
||||||
|
--
|
||||||
|
1.6.6.1
|
||||||
|
|
32
0026-zipl-zfcp-dump-partition-error.patch
Normal file
32
0026-zipl-zfcp-dump-partition-error.patch
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
From 18bc3ce1055c350aaa50696e53baad984f573697 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Thu, 11 Mar 2010 08:34:32 +0100
|
||||||
|
Subject: [PATCH] zipl: zfcp dump partition error
|
||||||
|
|
||||||
|
Description: zipl: zfcp dump partition error
|
||||||
|
Symptom: When configuring the zfcp dump partition in zipl.conf the
|
||||||
|
partition information may be wrong.
|
||||||
|
Problem: The info data structure is used after it was freed.
|
||||||
|
Solution: Free the info structure when it is not used any more.
|
||||||
|
---
|
||||||
|
zipl/src/bootmap.c | 2 +-
|
||||||
|
1 files changed, 1 insertions(+), 1 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/zipl/src/bootmap.c b/zipl/src/bootmap.c
|
||||||
|
index 526aa48..043a562 100644
|
||||||
|
--- a/zipl/src/bootmap.c
|
||||||
|
+++ b/zipl/src/bootmap.c
|
||||||
|
@@ -689,9 +689,9 @@ get_dump_fs_parmline(char* partition, char* parameters, uint64_t mem,
|
||||||
|
disk_free_info(info);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
- disk_free_info(info);
|
||||||
|
buffer = create_dump_fs_parmline(parameters, "/dev/ram0", info->partnum,
|
||||||
|
mem, 1);
|
||||||
|
+ disk_free_info(info);
|
||||||
|
if (buffer == NULL)
|
||||||
|
return -1;
|
||||||
|
*result = buffer;
|
||||||
|
--
|
||||||
|
1.6.6.1
|
||||||
|
|
34
0027-zfcpdump-disable-memory-cgroups.patch
Normal file
34
0027-zfcpdump-disable-memory-cgroups.patch
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
From cc672d10ef6ee3da060649fa595ed9d980e5e60e Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Mon, 22 Mar 2010 12:58:13 +0100
|
||||||
|
Subject: [PATCH] zfcpdump - disable memory cgroups
|
||||||
|
|
||||||
|
Description: zipl/zfcpdump: Use "cgroup_disable=memory" kernel parameter
|
||||||
|
Symptom: Out of memory kernel panic during SCSI dump.
|
||||||
|
Problem: The zfcpdump kernel has to run within a 32 MB limit. When
|
||||||
|
using "memory cgroups" about 2.6 MB are allocated, which leads
|
||||||
|
to memory problems for zfcpdump.
|
||||||
|
Solution: For zfcpdump we do not need "memory cgroups". Therefore this patch
|
||||||
|
adds the kernel parameter "cgroup_disable=memory" to save 2.5 MB
|
||||||
|
of memory.
|
||||||
|
---
|
||||||
|
zipl/src/bootmap.c | 3 ++-
|
||||||
|
1 files changed, 2 insertions(+), 1 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/zipl/src/bootmap.c b/zipl/src/bootmap.c
|
||||||
|
index 043a562..69f721e 100644
|
||||||
|
--- a/zipl/src/bootmap.c
|
||||||
|
+++ b/zipl/src/bootmap.c
|
||||||
|
@@ -653,7 +653,8 @@ create_dump_fs_parmline(const char* parmline, const char* root_dev,
|
||||||
|
if (!result)
|
||||||
|
return NULL;
|
||||||
|
snprintf(result, DUMP_PARAM_MAX_LEN, "%s%sroot=%s dump_part=%d "
|
||||||
|
- "dump_mem=%lld maxcpus=%d", parmline ? parmline : "",
|
||||||
|
+ "dump_mem=%lld maxcpus=%d cgroup_disable=memory",
|
||||||
|
+ parmline ? parmline : "",
|
||||||
|
parmline ? " " : "", root_dev, part_num,
|
||||||
|
(unsigned long long) mem, max_cpus);
|
||||||
|
result[DUMP_PARAM_MAX_LEN - 1] = 0;
|
||||||
|
--
|
||||||
|
1.6.6.1
|
||||||
|
|
29
0028-fix-df-usage-in-ziomon.patch
Normal file
29
0028-fix-df-usage-in-ziomon.patch
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
From b0238ed360f65ecbf095d89c43c420ed036e4ff0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Mon, 22 Mar 2010 15:21:55 +0100
|
||||||
|
Subject: [PATCH] fix df usage in ziomon
|
||||||
|
|
||||||
|
Description: ziomon: Fix 'df' command usage
|
||||||
|
Symptom: Long device names could not be parsed properly.
|
||||||
|
Problem: Long device names were split accross multiple lines.
|
||||||
|
Solution: Use df with the right options.
|
||||||
|
---
|
||||||
|
ziomon/ziomon | 2 +-
|
||||||
|
1 files changed, 1 insertions(+), 1 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/ziomon/ziomon b/ziomon/ziomon
|
||||||
|
index 924c1dd..ea910fc 100755
|
||||||
|
--- a/ziomon/ziomon
|
||||||
|
+++ b/ziomon/ziomon
|
||||||
|
@@ -709,7 +709,7 @@ function check_size_requirements() {
|
||||||
|
(( estimated_size=$total_num_records * $size_per_record ));
|
||||||
|
debug " estimated size: $estimated_size Bytes";
|
||||||
|
(( estimated_size=$estimated_size / 1000000 ));
|
||||||
|
- (( free_space = `df -k $logpath | tail -n 1 | awk '{print $4}'` / 1024 ));
|
||||||
|
+ free_space=`df -mP $logpath | tail -n 1 | awk '{print $4}'`;
|
||||||
|
debug " free space on '$logpath': $free_space MBytes";
|
||||||
|
if [ "$WRP_SIZE" == "" ]; then
|
||||||
|
echo "NOTE: No size limit specified, run without a limit.";
|
||||||
|
--
|
||||||
|
1.6.6.1
|
||||||
|
|
102
0029-ziomon-remove-check-for-ziorep_config-availability.patch
Normal file
102
0029-ziomon-remove-check-for-ziorep_config-availability.patch
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
From 2ec256f9dab30a57f60c83f7cd9b127c25b6cdd6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Thu, 25 Mar 2010 14:11:31 +0100
|
||||||
|
Subject: [PATCH] ziomon: remove check for ziorep_config availability
|
||||||
|
|
||||||
|
Description: ziomon: Remove check for ziorep_config availability
|
||||||
|
Symptom: ziorep_config could not be found
|
||||||
|
Problem: The path for ziorep_config was hardcoded and checked
|
||||||
|
for to detect install errors. However, as distributions
|
||||||
|
install these files in varying directories, install issues
|
||||||
|
should be avoided by distributors to begin with, and
|
||||||
|
especially since the debug trace helps to detect these,
|
||||||
|
this check is not really necessary and obviously causing
|
||||||
|
more harm than it helps.
|
||||||
|
Solution: Config is read from PATH.
|
||||||
|
---
|
||||||
|
ziomon/ziorep_cfgreader.cpp | 24 +++++-------------------
|
||||||
|
ziomon/ziorep_cfgreader.hpp | 2 --
|
||||||
|
2 files changed, 5 insertions(+), 21 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/ziomon/ziorep_cfgreader.cpp b/ziomon/ziorep_cfgreader.cpp
|
||||||
|
index c64c150..a8f424f 100644
|
||||||
|
--- a/ziomon/ziorep_cfgreader.cpp
|
||||||
|
+++ b/ziomon/ziorep_cfgreader.cpp
|
||||||
|
@@ -18,7 +18,7 @@
|
||||||
|
#include "ziorep_utils.hpp"
|
||||||
|
|
||||||
|
#define ZIOREP_CFG_EXTENSION ".cfg"
|
||||||
|
-#define ZIOREP_CONFIG_PATH "/sbin/ziorep_config"
|
||||||
|
+#define ZIOREP_CONFIG "ziorep_config"
|
||||||
|
|
||||||
|
extern const char *toolname;
|
||||||
|
extern int verbose;
|
||||||
|
@@ -158,18 +158,6 @@ int ConfigReader::filter_unused_devices(const char *filename)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
-int ConfigReader::check_ziorep_config() const
|
||||||
|
-{
|
||||||
|
- if (access(ZIOREP_CONFIG_PATH, F_OK | R_OK | X_OK)) {
|
||||||
|
- fprintf(stderr, "%s: Cannot access " ZIOREP_CONFIG_PATH
|
||||||
|
- ". Please check your installation and try again.\n", toolname);
|
||||||
|
- return -1;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- return 0;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-
|
||||||
|
int ConfigReader::check_config_file(const char *fname) const
|
||||||
|
{
|
||||||
|
char *tmp;
|
||||||
|
@@ -204,8 +192,6 @@ int ConfigReader::extract_config_data(const char *fname)
|
||||||
|
|
||||||
|
// Try to extract to .config first, which will be permanently cached
|
||||||
|
verbose_msg("No data cached, extract\n");
|
||||||
|
- if (check_ziorep_config())
|
||||||
|
- return -1;
|
||||||
|
|
||||||
|
fprintf(stdout, "Extracting config data...");
|
||||||
|
fflush(stdout);
|
||||||
|
@@ -215,8 +201,8 @@ int ConfigReader::extract_config_data(const char *fname)
|
||||||
|
if (extract_tmp(fname)) {
|
||||||
|
fprintf(stderr, "%s: Could not extract"
|
||||||
|
" configuration data. Check the integrity of"
|
||||||
|
- " %s%s with %s and retry.", toolname, fname,
|
||||||
|
- ZIOREP_CFG_EXTENSION, ZIOREP_CONFIG_PATH);
|
||||||
|
+ " %s%s with %s and retry.\n", toolname, fname,
|
||||||
|
+ ZIOREP_CFG_EXTENSION, ZIOREP_CONFIG);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -286,11 +272,11 @@ int ConfigReader::extract(const char *fname)
|
||||||
|
char *cmd = NULL;
|
||||||
|
|
||||||
|
// /sbin/ziorep_config -I -i <fname.cfg> > <file> 2>/dev/null
|
||||||
|
- cmd = (char*)malloc(strlen(ZIOREP_CONFIG_PATH) + 7 + strlen(fname)
|
||||||
|
+ cmd = (char*)malloc(strlen(ZIOREP_CONFIG) + 7 + strlen(fname)
|
||||||
|
+ strlen(ZIOREP_CFG_EXTENSION) + 3 + strlen(m_tmp_file)
|
||||||
|
+ 12 + 1);
|
||||||
|
|
||||||
|
- sprintf(cmd, "%s -I -i %s%s > %s 2>/dev/null", ZIOREP_CONFIG_PATH, fname,
|
||||||
|
+ sprintf(cmd, "%s -I -i %s%s > %s 2>/dev/null", ZIOREP_CONFIG, fname,
|
||||||
|
ZIOREP_CFG_EXTENSION, m_tmp_file);
|
||||||
|
|
||||||
|
verbose_msg("Issue command: %s\n", cmd);
|
||||||
|
diff --git a/ziomon/ziorep_cfgreader.hpp b/ziomon/ziorep_cfgreader.hpp
|
||||||
|
index 94e612b..3053633 100644
|
||||||
|
--- a/ziomon/ziorep_cfgreader.hpp
|
||||||
|
+++ b/ziomon/ziorep_cfgreader.hpp
|
||||||
|
@@ -138,8 +138,6 @@ private:
|
||||||
|
* in the actual data, and remove anything that is unused */
|
||||||
|
int filter_unused_devices(const char *filename);
|
||||||
|
|
||||||
|
- int check_ziorep_config() const;
|
||||||
|
-
|
||||||
|
int check_config_file(const char *fname) const;
|
||||||
|
|
||||||
|
int extract_config_data(const char *fname);
|
||||||
|
--
|
||||||
|
1.6.6.1
|
||||||
|
|
46
0030-ziomon-fix-multipathing.patch
Normal file
46
0030-ziomon-fix-multipathing.patch
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
From 3aa5fa943cea0f01beb63c90a5b0255a797ac117 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Wed, 31 Mar 2010 10:19:50 +0200
|
||||||
|
Subject: [PATCH] ziomon - fix multipathing
|
||||||
|
|
||||||
|
Description: ziomon: Fix problem with multipath command output
|
||||||
|
Symptom: Number of LUNs does not mach number of devices: E.g. 12 devices
|
||||||
|
and 10 LUNs.
|
||||||
|
Problem: Some version of the multipath command use characters that can
|
||||||
|
break parsing of its output.
|
||||||
|
Solution: Use proper parsing of the multipath -l output.
|
||||||
|
---
|
||||||
|
ziomon/ziomon | 16 ++++++++--------
|
||||||
|
1 files changed, 8 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/ziomon/ziomon b/ziomon/ziomon
|
||||||
|
index ea910fc..b4c6e36 100755
|
||||||
|
--- a/ziomon/ziomon
|
||||||
|
+++ b/ziomon/ziomon
|
||||||
|
@@ -499,15 +499,15 @@ function check_for_multipath_devices() {
|
||||||
|
WRP_DEVICES[$j]="";
|
||||||
|
devices_basenames[$j]="";
|
||||||
|
clean_devices;
|
||||||
|
- (( i+=3 ));
|
||||||
|
+ (( i+=2 ));
|
||||||
|
while [[ ! "${mp_arr[$i]:0:1}" =~ "[0-9a-zA-Z]" ]] && [ $i -lt ${#mp_arr[@]} ]; do
|
||||||
|
- checked_devs[${#checked_devs[@]}]=`echo ${mp_arr[$i]} | awk '{print "/dev/"$3}'`;
|
||||||
|
- ddebug " add ${checked_devs[${#checked_devs[@]}-1]}";
|
||||||
|
- line=${mp_arr[$i]#* };
|
||||||
|
- line=${line%%:*};
|
||||||
|
- line=`echo $line | sed 's/ //g'`;
|
||||||
|
- WRP_HOST_ADAPTERS[${#WRP_HOST_ADAPTERS[@]}]="host$line";
|
||||||
|
- WRP_LUNS[${#WRP_LUNS[@]}]=`echo ${mp_arr[$i]#* } | awk '{print $1}'`;
|
||||||
|
+ if [ `echo ${mp_arr[$i]} | grep -e "[0-9]\{1,\}:[0-9]\{1,\}:[0-9]\{1,\}:[0-9]\{1,\}" | wc -l` -ne 0 ]; then
|
||||||
|
+ line="`echo ${mp_arr[$i]} | sed 's/.*\([0-9]\{1,\}:[0-9]\{1,\}:[0-9]\{1,\}:[0-9]\{1,\}\)/\1/'`";
|
||||||
|
+ checked_devs[${#checked_devs[@]}]=`echo $line | awk '{print "/dev/"$2}'`;
|
||||||
|
+ ddebug " add ${checked_devs[${#checked_devs[@]}-1]}";
|
||||||
|
+ WRP_HOST_ADAPTERS[${#WRP_HOST_ADAPTERS[@]}]="host${line%%:*}";
|
||||||
|
+ WRP_LUNS[${#WRP_LUNS[@]}]=`echo $line | awk '{print $1}'`;
|
||||||
|
+ fi
|
||||||
|
(( i++ ));
|
||||||
|
done;
|
||||||
|
(( --i ));
|
||||||
|
--
|
||||||
|
1.6.6.1
|
||||||
|
|
66
0031-mismatch-between-man-and-h-in-chshut.patch
Normal file
66
0031-mismatch-between-man-and-h-in-chshut.patch
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
From 37e697ae95b3c03f962ac7bb2dd591f00b6de87b Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Wed, 28 Apr 2010 10:24:41 +0200
|
||||||
|
Subject: [PATCH] mismatch between man and -h in chshut
|
||||||
|
|
||||||
|
Description: chshut: Mismatch between man and -h
|
||||||
|
Symptom: Option -h stills show "panic" as a valid state.
|
||||||
|
Problem: Although it should not be used it is possible to use the
|
||||||
|
command with a "panic" state.
|
||||||
|
Solution: Remove "panic" from the list of valid states.
|
||||||
|
Provide an explanatory message in case it is used anyhow.
|
||||||
|
---
|
||||||
|
ipl_tools/getopt.c | 11 -----------
|
||||||
|
ipl_tools/sa.c | 7 +++++--
|
||||||
|
2 files changed, 5 insertions(+), 13 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/ipl_tools/getopt.c b/ipl_tools/getopt.c
|
||||||
|
index abd0cc2..d729379 100644
|
||||||
|
--- a/ipl_tools/getopt.c
|
||||||
|
+++ b/ipl_tools/getopt.c
|
||||||
|
@@ -60,7 +60,6 @@ const char *const usage_sa =
|
||||||
|
" halt System has been shut down (e.g. shutdown -h -H now)\n"
|
||||||
|
" poff System has been shut down for power off (e.g. shutdown -h -P now)\n"
|
||||||
|
" reboot System has been shut down for reboot (e.g. shutdown -r)\n"
|
||||||
|
-" panic System has been shut down after a kernel panic\n"
|
||||||
|
" Note: Depending on the distribution, \"halt\" might be mapped to \"poff\".\n"
|
||||||
|
"\n"
|
||||||
|
"ACTION specifies the action to be performed:\n"
|
||||||
|
@@ -638,16 +637,6 @@ void parse_shutdown_options(int argc, char **argv)
|
||||||
|
"/sys/firmware/vmcmd/on_reboot");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
- case 3:
|
||||||
|
- rc = strwrt(argv[2],
|
||||||
|
- "/sys/firmware/shutdown_actions/on_panic");
|
||||||
|
- if (action == 4 && rc == 0) {
|
||||||
|
- /*rc = ustrwrt(argv[3],
|
||||||
|
- "/sys/firmware/vmcmd/on_reboot"); */
|
||||||
|
- rc = ustrwrt(argv[3],
|
||||||
|
- "/sys/firmware/vmcmd/on_panic");
|
||||||
|
- }
|
||||||
|
- break;
|
||||||
|
}
|
||||||
|
if (rc != 0) {
|
||||||
|
fprintf(stderr, "%s: Failed to change shutdown"
|
||||||
|
diff --git a/ipl_tools/sa.c b/ipl_tools/sa.c
|
||||||
|
index 0232a47..d6b72bb 100644
|
||||||
|
--- a/ipl_tools/sa.c
|
||||||
|
+++ b/ipl_tools/sa.c
|
||||||
|
@@ -83,8 +83,11 @@ int is_valid_case(char *action)
|
||||||
|
rc = 1;
|
||||||
|
if (strncmp(action, "reboot", 6) >= 0 && length == 6)
|
||||||
|
rc = 2;
|
||||||
|
- if (strncmp(action, "panic", 5) >= 0 && length == 5)
|
||||||
|
- rc = 3;
|
||||||
|
+ if (strncmp(action, "panic", 5) >= 0 && length == 5) {
|
||||||
|
+ fprintf(stderr, "%s: Please use \"service dumpconf\" for "
|
||||||
|
+ "configuring the panic action\n", name);
|
||||||
|
+ exit(1);
|
||||||
|
+ }
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
1.6.6.1
|
||||||
|
|
48
0032-lsdasd-update-man-page.patch
Normal file
48
0032-lsdasd-update-man-page.patch
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
From c3fc4200d7913b50fb8b501681a0f44e51833a81 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Wed, 28 Apr 2010 20:57:17 +0200
|
||||||
|
Subject: [PATCH] lsdasd - update man page
|
||||||
|
|
||||||
|
Description: lsdasd: add missing description of option -b to man page
|
||||||
|
Symptom: Option -b/--base is described in lsdasd --help, but not in
|
||||||
|
the respective man page.
|
||||||
|
Problem: Man page is missing the description.
|
||||||
|
Solution: Add description.
|
||||||
|
---
|
||||||
|
zconf/lsdasd.8 | 6 +++++-
|
||||||
|
1 files changed, 5 insertions(+), 1 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/zconf/lsdasd.8 b/zconf/lsdasd.8
|
||||||
|
index f37c957..9c13644 100644
|
||||||
|
--- a/zconf/lsdasd.8
|
||||||
|
+++ b/zconf/lsdasd.8
|
||||||
|
@@ -10,6 +10,7 @@ lsdasd \- list channel attached direct access storage devices (DASD).
|
||||||
|
.TP 8
|
||||||
|
.B lsdasd
|
||||||
|
.RB [ -a ]
|
||||||
|
+.RB [ -b ]
|
||||||
|
.RB [ -s ]
|
||||||
|
.RB [ -v ]
|
||||||
|
.RB [ -l ]
|
||||||
|
@@ -19,7 +20,7 @@ lsdasd \- list channel attached direct access storage devices (DASD).
|
||||||
|
.RI [ <bus-ID> " [" <bus-ID> "] ...]]"
|
||||||
|
|
||||||
|
.SH DESCRIPTION
|
||||||
|
-The lsdasd command provides an overview of available DASD devices.
|
||||||
|
+The lsdasd command provides an overview of available DASD devices.
|
||||||
|
|
||||||
|
.SH OPTIONS
|
||||||
|
.TP 8
|
||||||
|
@@ -32,6 +33,9 @@ Supresses leading "0.0." for bus IDs.
|
||||||
|
.BR -a | --offline
|
||||||
|
Include all (offline) devices.
|
||||||
|
.TP
|
||||||
|
+.BR -b | --base
|
||||||
|
+Include only base devices.
|
||||||
|
+.TP
|
||||||
|
.BR -c | --compat
|
||||||
|
Old output of lsdasd for compatibility.
|
||||||
|
.TP
|
||||||
|
--
|
||||||
|
1.6.6.1
|
||||||
|
|
79
0033-reinitialize-array-in-lsqeth.patch
Normal file
79
0033-reinitialize-array-in-lsqeth.patch
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
From edd35870b833548853b4c739cee1a7c0bce1fa55 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Mon, 3 May 2010 10:14:08 +0200
|
||||||
|
Subject: [PATCH] reinitialize array in lsqeth
|
||||||
|
|
||||||
|
Description: lsqeth: add clearing of print array for every qeth device
|
||||||
|
Symptom: lsqeth without parameters displays information of all qeth
|
||||||
|
devices. For layer2 devices information from a previously
|
||||||
|
displayed layer3 device may show up.
|
||||||
|
Problem: A structure used for printing is not cleared after
|
||||||
|
information for the previous device is written.
|
||||||
|
Solution: Add clearing of print array before collecting display
|
||||||
|
information for a single qeth device..
|
||||||
|
---
|
||||||
|
README | 3 +++
|
||||||
|
zconf/lsqeth | 18 ++++++++++++++++--
|
||||||
|
2 files changed, 19 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/README b/README
|
||||||
|
index 7c75563..ffd5e54 100644
|
||||||
|
--- a/README
|
||||||
|
+++ b/README
|
||||||
|
@@ -253,6 +253,9 @@ Release History:
|
||||||
|
Fix printing of vmcmd shutdown action: Also print CP commands that
|
||||||
|
have more than one word.
|
||||||
|
|
||||||
|
+ - lsqeth:
|
||||||
|
+ * clear print array for every device displayed
|
||||||
|
+
|
||||||
|
- all:
|
||||||
|
Fixed a lot of build warnings and minor bugs.
|
||||||
|
|
||||||
|
diff --git a/zconf/lsqeth b/zconf/lsqeth
|
||||||
|
index b1c2809..19d49cd 100755
|
||||||
|
--- a/zconf/lsqeth
|
||||||
|
+++ b/zconf/lsqeth
|
||||||
|
@@ -168,6 +168,19 @@ fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
+#
|
||||||
|
+# initialize format_array_print
|
||||||
|
+#
|
||||||
|
+function __init_format_array_print
|
||||||
|
+{
|
||||||
|
+ local k=0
|
||||||
|
+
|
||||||
|
+ while [ $k -lt ${#output_array[@]} ];
|
||||||
|
+ do
|
||||||
|
+ format_array_print[$k]=''
|
||||||
|
+ k=$((k+1))
|
||||||
|
+ done
|
||||||
|
+}
|
||||||
|
|
||||||
|
#
|
||||||
|
# search value in format_array
|
||||||
|
@@ -309,9 +322,9 @@ function __print_normal_format
|
||||||
|
#
|
||||||
|
function __layer2_print
|
||||||
|
{
|
||||||
|
- del_layer2=( route4 route6
|
||||||
|
+ del_layer2=( route4 route6 large_send
|
||||||
|
fake_ll fake_broadcast
|
||||||
|
- sniffer )
|
||||||
|
+ checksumming sniffer )
|
||||||
|
|
||||||
|
for l in ${del_layer2[@]}
|
||||||
|
do
|
||||||
|
@@ -358,6 +371,7 @@ fi
|
||||||
|
#
|
||||||
|
for k in ${device_list}
|
||||||
|
do
|
||||||
|
+ __init_format_array_print
|
||||||
|
if_name="`cat $device_dir/$k/if_name`"
|
||||||
|
if [ -z "$if_name" ]; then
|
||||||
|
if_name=0
|
||||||
|
--
|
||||||
|
1.6.6.1
|
||||||
|
|
50
0034-check-the-length-of-the-parameters-line.patch
Normal file
50
0034-check-the-length-of-the-parameters-line.patch
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
From 78a9e00a3a9885298f09079c026bf5415c137cca Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Thu, 20 May 2010 16:19:17 +0200
|
||||||
|
Subject: [PATCH] check the length of the parameters line
|
||||||
|
|
||||||
|
The value of the parameters variable in zipl.conf that is passed as to the kernel
|
||||||
|
into /proc/cmdline is silently truncated to 896 bytes (it matches the value of
|
||||||
|
BOOT_PARM_LENGTH from boot/menu.S). Thus we add a check into zipl and end with
|
||||||
|
an error if the line is longer.
|
||||||
|
---
|
||||||
|
zipl/include/zipl.h | 3 +++
|
||||||
|
zipl/src/job.c | 8 ++++++++
|
||||||
|
2 files changed, 11 insertions(+), 0 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/zipl/include/zipl.h b/zipl/include/zipl.h
|
||||||
|
index d2d26dd..5e02f13 100644
|
||||||
|
--- a/zipl/include/zipl.h
|
||||||
|
+++ b/zipl/include/zipl.h
|
||||||
|
@@ -40,6 +40,9 @@
|
||||||
|
|
||||||
|
#define MAX_DUMP_VOLUMES 32
|
||||||
|
|
||||||
|
+/* defined in boot/menu.S as MENU_PARM_LENGTH */
|
||||||
|
+#define PARMLINE_LENGTH 896
|
||||||
|
+
|
||||||
|
/* Internal component load address type */
|
||||||
|
typedef uint64_t address_t;
|
||||||
|
|
||||||
|
diff --git a/zipl/src/job.c b/zipl/src/job.c
|
||||||
|
index a65e8c1..76ed5df 100644
|
||||||
|
--- a/zipl/src/job.c
|
||||||
|
+++ b/zipl/src/job.c
|
||||||
|
@@ -894,6 +894,14 @@ get_parmline(char* filename, char* line, char** parmline, address_t* address,
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
} else result = NULL;
|
||||||
|
+ /* check the maximum possible length */
|
||||||
|
+ if (result) {
|
||||||
|
+ len = strlen(result);
|
||||||
|
+ if (len > PARMLINE_LENGTH) {
|
||||||
|
+ error_text("The length of parameters line (%d bytes) exceeds the allowed maximum (%d bytes)", len, PARMLINE_LENGTH);
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
*parmline = result;
|
||||||
|
*address = addr;
|
||||||
|
return 0;
|
||||||
|
--
|
||||||
|
1.6.6.1
|
||||||
|
|
28
0035-ziorep-follow-symlink.patch
Normal file
28
0035-ziorep-follow-symlink.patch
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
From fabce87ca9d586e6da7ed0bd371f2102408c721c Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Fri, 4 Jun 2010 12:05:19 +0200
|
||||||
|
Subject: [PATCH 35/36] ziorep - follow symlink
|
||||||
|
|
||||||
|
Description: ziomon: fix the execution of stat <file> to follow symlinks.
|
||||||
|
Symptom: The device mapper report is failing with a script error.
|
||||||
|
Solution: Add parameter to stat <file> execution to follow symlinks.
|
||||||
|
---
|
||||||
|
ziomon/ziorep_config | 2 +-
|
||||||
|
1 files changed, 1 insertions(+), 1 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/ziomon/ziorep_config b/ziomon/ziorep_config
|
||||||
|
index de60379..f2ad35c 100755
|
||||||
|
--- a/ziomon/ziorep_config
|
||||||
|
+++ b/ziomon/ziorep_config
|
||||||
|
@@ -159,7 +159,7 @@ sub get_mapper_devices
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
my $tf = catfile($c_src, "$dev");
|
||||||
|
- my $mm = `stat -c%t:%T $tf`;
|
||||||
|
+ my $mm = `stat -L -c%t:%T $tf`;
|
||||||
|
chomp($mm);
|
||||||
|
$mm = join(":", map { hex($_) } split(":", $mm));
|
||||||
|
$mapper_dev{$mm} = $dev;
|
||||||
|
--
|
||||||
|
1.6.6.1
|
||||||
|
|
@ -0,0 +1,36 @@
|
|||||||
|
From 379f76e4084a0d1875e1f98b2d975600639f6574 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Fri, 4 Jun 2010 12:06:38 +0200
|
||||||
|
Subject: [PATCH 36/36] ts-shell: do not restrict group names to be alphanumeric
|
||||||
|
|
||||||
|
Description: ts-shell: do not restrict group names to be alphanumeric
|
||||||
|
Symptom: ts-shell does not add authorizations assigned to groups
|
||||||
|
which contain non-alphanumeric characters, for instance,
|
||||||
|
a hyphen (-) sign.
|
||||||
|
Problem: ts-shell uses a regular expression to parse group names.
|
||||||
|
This regular expression uses the alphanumeric character
|
||||||
|
class (\w) to match group names. Using group names like
|
||||||
|
"ts-user" are ignored, because hyphen signs are not
|
||||||
|
included in the alphanumeric character class.
|
||||||
|
Solution: Make the regular expression less restrictive through
|
||||||
|
permitting all characters that are not whitespaces (\S).
|
||||||
|
---
|
||||||
|
iucvterm/bin/ts-shell.in | 2 +-
|
||||||
|
1 files changed, 1 insertions(+), 1 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/iucvterm/bin/ts-shell.in b/iucvterm/bin/ts-shell.in
|
||||||
|
index 654d0c6..5fdf66c 100755
|
||||||
|
--- a/iucvterm/bin/ts-shell.in
|
||||||
|
+++ b/iucvterm/bin/ts-shell.in
|
||||||
|
@@ -219,7 +219,7 @@ sub loadAuthorization(\%)
|
||||||
|
$authorized = 1;
|
||||||
|
log_debug "Found user: $key";
|
||||||
|
|
||||||
|
- } elsif ($key =~ /^@(\w+)$/) {
|
||||||
|
+ } elsif ($key =~ /^@(\S+)$/) {
|
||||||
|
my $group = $1;
|
||||||
|
$authorized = 1 if grep {/^${group}$/} @{$cfg->{groups}};
|
||||||
|
log_debug "Found group: $key" if $authorized;
|
||||||
|
--
|
||||||
|
1.6.6.1
|
||||||
|
|
30
0037-znetconf-unknown-driver-for-qeth.patch
Normal file
30
0037-znetconf-unknown-driver-for-qeth.patch
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
From 41d606899d4029f8ac9f3415ebd21142cb223d70 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Tue, 22 Jun 2010 13:25:32 +0200
|
||||||
|
Subject: [PATCH 37/40] znetconf: unknown driver for qeth
|
||||||
|
|
||||||
|
Description: znetconf: --drive|-d option returning "unknown driver" for qeth
|
||||||
|
Symptom: qeth classified as unknown if specified for -d
|
||||||
|
Problem: bash reg. expression interpretation changed in new bash versions
|
||||||
|
Solution: used backward and "forward" compatible expression
|
||||||
|
---
|
||||||
|
zconf/znetconf | 3 ++-
|
||||||
|
1 files changed, 2 insertions(+), 1 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/zconf/znetconf b/zconf/znetconf
|
||||||
|
index 873124a..e1b48b3 100755
|
||||||
|
--- a/zconf/znetconf
|
||||||
|
+++ b/zconf/znetconf
|
||||||
|
@@ -1031,7 +1031,8 @@ function is_shortccwdevbusid_list()
|
||||||
|
function is_supported_driver()
|
||||||
|
{
|
||||||
|
local DRIVER="$1"
|
||||||
|
- [[ "$DRIVER" =~ "^(qeth|lcs|ctc|ctcm)$" ]]
|
||||||
|
+ local DRVEXPR='^(qeth|lcs|ctc|ctcm)$'
|
||||||
|
+ [[ "$DRIVER" =~ $DRVEXPR ]]
|
||||||
|
case $? in
|
||||||
|
0)
|
||||||
|
return 0
|
||||||
|
--
|
||||||
|
1.6.6.1
|
||||||
|
|
90
0038-cpuplugd-fix-stack-overflow.patch
Normal file
90
0038-cpuplugd-fix-stack-overflow.patch
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
From b0192c18160e5ea35889794895becab99890bca3 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Tue, 22 Jun 2010 13:27:27 +0200
|
||||||
|
Subject: [PATCH 38/40] cpuplugd: fix stack overflow
|
||||||
|
|
||||||
|
Description: cpuplugd: fix stack overwrite
|
||||||
|
Symptom: cpuplugd will terminate with "stack smashing" error on systems
|
||||||
|
with more than 30 CPUs.
|
||||||
|
Problem: NULL termination of a read buffer will write beyond the buffer
|
||||||
|
if a previous read() filled out the whole buffer.
|
||||||
|
Solution: Only read max. buffer size - 1 bytes.
|
||||||
|
---
|
||||||
|
cpuplugd/daemon.c | 2 +-
|
||||||
|
cpuplugd/main.c | 1 +
|
||||||
|
cpuplugd/mem.c | 4 ++--
|
||||||
|
cpuplugd/vmstat.c | 4 ++--
|
||||||
|
4 files changed, 6 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/cpuplugd/daemon.c b/cpuplugd/daemon.c
|
||||||
|
index f1af263..391acba 100644
|
||||||
|
--- a/cpuplugd/daemon.c
|
||||||
|
+++ b/cpuplugd/daemon.c
|
||||||
|
@@ -287,7 +287,7 @@ int check_lpar()
|
||||||
|
, strerror(errno));
|
||||||
|
clean_up();
|
||||||
|
}
|
||||||
|
- bytes_read = fread(buffer, 1, sizeof(buffer), filp);
|
||||||
|
+ bytes_read = fread(buffer, 1, sizeof(buffer) - 1, filp);
|
||||||
|
if (bytes_read == 0) {
|
||||||
|
fprintf(stderr, "Reading /proc/cpuinfo failed:");
|
||||||
|
fprintf(stderr, "%s\n", strerror(errno));
|
||||||
|
diff --git a/cpuplugd/main.c b/cpuplugd/main.c
|
||||||
|
index c280342..f8f9dfa 100644
|
||||||
|
--- a/cpuplugd/main.c
|
||||||
|
+++ b/cpuplugd/main.c
|
||||||
|
@@ -347,6 +347,7 @@ int main(int argc, char *argv[])
|
||||||
|
syslog(LOG_INFO, "Out of memory: Aborting.\n");
|
||||||
|
clean_up();
|
||||||
|
}
|
||||||
|
+ memset(vs, 0, sizeof(struct vmstat));
|
||||||
|
/*
|
||||||
|
* If the thread routine requires multiple arguments, they must be
|
||||||
|
* passed bundled up in an array or a structure
|
||||||
|
diff --git a/cpuplugd/mem.c b/cpuplugd/mem.c
|
||||||
|
index 8d5f05f..13f902d 100644
|
||||||
|
--- a/cpuplugd/mem.c
|
||||||
|
+++ b/cpuplugd/mem.c
|
||||||
|
@@ -70,7 +70,7 @@ int get_vmstats(struct vm_info *v)
|
||||||
|
rc = -1;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
- bytes_read = fread(buffer, 1, sizeof(buffer), filp);
|
||||||
|
+ bytes_read = fread(buffer, 1, sizeof(buffer) - 1, filp);
|
||||||
|
/*
|
||||||
|
* Bail if read failed or the buffer isn't big enough
|
||||||
|
*/
|
||||||
|
@@ -314,7 +314,7 @@ int get_free_memsize()
|
||||||
|
":%s\n", strerror(errno));
|
||||||
|
clean_up();
|
||||||
|
}
|
||||||
|
- bytes_read = fread(buffer, 1, sizeof(buffer), filp);
|
||||||
|
+ bytes_read = fread(buffer, 1, sizeof(buffer) - 1, filp);
|
||||||
|
/*
|
||||||
|
* Bail if read failed or the buffer isn't big enough
|
||||||
|
*/
|
||||||
|
diff --git a/cpuplugd/vmstat.c b/cpuplugd/vmstat.c
|
||||||
|
index 8428cce..d5a0036 100644
|
||||||
|
--- a/cpuplugd/vmstat.c
|
||||||
|
+++ b/cpuplugd/vmstat.c
|
||||||
|
@@ -76,7 +76,7 @@ void get_cpu_stats(struct cpustat *s)
|
||||||
|
syslog(LOG_ERR, "Can not open /proc/stat"
|
||||||
|
":%s\n", strerror(errno));
|
||||||
|
} else {
|
||||||
|
- bytes_read = fread(buffer, 1, sizeof(buffer), filp);
|
||||||
|
+ bytes_read = fread(buffer, 1, sizeof(buffer) - 1, filp);
|
||||||
|
fclose(filp);
|
||||||
|
/*
|
||||||
|
* Bail if read failed or the buffer isn't big enough
|
||||||
|
@@ -118,7 +118,7 @@ void get_cpu_stats(struct cpustat *s)
|
||||||
|
* softirq: servicing softirqs
|
||||||
|
* steal: the cpu time spent in involuntary wait
|
||||||
|
*/
|
||||||
|
- sscanf(match, "cpu %du %du %du %du %du %du %du %du",
|
||||||
|
+ sscanf(match, "cpu %d %d %d %d %d %d %d %d",
|
||||||
|
&s->cpu_user,
|
||||||
|
&s->cpu_nice,
|
||||||
|
&s->cpu_sys,
|
||||||
|
--
|
||||||
|
1.6.6.1
|
||||||
|
|
106
0039-cpuplugd-fix-cmm-limits-checks.patch
Normal file
106
0039-cpuplugd-fix-cmm-limits-checks.patch
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
From 664177c0fe57f671ad0d1eeed18374d77233d4b4 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Tue, 22 Jun 2010 13:28:45 +0200
|
||||||
|
Subject: [PATCH 39/40] cpuplugd: fix cmm limits checks
|
||||||
|
|
||||||
|
Description: cpuplugd: fix cmm_min/max limit checks.
|
||||||
|
Symptom: The cmm_min and cmm_max limits are not enforced correctly
|
||||||
|
when starting the daemon without the -V option, or when
|
||||||
|
cmm_pages is set manually below or above the limits.
|
||||||
|
Problem: Part of the cmm_min/max checks is only done when -V option
|
||||||
|
is specified. Values above/below the max/min limits are also
|
||||||
|
not identified correctly.
|
||||||
|
Solution: Make checks independent from -V option and check for cmm_pages
|
||||||
|
values beyond the limit.
|
||||||
|
---
|
||||||
|
cpuplugd/main.c | 54 +++++++++++++++---------------------------------------
|
||||||
|
1 files changed, 15 insertions(+), 39 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/cpuplugd/main.c b/cpuplugd/main.c
|
||||||
|
index f8f9dfa..3738a5f 100644
|
||||||
|
--- a/cpuplugd/main.c
|
||||||
|
+++ b/cpuplugd/main.c
|
||||||
|
@@ -226,26 +226,6 @@ void eval_mem_rules(struct config *cfg)
|
||||||
|
}
|
||||||
|
/* Evaluate the memunplug rule. */
|
||||||
|
if (cfg->memunplug && eval_term(cfg->memunplug, &symbols)) {
|
||||||
|
- /*
|
||||||
|
- * case where cmm has asynchronously increased
|
||||||
|
- * cmm_pages after cpuplugd reset it to cmm_max
|
||||||
|
- * at cpuplugd startup.
|
||||||
|
- *
|
||||||
|
- */
|
||||||
|
- if (cmmpages_size > cfg->cmm_max) {
|
||||||
|
- if (debug) {
|
||||||
|
- if (foreground == 1)
|
||||||
|
- printf("Found cmm_pages above Limit. "
|
||||||
|
- "Resetting value to %d\n"
|
||||||
|
- , cfg->cmm_max);
|
||||||
|
- if (foreground == 0)
|
||||||
|
- syslog(LOG_INFO, "Found cmm_pages above"
|
||||||
|
- "Limit. Resetting value to %d\n"
|
||||||
|
- , cfg->cmm_max);
|
||||||
|
- }
|
||||||
|
- set_cmm_pages(cfg->cmm_max);
|
||||||
|
- return;
|
||||||
|
- }
|
||||||
|
/* check memory limit */
|
||||||
|
if (cmmpages_size + cfg->cmm_inc > cfg->cmm_max) {
|
||||||
|
if (debug) {
|
||||||
|
@@ -256,18 +236,16 @@ void eval_mem_rules(struct config *cfg)
|
||||||
|
syslog(LOG_INFO, "maximum memory"
|
||||||
|
" limit is reached\n");
|
||||||
|
}
|
||||||
|
- if (cmmpages_size < cfg->cmm_max) {
|
||||||
|
- /* if the next increment would exceed
|
||||||
|
- * the maximum we advance to the
|
||||||
|
- * maximum
|
||||||
|
- */
|
||||||
|
+ /* if the next increment would exceed
|
||||||
|
+ * the maximum we advance to the
|
||||||
|
+ * maximum
|
||||||
|
+ */
|
||||||
|
+ if (cmmpages_size != cfg->cmm_max)
|
||||||
|
set_cmm_pages(cfg->cmm_max);
|
||||||
|
- return;
|
||||||
|
- }
|
||||||
|
- } else {
|
||||||
|
- memunplug(cfg->cmm_inc);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
+ memunplug(cfg->cmm_inc);
|
||||||
|
+ return;
|
||||||
|
}
|
||||||
|
/* Evaluate the memplug rule. */
|
||||||
|
if (cfg->memplug && eval_term(cfg->memplug, &symbols)) {
|
||||||
|
@@ -280,19 +258,17 @@ void eval_mem_rules(struct config *cfg)
|
||||||
|
if (foreground == 0)
|
||||||
|
syslog(LOG_INFO, "minimum memory"
|
||||||
|
" limit is reached\n");
|
||||||
|
- if (cmmpages_size > cfg->cmm_min) {
|
||||||
|
- /* if the next increment would exceed
|
||||||
|
- * the minimum we advance to the
|
||||||
|
- * minimum
|
||||||
|
- */
|
||||||
|
- set_cmm_pages(cfg->cmm_min);
|
||||||
|
- return;
|
||||||
|
- }
|
||||||
|
}
|
||||||
|
- } else {
|
||||||
|
- memplug(cfg->cmm_inc);
|
||||||
|
+ /* if the next increment would exceed
|
||||||
|
+ * the minimum we advance to the
|
||||||
|
+ * minimum
|
||||||
|
+ */
|
||||||
|
+ if (cmmpages_size != cfg->cmm_min)
|
||||||
|
+ set_cmm_pages(cfg->cmm_min);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
+ memplug(cfg->cmm_inc);
|
||||||
|
+ return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
1.6.6.1
|
||||||
|
|
39
0040-cpuplugd-set-cpu_min-to-1-by-default.patch
Normal file
39
0040-cpuplugd-set-cpu_min-to-1-by-default.patch
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
From 4a2b6aa7b2a873be78c27d2abe010cd7e73d9640 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Tue, 22 Jun 2010 13:33:36 +0200
|
||||||
|
Subject: [PATCH 40/40] cpuplugd: set cpu_min to 1 by default
|
||||||
|
|
||||||
|
Description: cpuplugd: set cpu_min to 1 by default.
|
||||||
|
Symptom: With a cpu_min default value of 2, the "cpu ping pong" effect
|
||||||
|
may still be visible with low system load, i.e. expensive cpu
|
||||||
|
signaling may occur if the workload is spread on 2 under-worked
|
||||||
|
cpus.
|
||||||
|
Problem: The default value for cpu_min is 2.
|
||||||
|
Solution: Set the default value of cpu_min to 1.
|
||||||
|
---
|
||||||
|
etc/sysconfig/cpuplugd | 6 ++----
|
||||||
|
1 files changed, 2 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/etc/sysconfig/cpuplugd b/etc/sysconfig/cpuplugd
|
||||||
|
index c807232..efafa20 100644
|
||||||
|
--- a/etc/sysconfig/cpuplugd
|
||||||
|
+++ b/etc/sysconfig/cpuplugd
|
||||||
|
@@ -6,13 +6,11 @@
|
||||||
|
# It does not contain shell environment variables.
|
||||||
|
|
||||||
|
## Type: integer
|
||||||
|
-## Default: 2
|
||||||
|
+## Default: 1
|
||||||
|
#
|
||||||
|
# The minimum number of cpus.
|
||||||
|
-# This means in this example, that every time at least two cpus
|
||||||
|
-# will be available
|
||||||
|
#
|
||||||
|
-CPU_MIN="2"
|
||||||
|
+CPU_MIN="1"
|
||||||
|
|
||||||
|
## Type: integer
|
||||||
|
## Default: 2
|
||||||
|
--
|
||||||
|
1.6.6.1
|
||||||
|
|
40
0041-fix-dates-option-on-zfcpdbf.patch
Normal file
40
0041-fix-dates-option-on-zfcpdbf.patch
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
From e30dc240e7417b83957507f1da6b34c31f18afb5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Tue, 29 Jun 2010 22:23:50 +0200
|
||||||
|
Subject: [PATCH] fix --dates option on zfcpdbf
|
||||||
|
|
||||||
|
Description: zfcpdbf: Fix --dates option
|
||||||
|
Symptom: Running zfcpdbf with the option --dates returns "Unknown
|
||||||
|
option: dates".
|
||||||
|
Problem: The code expects --date, not the documented --dates option.
|
||||||
|
Solution: Change zfcpdbf to expect --dates, as documented in the
|
||||||
|
man page and in the usage information.
|
||||||
|
---
|
||||||
|
scripts/zfcpdbf | 4 ++--
|
||||||
|
1 files changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/scripts/zfcpdbf b/scripts/zfcpdbf
|
||||||
|
index 3693d71..0b75c43 100755
|
||||||
|
--- a/scripts/zfcpdbf
|
||||||
|
+++ b/scripts/zfcpdbf
|
||||||
|
@@ -139,7 +139,7 @@ GetOptions(
|
||||||
|
'V|verbose' => \$OPT_VERBOSE,
|
||||||
|
'h|help' => \$OPT_HELP,
|
||||||
|
'v|version' => \$OPT_VERSION,
|
||||||
|
- 'D|date=s' => \$OPT_DATE,
|
||||||
|
+ 'D|dates=s' => \$OPT_DATE,
|
||||||
|
's|singleline' => \$OPT_SINGLELINE
|
||||||
|
) or print_usage();
|
||||||
|
|
||||||
|
@@ -555,7 +555,7 @@ sub print_san {
|
||||||
|
|
||||||
|
#
|
||||||
|
# Converts the Unix time to localtime an returns it
|
||||||
|
-# depending on the --date option.
|
||||||
|
+# depending on the --dates option.
|
||||||
|
#
|
||||||
|
# \param UNIX Timestamp to convert
|
||||||
|
# \return Formated Localtime
|
||||||
|
--
|
||||||
|
1.6.6.1
|
||||||
|
|
36
0042-lsluns-uninitialized-value-on-adapter-offline.patch
Normal file
36
0042-lsluns-uninitialized-value-on-adapter-offline.patch
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
From 76e25ac419c3f23c0cdbfcd2db64bf196d806994 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Tue, 13 Jul 2010 15:27:26 +0200
|
||||||
|
Subject: [PATCH 42/43] lsluns: uninitialized value on adapter offline
|
||||||
|
|
||||||
|
Description: lsluns: uninitialized value on adapter offline.
|
||||||
|
Symptom: An error message is presented stating that some values
|
||||||
|
are not initialized while an operation is due.
|
||||||
|
Problem: The program execution is not reflection the offline adapter
|
||||||
|
status.
|
||||||
|
Solution: Account for offlined adapter status and show an appropriate
|
||||||
|
message.
|
||||||
|
---
|
||||||
|
zconf/lsluns | 6 +++++-
|
||||||
|
1 files changed, 5 insertions(+), 1 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/zconf/lsluns b/zconf/lsluns
|
||||||
|
index 9227f64..769b846 100755
|
||||||
|
--- a/zconf/lsluns
|
||||||
|
+++ b/zconf/lsluns
|
||||||
|
@@ -211,7 +211,11 @@ sub show_attached_lun_info
|
||||||
|
print "\tport = $p\n";
|
||||||
|
foreach my $l (sort keys %{$lun_hash{$a}{$p}}) {
|
||||||
|
my $sg_dev = "/dev/".$lun_hash{$a}{$p}{$l};
|
||||||
|
- my $inq = `sg_inq -r $sg_dev`;
|
||||||
|
+ my $inq = `sg_inq -r $sg_dev 2>/dev/null`;
|
||||||
|
+ if (!$inq) {
|
||||||
|
+ print("\t\tlun = $l [offline]\n");
|
||||||
|
+ next;
|
||||||
|
+ }
|
||||||
|
(my $vend = substr($inq, 0x8, 0x8)) =~ s/\s*//g;
|
||||||
|
(my $mod = substr($inq, 0x10, 0x10)) =~ s/\s*//g;
|
||||||
|
my $type = ord(substr($inq, 0x0, 0x1));
|
||||||
|
--
|
||||||
|
1.7.1.1
|
||||||
|
|
@ -0,0 +1,78 @@
|
|||||||
|
From e1f4564972a7d280badf24568d56c063b6ce0ca7 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Tue, 13 Jul 2010 15:29:42 +0200
|
||||||
|
Subject: [PATCH 43/43] zfcpdbf: Fix "Use of uninitialized value" and output issues
|
||||||
|
|
||||||
|
Description: zfcpdbf: Fix "Use of uninitialized value" and output issues
|
||||||
|
Symptom: zfcpdbf outputs the error "Use of uninitialized value".
|
||||||
|
Problem: zfcpdbf tried to output attributes for "status read"
|
||||||
|
commands that do not exist. It also tried to output the
|
||||||
|
attribute port_handle for ELS requests that does not exist.
|
||||||
|
Solution: Exit early for "status read" requests, there is no additional
|
||||||
|
FSF command data. Remove output of LS field for ELS requests.
|
||||||
|
It was wrong, and newer dbf does not have this redundant field.
|
||||||
|
For consistency, add devno and timestamp to output of "status
|
||||||
|
read".
|
||||||
|
---
|
||||||
|
scripts/zfcpdbf | 20 +++++++++++++-------
|
||||||
|
1 files changed, 13 insertions(+), 7 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/scripts/zfcpdbf b/scripts/zfcpdbf
|
||||||
|
index 0b75c43..f82044d 100755
|
||||||
|
--- a/scripts/zfcpdbf
|
||||||
|
+++ b/scripts/zfcpdbf
|
||||||
|
@@ -375,11 +375,13 @@ sub print_hba {
|
||||||
|
}
|
||||||
|
elsif(defined($hba_hash{'tag2'}) &&
|
||||||
|
$hba_hash{'tag2'} eq "dism") {
|
||||||
|
- print "status read request dissmissed";
|
||||||
|
+ print "$adapter $hba_hash{'timestamp'} " .
|
||||||
|
+ "status read request dismissed";
|
||||||
|
}
|
||||||
|
elsif(defined($hba_hash{'tag2'}) &&
|
||||||
|
$hba_hash{'tag2'} eq "fail") {
|
||||||
|
- print "status read request failed";
|
||||||
|
+ print "$adapter $hba_hash{'timestamp'} " .
|
||||||
|
+ "status read request failed";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
elsif(defined($hba_hash{'tag'}) && $hba_hash{'tag'} eq "resp") {
|
||||||
|
@@ -398,9 +400,14 @@ sub print_hba {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
- next;
|
||||||
|
+ return;
|
||||||
|
}
|
||||||
|
-
|
||||||
|
+
|
||||||
|
+ if ($hba_hash{'tag'} eq 'stat') {
|
||||||
|
+ print "\n";
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if($OPT_VERBOSE) {
|
||||||
|
print "protocol status qualifier=" .
|
||||||
|
"'$hba_hash{'fsf_prot_status_qual'}'" . $endl .
|
||||||
|
@@ -410,7 +417,7 @@ sub print_hba {
|
||||||
|
"'$hba_hash{'fsf_req_status'}'" . $endl .
|
||||||
|
"SBAL=$hba_hash{'sbal_first'}/$hba_hash{
|
||||||
|
'sbal_last'}/$hba_hash{'sbal_response'} " .
|
||||||
|
- "(fist/last/response)" . $endl;
|
||||||
|
+ "(first/last/response)" . $endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
if($hba_hash{'fsf_command'} eq '0x00000002') {
|
||||||
|
@@ -432,8 +439,7 @@ sub print_hba {
|
||||||
|
" LUN handle=$hba_hash{'lun_handle'}";
|
||||||
|
}
|
||||||
|
elsif($hba_hash{'fsf_command'} eq '0x0000000b' ) {
|
||||||
|
- print "D_ID=$hba_hash{'d_id'} LS " .
|
||||||
|
- "code=$hba_hash{'port_handle'}";
|
||||||
|
+ print "D_ID=$hba_hash{'d_id'}";
|
||||||
|
}
|
||||||
|
print"\n";
|
||||||
|
}
|
||||||
|
--
|
||||||
|
1.7.1.1
|
||||||
|
|
12
1000-ziomon-linker.patch
Normal file
12
1000-ziomon-linker.patch
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
diff -up s390-tools-1.8.2/ziomon/Makefile.linker s390-tools-1.8.2/ziomon/Makefile
|
||||||
|
--- s390-tools-1.8.2/ziomon/Makefile.linker 2010-06-10 08:54:55.000000000 +0200
|
||||||
|
+++ s390-tools-1.8.2/ziomon/Makefile 2010-06-10 08:55:48.000000000 +0200
|
||||||
|
@@ -21,7 +21,7 @@ ziomon_util: ziomon_util_main.o ziomon_t
|
||||||
|
ziomon_zfcpdd_main.o: ziomon_zfcpdd.c ziomon_zfcpdd.h
|
||||||
|
$(CC) -DWITH_MAIN $(CFLAGS) $(CPPFLAGS) -c $< -o $@
|
||||||
|
ziomon_zfcpdd: ziomon_zfcpdd_main.o ziomon_tools.o
|
||||||
|
- $(LINK) $^ -o $@ -lm -lrt
|
||||||
|
+ $(LINK) $^ -o $@ -lm -lrt -lpthread
|
||||||
|
|
||||||
|
ziorep_traffic: ziorep_traffic.o ziorep_framer.o ziorep_frameset.o \
|
||||||
|
ziorep_printers.o ziomon_dacc.o ziomon_util.o \
|
12
ccw.udev
Normal file
12
ccw.udev
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
ACTION!="add|change", GOTO="ccw_end"
|
||||||
|
SUBSYSTEM!="ccw", GOTO="ccw_end"
|
||||||
|
SYSFS{cutype}=="1731/01", RUN+="ccw_init"
|
||||||
|
SYSFS{cutype}=="1731/05", RUN+="ccw_init"
|
||||||
|
SYSFS{cutype}=="1731/06", RUN+="ccw_init"
|
||||||
|
SYSFS{cutype}=="3088/01", RUN+="ccw_init"
|
||||||
|
SYSFS{cutype}=="3088/08", RUN+="ccw_init"
|
||||||
|
SYSFS{cutype}=="3088/60", RUN+="ccw_init"
|
||||||
|
SYSFS{cutype}=="3088/61", RUN+="ccw_init"
|
||||||
|
SYSFS{cutype}=="3088/1E", RUN+="ccw_init"
|
||||||
|
SYSFS{cutype}=="3088/1F", RUN+="ccw_init"
|
||||||
|
LABEL="ccw_end"
|
176
ccw_init
Normal file
176
ccw_init
Normal file
@ -0,0 +1,176 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
|
||||||
|
[ -z "$DEVPATH" ] && exit 0
|
||||||
|
[ "$SUBSYSTEM" != "ccw" ] && exit 0
|
||||||
|
|
||||||
|
[ -e /etc/ccw.conf ] && MODE="dracut" || MODE="normal"
|
||||||
|
OLD_IFS="$IFS"
|
||||||
|
|
||||||
|
get_config_line_by_subchannel()
|
||||||
|
{
|
||||||
|
local CHANNEL
|
||||||
|
CHANNEL="$1"
|
||||||
|
while read line; do
|
||||||
|
IFS=","
|
||||||
|
set $line
|
||||||
|
IFS="$OLD_IFS"
|
||||||
|
for i in $@; do
|
||||||
|
if [ "$CHANNEL" = "$i" ]; then
|
||||||
|
echo $line
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done < /etc/ccw.conf
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
CHANNEL=${DEVPATH##*/}
|
||||||
|
|
||||||
|
if [ $MODE = "dracut" ]; then
|
||||||
|
CONFIG_LINE=$(get_config_line_by_subchannel $CHANNEL)
|
||||||
|
|
||||||
|
[ $? -ne 0 -o -z "$CONFIG_LINE" ] && break
|
||||||
|
|
||||||
|
IFS=","
|
||||||
|
set $CONFIG_LINE
|
||||||
|
IFS="$OLD_IFS"
|
||||||
|
NETTYPE=$1
|
||||||
|
shift
|
||||||
|
SUBCHANNELS="$1"
|
||||||
|
OPTIONS=""
|
||||||
|
shift
|
||||||
|
while [ $# -gt 0 ]; do
|
||||||
|
case $1 in
|
||||||
|
*=*) OPTIONS="$OPTIONS $1";;
|
||||||
|
[0-9]*) SUBCHANNELS="$SUBCHANNELS,$1";;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
elif [ $MODE = "normal" ]; then
|
||||||
|
NOLOCALE="yes"
|
||||||
|
|
||||||
|
. /etc/sysconfig/network-scripts/network-functions
|
||||||
|
|
||||||
|
CONFIG_FILE=$(get_config_by_subchannel $CHANNEL)
|
||||||
|
|
||||||
|
if [ -n "$CONFIG_FILE" ]; then
|
||||||
|
. $CONFIG_FILE
|
||||||
|
else
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "Unknown mode=$MODE"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# now we have extracted these variables from the config files:
|
||||||
|
# SUBCHANNELS
|
||||||
|
# OPTIONS
|
||||||
|
|
||||||
|
# put LAYER2 option into its own variable
|
||||||
|
set $OPTIONS
|
||||||
|
OPTIONS=""
|
||||||
|
while [ $# -gt 0 ]; do
|
||||||
|
case $1 in
|
||||||
|
layer2=*) LAYER2=${1##layer2=};;
|
||||||
|
*=*) OPTIONS="$OPTIONS $1";;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
# translate variables from the interface config files to OPTIONS
|
||||||
|
if [ -n "$PORTNAME" ]; then
|
||||||
|
if [ "$NETTYPE" = "lcs" ]; then
|
||||||
|
OPTIONS="$OPTIONS portno=$PORTNAME"
|
||||||
|
else
|
||||||
|
OPTIONS="$OPTIONS portname=$PORTNAME"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if [ "$NETTYPE" = "ctc" -a -n "$CTCPROT" ]; then
|
||||||
|
OPTIONS="$OPTIONS protocol=$CTCPROTO"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# SUBCHANNELS is only set on mainframe ccwgroup devices
|
||||||
|
[ -z "$SUBCHANNELS" -o -z "$NETTYPE" ] && exit 0
|
||||||
|
if [ "$NETTYPE" = "ctc" ]; then
|
||||||
|
DIR="/sys/bus/ccwgroup/drivers/ctcm"
|
||||||
|
else
|
||||||
|
DIR="/sys/bus/ccwgroup/drivers/$NETTYPE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
i=0
|
||||||
|
while [ $i -lt 20 ]; do
|
||||||
|
[ -e $DIR ] && break
|
||||||
|
sleep 0.1
|
||||||
|
i=$(($i+1))
|
||||||
|
done
|
||||||
|
|
||||||
|
# driver missing or not loaded
|
||||||
|
[ ! -e $DIR ] && exit 0
|
||||||
|
|
||||||
|
IFS=","
|
||||||
|
set $SUBCHANNELS
|
||||||
|
IFS="$OLD_IFS"
|
||||||
|
CHANNEL1=$1
|
||||||
|
CHANNEL2=$2
|
||||||
|
SYSDIR="$DIR/$CHANNEL1"
|
||||||
|
|
||||||
|
[ -e $SYSDIR ] && exit 0
|
||||||
|
|
||||||
|
# check if the interface is already online
|
||||||
|
if [ -e $SYSDIR/online ]; then
|
||||||
|
read on <$SYSDIR/online
|
||||||
|
[ "$on" = "1" ] && exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
DRIVER=$(readlink $DEVPATH/driver)
|
||||||
|
DRIVER=${DRIVER##*/}
|
||||||
|
if [ "$DRIVER" = "lcs" -a "$NETTYPE" = "ctc" ]; then
|
||||||
|
echo "$CHANNEL" > /sys/bus/ccw/drivers/lcs/unbind
|
||||||
|
echo "$CHANNEL" > /sys/bus/ccw/drivers/ctcm/bind
|
||||||
|
echo "$CHANNEL2" > /sys/bus/ccw/drivers/lcs/unbind
|
||||||
|
echo "$CHANNEL2" > /sys/bus/ccw/drivers/ctcm/bind
|
||||||
|
fi
|
||||||
|
if [ "$DRIVER" = "ctcm" -a "$NETTYPE" = "lcs" ]; then
|
||||||
|
echo "$CHANNEL" > /sys/bus/ccw/drivers/ctcm/unbind
|
||||||
|
echo "$CHANNEL" > /sys/bus/ccw/drivers/lcs/bind
|
||||||
|
echo "$CHANNEL2" > /sys/bus/ccw/drivers/ctcm/unbind
|
||||||
|
echo "$CHANNEL2" > /sys/bus/ccw/drivers/lcs/bind
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -e $SYSDIR ]; then
|
||||||
|
echo "$SUBCHANNELS" > $DIR/group
|
||||||
|
i=0
|
||||||
|
while [ $i -lt 20 ]; do
|
||||||
|
[ -e $SYSDIR ] && break
|
||||||
|
sleep 0.1
|
||||||
|
i=$(($i+1))
|
||||||
|
done
|
||||||
|
|
||||||
|
[ ! -e $SYSDIR ] && exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# check if the interface is already online
|
||||||
|
if [ -e $SYSDIR/online ]; then
|
||||||
|
read on <$SYSDIR/online
|
||||||
|
[ "$on" = "1" ] && exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# first set layer2, other options may depend on it
|
||||||
|
[ -n "$LAYER2" ] && echo $LAYER2 > $SYSDIR/layer2
|
||||||
|
|
||||||
|
if [ -n "$OPTIONS" ]; then
|
||||||
|
for i in $OPTIONS; do
|
||||||
|
OPT=${i%%=*}
|
||||||
|
VAL=${i##*=}
|
||||||
|
if [ -e "$SYSDIR/$OPT" ]; then
|
||||||
|
echo "$VAL" > "$SYSDIR/$OPT" || \
|
||||||
|
echo "Could not set value \"$VAL\" for OPTION \"$OPT\" with SUBCHANNELS \"$SUBCHANNELS\""
|
||||||
|
else
|
||||||
|
echo "OPTION \"$OPT\" does not exist for SUBCHANNELS \"$SUBCHANNELS\""
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
[ -e $SYSDIR/online ] && echo 1 > $SYSDIR/online
|
12
cmsfs-1.1.8-kernel26.patch
Normal file
12
cmsfs-1.1.8-kernel26.patch
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
diff -urN cmsfs-1.1.8/cmsfssed.sh cmsfs-1.1.8_/cmsfssed.sh
|
||||||
|
--- cmsfs-1.1.8/cmsfssed.sh 2003-02-28 17:52:59.000000000 -0500
|
||||||
|
+++ cmsfs-1.1.8_/cmsfssed.sh 2004-05-28 16:36:22.000000000 -0400
|
||||||
|
@@ -85,7 +85,7 @@
|
||||||
|
DRIVER_SOURCE="cmsfs22x.c"
|
||||||
|
MODULES_DIRECTORY="/lib/modules/`uname -r`/fs"
|
||||||
|
;;
|
||||||
|
- 2.4*|2.5*)
|
||||||
|
+ 2.4*|2.5*|2.6*)
|
||||||
|
LINUX_RELEASE="2.4"
|
||||||
|
# ln -s cmsfs24x.c cmsfsvfs.c
|
||||||
|
INCLUDES="-I/lib/modules/`uname -r`/build/include"
|
11
cmsfs-1.1.8-warnings.patch
Normal file
11
cmsfs-1.1.8-warnings.patch
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
--- cmsfs-1.1.8/cmsfsvol.c.warnings 2003-07-18 01:38:57.000000000 +0200
|
||||||
|
+++ cmsfs-1.1.8/cmsfsvol.c 2005-09-06 16:57:15.000000000 +0200
|
||||||
|
@@ -52,7 +52,7 @@
|
||||||
|
|
||||||
|
/* print a header; looks like CMS */
|
||||||
|
(void) printf("LABEL VDEV M STAT CYL TYPE \
|
||||||
|
-BLKSZ FILES BLKS USED-(%) BLKS LEFT BLK TOTAL\n");
|
||||||
|
+BLKSZ FILES BLKS USED-(%%) BLKS LEFT BLK TOTAL\n");
|
||||||
|
|
||||||
|
for ( ; i < argc ; i++)
|
||||||
|
{
|
130
cpi.initd
Normal file
130
cpi.initd
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# Copyright 2009 Red Hat, Inc.
|
||||||
|
# License: GPLv2
|
||||||
|
# Author: Dan Horák <dhorak@redhat.com>
|
||||||
|
#
|
||||||
|
# cpi Set Control Program Identification on IBM zSeries
|
||||||
|
#
|
||||||
|
# chkconfig: 12345 80 20
|
||||||
|
# description: Set Control Program Identification on IBM zSeries \
|
||||||
|
# that's reported on a Linux LPAR
|
||||||
|
|
||||||
|
### BEGIN INIT INFO
|
||||||
|
# Provides: cpi
|
||||||
|
# Required-Start:
|
||||||
|
# Required-Stop:
|
||||||
|
# Should-Start:
|
||||||
|
# Should-Stop:
|
||||||
|
# Default-Start: 1 2 3 4 5
|
||||||
|
# Default-Stop: 0 6
|
||||||
|
# Short-Description: Set control program identification on IBM zSeries
|
||||||
|
# Description: Set Control Program Identification on IBM zSeries \
|
||||||
|
# that's reported on a Linux LPAR
|
||||||
|
### END INIT INFO
|
||||||
|
|
||||||
|
# Source function library.
|
||||||
|
. /etc/init.d/functions
|
||||||
|
|
||||||
|
prog="cpi"
|
||||||
|
|
||||||
|
[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog
|
||||||
|
|
||||||
|
cpipath=/sys/firmware/cpi
|
||||||
|
|
||||||
|
start() {
|
||||||
|
[ `id -u` -eq 0 ] || return 4
|
||||||
|
|
||||||
|
echo -n $"Starting $prog: "
|
||||||
|
|
||||||
|
if [ -d $cpipath ]; then
|
||||||
|
retval=0
|
||||||
|
echo LINUX > $cpipath/system_type 2> /dev/null || retval=1
|
||||||
|
[ $retval -eq 0 ] && echo "$SYSTEM_NAME" > $cpipath/system_name 2> /dev/null || retval=1
|
||||||
|
[ $retval -eq 0 ] && echo "$SYSPLEX_NAME" > $cpipath/sysplex_name 2> /dev/null || retval=1
|
||||||
|
level_maj=`uname -r | cut -d '-' -f 1 | cut -d '.' -f 1`
|
||||||
|
level_min=`uname -r | cut -d '-' -f 1 | cut -d '.' -f 2`
|
||||||
|
level_mic=`uname -r | cut -d '-' -f 1 | cut -d '.' -f 3`
|
||||||
|
level=`printf '%02x%02x%02x' $level_maj $level_min $level_mic`
|
||||||
|
[ $retval -eq 0 ] && echo $level > $cpipath/system_level 2> /dev/null || retval=1
|
||||||
|
|
||||||
|
[ $retval -eq 0 ] && echo 1 > $cpipath/set 2> /dev/null || retval=1
|
||||||
|
else
|
||||||
|
retval=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
[ $retval -eq 0 ] && success || failure
|
||||||
|
echo
|
||||||
|
return $retval
|
||||||
|
}
|
||||||
|
|
||||||
|
stop() {
|
||||||
|
echo -n $"Stopping $prog: "
|
||||||
|
|
||||||
|
# nothing to do
|
||||||
|
success
|
||||||
|
echo
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
restart() {
|
||||||
|
stop
|
||||||
|
start
|
||||||
|
}
|
||||||
|
|
||||||
|
reload() {
|
||||||
|
restart
|
||||||
|
}
|
||||||
|
|
||||||
|
force_reload() {
|
||||||
|
restart
|
||||||
|
}
|
||||||
|
|
||||||
|
rh_status() {
|
||||||
|
if [ -d $cpipath ]; then
|
||||||
|
echo -n "System type: "; cat $cpipath/system_type
|
||||||
|
echo -n "System level: "; cat $cpipath/system_level
|
||||||
|
echo -n "System name: "; cat $cpipath/system_name
|
||||||
|
echo -n "Sysplex name: "; cat $cpipath/sysplex_name
|
||||||
|
retval=0
|
||||||
|
else
|
||||||
|
echo "Control Program Identification system interface doesn't exist."
|
||||||
|
retval=1
|
||||||
|
fi
|
||||||
|
return $retval
|
||||||
|
}
|
||||||
|
|
||||||
|
rh_status_q() {
|
||||||
|
rh_status >/dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
start)
|
||||||
|
$1
|
||||||
|
;;
|
||||||
|
stop)
|
||||||
|
$1
|
||||||
|
;;
|
||||||
|
restart)
|
||||||
|
$1
|
||||||
|
;;
|
||||||
|
reload)
|
||||||
|
rh_status_q || exit 7
|
||||||
|
$1
|
||||||
|
;;
|
||||||
|
force-reload)
|
||||||
|
force_reload
|
||||||
|
;;
|
||||||
|
status)
|
||||||
|
rh_status
|
||||||
|
;;
|
||||||
|
condrestart|try-restart)
|
||||||
|
rh_status_q || exit 0
|
||||||
|
restart
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
|
||||||
|
exit 2
|
||||||
|
esac
|
||||||
|
exit $?
|
5
cpi.sysconfig
Normal file
5
cpi.sysconfig
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# Define a system name (8 chars maximum)
|
||||||
|
SYSTEM_NAME=
|
||||||
|
|
||||||
|
# Define a sysplex name (8 chars maximum)
|
||||||
|
SYSPLEX_NAME=
|
114
cpuplugd.initd
Normal file
114
cpuplugd.initd
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
#
|
||||||
|
# chkconfig: 2345 90 10
|
||||||
|
# description: Start the cpu hotplug daemon for Linux on System z
|
||||||
|
# processname: cpuplugd
|
||||||
|
# config: /etc/sysconfig/cpuplugd
|
||||||
|
# pidfile: /var/run/cpuplugd.pid
|
||||||
|
|
||||||
|
### BEGIN INIT INFO
|
||||||
|
# Provides: cpuplugd
|
||||||
|
# Required-Start: $local_fs $remote_fs
|
||||||
|
# Required-Stop: $local_fs $remote_fs
|
||||||
|
# Should-Start:
|
||||||
|
# Should-Stop:
|
||||||
|
# Default-Start: 2 3 4 5
|
||||||
|
# Default-Stop: 0 1 6
|
||||||
|
# Short-Description: Start the cpu hotplug daemon for Linux on System z
|
||||||
|
# Description: Starts the cpuplugd. It uses the configuration
|
||||||
|
# file /etc/sysconfig/cpuplugd
|
||||||
|
### END INIT INFO
|
||||||
|
|
||||||
|
# Source function library.
|
||||||
|
. /etc/rc.d/init.d/functions
|
||||||
|
|
||||||
|
exec="/usr/sbin/cpuplugd"
|
||||||
|
prog="cpuplugd"
|
||||||
|
config="/etc/sysconfig/cpuplugd"
|
||||||
|
|
||||||
|
lockfile=/var/lock/subsys/$prog
|
||||||
|
|
||||||
|
start() {
|
||||||
|
[ -x $exec ] || exit 5
|
||||||
|
[ -f $config ] || exit 6
|
||||||
|
[ `id -u` -eq 0 ] || exit 4
|
||||||
|
echo -n $"Starting $prog: "
|
||||||
|
daemon $exec -c $config
|
||||||
|
retval=$?
|
||||||
|
echo
|
||||||
|
[ $retval -eq 0 ] && touch $lockfile
|
||||||
|
return $retval
|
||||||
|
}
|
||||||
|
|
||||||
|
stop() {
|
||||||
|
[ `id -u` -eq 0 ] || exit 4
|
||||||
|
echo -n $"Stopping $prog: "
|
||||||
|
killproc $exec
|
||||||
|
retval=$?
|
||||||
|
echo
|
||||||
|
[ $retval -eq 0 ] && rm -f $lockfile
|
||||||
|
return $retval
|
||||||
|
}
|
||||||
|
|
||||||
|
restart() {
|
||||||
|
stop
|
||||||
|
#
|
||||||
|
# We have to wait 2-3 seconds here. When the daemon is stopped it takes
|
||||||
|
# the time we sleep to reactivate cpus. If we restart to fast and
|
||||||
|
# cpuplugd wasn't able to restore some settings we may get a undesired
|
||||||
|
# online cpu count after cpuplugd shutdown
|
||||||
|
#
|
||||||
|
sleep 4
|
||||||
|
start
|
||||||
|
}
|
||||||
|
|
||||||
|
reload() {
|
||||||
|
restart
|
||||||
|
}
|
||||||
|
|
||||||
|
force_reload() {
|
||||||
|
restart
|
||||||
|
}
|
||||||
|
|
||||||
|
rh_status() {
|
||||||
|
# run checks to determine if the service is running or use generic status
|
||||||
|
# status -l $prog $exec
|
||||||
|
status $exec
|
||||||
|
}
|
||||||
|
|
||||||
|
rh_status_q() {
|
||||||
|
rh_status >/dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
start)
|
||||||
|
rh_status_q && exit 0
|
||||||
|
$1
|
||||||
|
;;
|
||||||
|
stop)
|
||||||
|
rh_status_q || exit 0
|
||||||
|
$1
|
||||||
|
;;
|
||||||
|
restart)
|
||||||
|
$1
|
||||||
|
;;
|
||||||
|
reload)
|
||||||
|
rh_status_q || exit 7
|
||||||
|
$1
|
||||||
|
;;
|
||||||
|
force-reload)
|
||||||
|
force_reload
|
||||||
|
;;
|
||||||
|
status)
|
||||||
|
rh_status
|
||||||
|
;;
|
||||||
|
condrestart|try-restart)
|
||||||
|
rh_status_q || exit 0
|
||||||
|
restart
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
|
||||||
|
exit 2
|
||||||
|
esac
|
||||||
|
exit $?
|
16
dasd.udev
Normal file
16
dasd.udev
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
ACTION=="add", SUBSYSTEM=="drivers", KERNEL=="dasd-eckd", RUN+="/sbin/dasdconf.sh"
|
||||||
|
ACTION=="add", SUBSYSTEM=="drivers", KERNEL=="dasd-fba", RUN+="/sbin/dasdconf.sh"
|
||||||
|
|
||||||
|
# This list should be autogenerated with "modinfo dasd_{eckd,fba}_mod"
|
||||||
|
ACTION=="add", SUBSYSTEM=="ccw", ATTR{modalias}=="ccw:t1750m*dt3380dm*", RUN+="/sbin/dasdconf.sh"
|
||||||
|
ACTION=="add", SUBSYSTEM=="ccw", ATTR{modalias}=="ccw:t1750m*dt3390dm*", RUN+="/sbin/dasdconf.sh"
|
||||||
|
ACTION=="add", SUBSYSTEM=="ccw", ATTR{modalias}=="ccw:t2107m*dt3380dm*", RUN+="/sbin/dasdconf.sh"
|
||||||
|
ACTION=="add", SUBSYSTEM=="ccw", ATTR{modalias}=="ccw:t2107m*dt3390dm*", RUN+="/sbin/dasdconf.sh"
|
||||||
|
ACTION=="add", SUBSYSTEM=="ccw", ATTR{modalias}=="ccw:t9343m*dt9345dm*", RUN+="/sbin/dasdconf.sh"
|
||||||
|
ACTION=="add", SUBSYSTEM=="ccw", ATTR{modalias}=="ccw:t2105m*dt3380dm*", RUN+="/sbin/dasdconf.sh"
|
||||||
|
ACTION=="add", SUBSYSTEM=="ccw", ATTR{modalias}=="ccw:t3990m*dt3380dm*", RUN+="/sbin/dasdconf.sh"
|
||||||
|
ACTION=="add", SUBSYSTEM=="ccw", ATTR{modalias}=="ccw:t3880m*dt3390dm*", RUN+="/sbin/dasdconf.sh"
|
||||||
|
ACTION=="add", SUBSYSTEM=="ccw", ATTR{modalias}=="ccw:t2105m*dt3390dm*", RUN+="/sbin/dasdconf.sh"
|
||||||
|
ACTION=="add", SUBSYSTEM=="ccw", ATTR{modalias}=="ccw:t3990m*dt3390dm*", RUN+="/sbin/dasdconf.sh"
|
||||||
|
ACTION=="add", SUBSYSTEM=="ccw", ATTR{modalias}=="ccw:t3880m*dt3370dm*", RUN+="/sbin/dasdconf.sh"
|
||||||
|
ACTION=="add", SUBSYSTEM=="ccw", ATTR{modalias}=="ccw:t6310m*dt9336dm*", RUN+="/sbin/dasdconf.sh"
|
94
dasdconf.sh
Normal file
94
dasdconf.sh
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# config file syntax:
|
||||||
|
# deviceno sysfs_opts...
|
||||||
|
#
|
||||||
|
# Examples:
|
||||||
|
# 0.0.0203 readonly=1 failfast=1
|
||||||
|
# 0.0.0204
|
||||||
|
# 0.0.0205 erplog=1
|
||||||
|
|
||||||
|
[ -z "$DEVPATH" ] && exit 0
|
||||||
|
[ "$ACTION" != "add" ] && exit 0
|
||||||
|
|
||||||
|
CHANNEL=${DEVPATH##*/}
|
||||||
|
|
||||||
|
CONFIG=/etc/dasd.conf
|
||||||
|
PATH=/sbin:/bin
|
||||||
|
export PATH
|
||||||
|
|
||||||
|
warn() {
|
||||||
|
[ -e /dev/kmsg ] && echo "<4>dasdconf.sh Warning: $@" > /dev/kmsg
|
||||||
|
echo "dasdconf.sh Warning: $@" >&2
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ -f "$CONFIG" ]; then
|
||||||
|
if [ ! -d /sys/bus/ccw/drivers/dasd-eckd ] && [ ! -d /sys/bus/ccw/drivers/dasd-fba ]; then
|
||||||
|
#warn "No dasd-eckd or dasd-eckd loaded"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
sed 'y/ABCDEF/abcdef/' < $CONFIG | while read line; do
|
||||||
|
case $line in
|
||||||
|
\#*) ;;
|
||||||
|
*)
|
||||||
|
[ -z "$line" ] && continue
|
||||||
|
set $line
|
||||||
|
|
||||||
|
# if we are in single add mode, only add the new CHANNEL
|
||||||
|
[ "$SUBSYSTEM" = "ccw" ] && [ "$1" != "$CHANNEL" ] && continue
|
||||||
|
|
||||||
|
DEVICE=$1
|
||||||
|
SYSFSPATH=
|
||||||
|
|
||||||
|
if [ -r "/sys/bus/ccw/drivers/dasd-eckd/$DEVICE" ]; then
|
||||||
|
SYSFSPATH="/sys/bus/ccw/drivers/dasd-eckd/$DEVICE"
|
||||||
|
elif [ -r "/sys/bus/ccw/drivers/dasd-fba/$DEVICE" ]; then
|
||||||
|
SYSFSPATH="/sys/bus/ccw/drivers/dasd-fba/$DEVICE"
|
||||||
|
else
|
||||||
|
# if we are in single add mode, this is a failure!
|
||||||
|
[ "$SUBSYSTEM" = "ccw" ] && warn "Could not find $DEVICE in sysfs"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# skip already onlined devices
|
||||||
|
if [ "$(cat $SYSFSPATH/online)" = "1" ]; then
|
||||||
|
if [ "$SUBSYSTEM" = "ccw" ]; then
|
||||||
|
# if we are in single add mode, we should not touch the device
|
||||||
|
warn "$DEVICE is already online, not configuring"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
shift
|
||||||
|
while [ -n "$1" ]; do
|
||||||
|
(
|
||||||
|
attribute="$1"
|
||||||
|
IFS="="
|
||||||
|
set $attribute
|
||||||
|
|
||||||
|
if [ "$1" = "use_diag" ]; then
|
||||||
|
# this module better only returns after
|
||||||
|
# all sysfs entries have the "use_diag" file
|
||||||
|
modprobe dasd_diag_mod
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -r "$SYSFSPATH/$1" ]; then
|
||||||
|
echo $2 > $SYSFSPATH/$1 || warn "Could not set $1=$2 for $DEVICE"
|
||||||
|
else
|
||||||
|
warn "$1 does not exist for $DEVICE"
|
||||||
|
fi
|
||||||
|
)
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
# Now, put the device online
|
||||||
|
echo 1 > $SYSFSPATH/online || echo "Could not activate $DEVICE"
|
||||||
|
|
||||||
|
# if we are in single add mode, we are done
|
||||||
|
[ "$SUBSYSTEM" = "ccw" ] && exit 0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
exit 0
|
@ -1 +0,0 @@
|
|||||||
This package was retired due to no active owner on 2011-02-23
|
|
305
device_cio_free
Normal file
305
device_cio_free
Normal file
@ -0,0 +1,305 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# Copyright 2009, 2010 Red Hat, Inc.
|
||||||
|
# License: GPLv2
|
||||||
|
# Author: Dan Horák <dhorak@redhat.com>
|
||||||
|
#
|
||||||
|
# unblock devices listed in various config files and wait until they are ready
|
||||||
|
#
|
||||||
|
# it uses dasd and zfcp config file
|
||||||
|
# config file syntax:
|
||||||
|
# deviceno options
|
||||||
|
# or
|
||||||
|
# deviceno WWPN FCPLUN
|
||||||
|
#
|
||||||
|
# also processes the system ccw config file and network interface configurations
|
||||||
|
#
|
||||||
|
# requires: echo, sleep, modprobe, grep, printf, sed.
|
||||||
|
#
|
||||||
|
# it is used in
|
||||||
|
# anaconda
|
||||||
|
# dracut generated initramfs
|
||||||
|
# normal system startup driven by upstart
|
||||||
|
#
|
||||||
|
|
||||||
|
DASDCONFIG=/etc/dasd.conf
|
||||||
|
ZFCPCONFIG=/etc/zfcp.conf
|
||||||
|
ZNETCONFIG=/etc/ccw.conf
|
||||||
|
BLACKLIST=/proc/cio_ignore
|
||||||
|
VERBOSE=
|
||||||
|
PATH=/bin:/sbin
|
||||||
|
DEVICE= # list of devices given on command line
|
||||||
|
ALL_DEVICES= # list of all unblocked devices
|
||||||
|
WAITING_TIMEOUT=60 # maximum time to wait for all devices to appear
|
||||||
|
WAITING_TOTAL=0 # actual time spent waiting for devices
|
||||||
|
|
||||||
|
usage()
|
||||||
|
{
|
||||||
|
echo "Usage: $CMD [-h|--help] [-V|--verbose] [-d|--device <deviceid>]"
|
||||||
|
echo " -h|--help print this message"
|
||||||
|
echo " -V|--verbose be verbose"
|
||||||
|
echo " -d|--device <deviceid> unblock and wait for specified device"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# accepts single device, comma-separated lists and dash separated ranges and their combinations
|
||||||
|
# the comma separated list is split so we minimize the effect of unsuccessful freeing
|
||||||
|
free_device()
|
||||||
|
{
|
||||||
|
local DEV DEV_LIST
|
||||||
|
|
||||||
|
[ -z "$1" ] && return
|
||||||
|
|
||||||
|
DEV_LIST=$(echo "$1" | sed 'y/ABCDEF/abcdef/' | sed 's/,/ /g')
|
||||||
|
|
||||||
|
for DEV in $DEV_LIST; do
|
||||||
|
[ $VERBOSE ] && echo "Freeing device(s) $DEV"
|
||||||
|
if ! echo "free $DEV" > $BLACKLIST 2> /dev/null ; then
|
||||||
|
echo "Error: can't free device(s) $DEV"
|
||||||
|
else
|
||||||
|
if [ -z $ALL_DEVICES ]; then
|
||||||
|
ALL_DEVICES="$DEV"
|
||||||
|
else
|
||||||
|
ALL_DEVICES="$ALL_DEVICES,$DEV"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# wait until a device appears on the ccw bus
|
||||||
|
wait_on_single_device()
|
||||||
|
{
|
||||||
|
local DEVICE_ONLINE DEV
|
||||||
|
|
||||||
|
[ -z "$1" ] && return
|
||||||
|
|
||||||
|
DEV="$1"
|
||||||
|
DEVICE_ONLINE="/sys/bus/ccw/devices/$DEV/online"
|
||||||
|
|
||||||
|
[ $VERBOSE ] && echo "Waiting on device $DEV"
|
||||||
|
[ -f "$DEVICE_ONLINE" ] && return
|
||||||
|
|
||||||
|
for t in 1 2 3 4 5
|
||||||
|
do
|
||||||
|
if [ $WAITING_TOTAL -ge $WAITING_TIMEOUT ]; then
|
||||||
|
[ $VERBOSE ] && echo "Waiting timeout of $WAITING_TIMEOUT seconds reached"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
WAITING_TOTAL=$(($WAITING_TOTAL + $t))
|
||||||
|
[ $VERBOSE ] && echo "Waiting additional $t second(s) and $WAITING_TOTAL second(s) in total"
|
||||||
|
sleep $t
|
||||||
|
[ -f "$DEVICE_ONLINE" ] && return
|
||||||
|
done
|
||||||
|
echo "Error: device $DEV still not ready"
|
||||||
|
}
|
||||||
|
|
||||||
|
# wait until recently unblocked devices are ready
|
||||||
|
# at this point we know the content of ALL_DEVICES is syntacticly correct
|
||||||
|
wait_on_devices()
|
||||||
|
{
|
||||||
|
OLD_IFS=$IFS
|
||||||
|
IFS=","
|
||||||
|
set $ALL_DEVICES
|
||||||
|
for DEV in $*
|
||||||
|
do
|
||||||
|
IFS="."
|
||||||
|
|
||||||
|
# get the lower bound for range or get the single device
|
||||||
|
LOWER=${DEV%%-*}
|
||||||
|
set $LOWER
|
||||||
|
if [ $# -eq 1 ]; then
|
||||||
|
L0=0
|
||||||
|
L1=0
|
||||||
|
L2=$(printf "%d" "0x$1")
|
||||||
|
else
|
||||||
|
L0=$(printf "%d" "0x$1")
|
||||||
|
L1=$(printf "%d" "0x$2")
|
||||||
|
L2=$(printf "%d" "0x$3")
|
||||||
|
fi
|
||||||
|
|
||||||
|
# get the upper bound for range or get the single device
|
||||||
|
UPPER=${DEV##*-}
|
||||||
|
set $UPPER
|
||||||
|
if [ $# -eq 1 ]; then
|
||||||
|
U0=0
|
||||||
|
U1=0
|
||||||
|
U2=$(printf "%d" "0x$1")
|
||||||
|
else
|
||||||
|
U0=$(printf "%d" "0x$1")
|
||||||
|
U1=$(printf "%d" "0x$2")
|
||||||
|
U2=$(printf "%d" "0x$3")
|
||||||
|
fi
|
||||||
|
|
||||||
|
IFS=$OLD_IFS
|
||||||
|
|
||||||
|
# iterate thru all devices
|
||||||
|
i=$L0
|
||||||
|
while [ $i -le $U0 ]; do
|
||||||
|
[ $i -eq $L0 ] && LJ=$L1 || LJ=0
|
||||||
|
[ $i -eq $U0 ] && UJ=$U1 || UJ=3
|
||||||
|
|
||||||
|
j=$LJ
|
||||||
|
while [ $j -le $UJ ]; do
|
||||||
|
[ $i -eq $L0 -a $j -eq $L1 ] && LK=$L2 || LK=0
|
||||||
|
[ $i -eq $U0 -a $j -eq $U1 ] && UK=$U2 || UK=65535
|
||||||
|
|
||||||
|
k=$LK
|
||||||
|
while [ $k -le $UK ]; do
|
||||||
|
wait_on_single_device "$(printf %x.%x.%04x $i $j $k)"
|
||||||
|
k=$(($k + 1))
|
||||||
|
done
|
||||||
|
j=$(($j + 1))
|
||||||
|
done
|
||||||
|
i=$(($i + 1))
|
||||||
|
done
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
process_config_file()
|
||||||
|
{
|
||||||
|
local CONFIG
|
||||||
|
|
||||||
|
[ -z "$1" ] && return
|
||||||
|
|
||||||
|
CONFIG="$1"
|
||||||
|
if [ -f "$CONFIG" ]; then
|
||||||
|
while read line; do
|
||||||
|
case $line in
|
||||||
|
\#*) ;;
|
||||||
|
*)
|
||||||
|
[ -z "$line" ] && continue
|
||||||
|
set $line
|
||||||
|
free_device $1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done < "$CONFIG"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# check how we were called
|
||||||
|
CMD=${0##*/}
|
||||||
|
DIR=${0%/*}
|
||||||
|
ARGS=$@
|
||||||
|
case $CMD in
|
||||||
|
"dasd_cio_free")
|
||||||
|
MODE_DASD="yes"
|
||||||
|
;;
|
||||||
|
"zfcp_cio_free")
|
||||||
|
MODE_ZFCP="yes"
|
||||||
|
;;
|
||||||
|
"znet_cio_free")
|
||||||
|
MODE_ZNET="yes"
|
||||||
|
;;
|
||||||
|
"device_cio_free")
|
||||||
|
MODE_DASD="yes"
|
||||||
|
MODE_ZFCP="yes"
|
||||||
|
MODE_ZNET="yes"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Error: unknown alias '$CMD'."
|
||||||
|
echo "Supported aliases are dasd_cio_free, zfcp_cio_free and znet_cio_free."
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# process command line options
|
||||||
|
while [ $# -gt 0 ]; do
|
||||||
|
case $1 in
|
||||||
|
-V|--verbose)
|
||||||
|
VERBOSE=yes
|
||||||
|
;;
|
||||||
|
-h|--help)
|
||||||
|
usage
|
||||||
|
;;
|
||||||
|
-d|--device)
|
||||||
|
shift
|
||||||
|
if [ "$1" ]; then
|
||||||
|
if [ "$DEVICE" ]; then
|
||||||
|
DEVICE="$DEVICE,$1"
|
||||||
|
else
|
||||||
|
DEVICE=$1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "Error: no device given"
|
||||||
|
usage
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Error: unknown option $1"
|
||||||
|
usage
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ ! -f $BLACKLIST ]; then
|
||||||
|
echo "Error: $BLACKLIST kernel interface doesn't exist"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$DEVICE" ]; then
|
||||||
|
[ $VERBOSE ] && echo "Freeing specific devices"
|
||||||
|
free_device $DEVICE
|
||||||
|
wait_on_devices
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $VERBOSE ]; then
|
||||||
|
echo -n "Freeing devices:"
|
||||||
|
[ $MODE_DASD ] && echo -n " dasd"
|
||||||
|
[ $MODE_ZFCP ] && echo -n " zfcp"
|
||||||
|
[ $MODE_ZNET ] && echo -n " znet"
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
|
||||||
|
[ $MODE_DASD ] && process_config_file $DASDCONFIG
|
||||||
|
[ $MODE_ZFCP ] && process_config_file $ZFCPCONFIG
|
||||||
|
|
||||||
|
if [ $MODE_DASD ]; then
|
||||||
|
# process the device list defined as option for the dasd module
|
||||||
|
DEVICES=$(modprobe --showconfig | LANG=C grep "options[[:space:]]\+dasd_mod" | \
|
||||||
|
sed -e 's/.*[[:space:]]dasd=\([^[:space:]]*\).*/\1/' -e 's/([^)]*)//g' \
|
||||||
|
-e 's/nopav\|nofcx\|autodetect\|probeonly//g' -e 's/,,/,/g' -e 's/^,//' -e 's/,$//')
|
||||||
|
|
||||||
|
for DEVRANGE in $(echo $DEVICES | sed 's/,/ /g'); do
|
||||||
|
free_device $DEVRANGE
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $MODE_ZNET ]; then
|
||||||
|
# process the config file
|
||||||
|
if [ -f "$ZNETCONFIG" ]; then
|
||||||
|
while read line; do
|
||||||
|
case $line in
|
||||||
|
\#*) ;;
|
||||||
|
*)
|
||||||
|
[ -z "$line" ] && continue
|
||||||
|
# grep 2 or 3 channels from each "<nettype>,<subchannels>,<options>" line
|
||||||
|
DEVICES=$(echo $line | LANG=C grep -E -i -o "([0-9]\.[0-9]\.[a-f0-9]+,){1,2}([0-9]\.[0-9]\.[a-f0-9]+)")
|
||||||
|
free_device $DEVICES
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done < "$ZNETCONFIG"
|
||||||
|
fi
|
||||||
|
# process channels from network interface configurations
|
||||||
|
if [ -z "$__sed_discard_ignored_files" ]; then
|
||||||
|
if [ -f /etc/init.d/functions ]; then
|
||||||
|
. /etc/init.d/functions
|
||||||
|
else
|
||||||
|
# default value copied from initscripts 9.03.10
|
||||||
|
__sed_discard_ignored_files='/\(~\|\.bak\|\.orig\|\.rpmnew\|\.rpmorig\|\.rpmsave\)$/d'
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
for line in $(LANG=C grep -E -i -h \
|
||||||
|
"^[[:space:]]*SUBCHANNELS=['\"]?([0-9]\.[0-9]\.[a-f0-9]+,){1,2}([0-9]\.[0-9]\.[a-f0-9]+)['\"]?([[:space:]]+#|[[:space:]]*$)" \
|
||||||
|
$( (ls /etc/sysconfig/network-scripts/ifcfg-* 2> /dev/null || echo "__no_config_file") | \
|
||||||
|
LC_ALL=C sed -e "$__sed_discard_ignored_files") 2> /dev/null)
|
||||||
|
do
|
||||||
|
eval "$line"
|
||||||
|
free_device $SUBCHANNELS
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
[ -z "$ALL_DEVICES" ] && exit 0
|
||||||
|
|
||||||
|
wait_on_devices
|
11
device_cio_free.conf
Normal file
11
device_cio_free.conf
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#
|
||||||
|
# free all devices on startup
|
||||||
|
#
|
||||||
|
|
||||||
|
start on starting rcS
|
||||||
|
|
||||||
|
task
|
||||||
|
|
||||||
|
console output
|
||||||
|
|
||||||
|
exec /sbin/device_cio_free
|
25
lib-zfcp-hbaapi-2.0-module.patch
Normal file
25
lib-zfcp-hbaapi-2.0-module.patch
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
diff -up lib-zfcp-hbaapi-2.0/Makefile.am.orig lib-zfcp-hbaapi-2.0/Makefile.am
|
||||||
|
--- lib-zfcp-hbaapi-2.0/Makefile.am.orig 2009-11-05 17:22:58.000000000 +0100
|
||||||
|
+++ lib-zfcp-hbaapi-2.0/Makefile.am 2009-11-09 14:07:17.000000000 +0100
|
||||||
|
@@ -66,6 +66,9 @@ libzfcphbaapi_la_LDFLAGS = \
|
||||||
|
-lpthread -Wl,-init,_initvlib,-fini,_finivlib \
|
||||||
|
-export-symbols $(SYMFILE)
|
||||||
|
|
||||||
|
+if VENDORLIB
|
||||||
|
+libzfcphbaapi_la_LDFLAGS += -module -avoid-version -release $(VERSION)
|
||||||
|
+endif
|
||||||
|
|
||||||
|
if DOCS
|
||||||
|
man_MANS = libzfcphbaapi.3 dox/man/man3/SupportedHBAAPIs.3 \
|
||||||
|
diff -up lib-zfcp-hbaapi-2.0/Makefile.in.orig lib-zfcp-hbaapi-2.0/Makefile.in
|
||||||
|
--- lib-zfcp-hbaapi-2.0/Makefile.in.orig 2009-11-09 14:06:58.000000000 +0100
|
||||||
|
+++ lib-zfcp-hbaapi-2.0/Makefile.in 2009-11-09 14:08:40.000000000 +0100
|
||||||
|
@@ -254,6 +254,8 @@ libzfcphbaapi_la_LDFLAGS = \
|
||||||
|
-lpthread -Wl,-init,_initvlib,-fini,_finivlib \
|
||||||
|
-export-symbols $(SYMFILE)
|
||||||
|
|
||||||
|
+@VENDORLIB_TRUE@libzfcphbaapi_la_LDFLAGS += -module -avoid-version -release $(VERSION)
|
||||||
|
+
|
||||||
|
@DOCS_FALSE@man_MANS = libzfcphbaapi.3
|
||||||
|
@DOCS_TRUE@man_MANS = libzfcphbaapi.3 dox/man/man3/SupportedHBAAPIs.3 \
|
||||||
|
@DOCS_TRUE@ dox/man/man3/UnSupportedHBAAPIs.3 dox/man/man3/hbaapi.h.3
|
36
lib-zfcp-hbaapi-2.0-sgutils.patch
Normal file
36
lib-zfcp-hbaapi-2.0-sgutils.patch
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
diff -Nrup lib-zfcp-hbaapi-2.0.orig/Makefile.am lib-zfcp-hbaapi-2.0/Makefile.am
|
||||||
|
--- lib-zfcp-hbaapi-2.0.orig/Makefile.am 2008-11-21 15:08:13.000000000 +0100
|
||||||
|
+++ lib-zfcp-hbaapi-2.0/Makefile.am 2009-09-25 12:30:07.000000000 +0200
|
||||||
|
@@ -60,7 +60,7 @@ lib_LTLIBRARIES = libzfcphbaapi.la
|
||||||
|
|
||||||
|
libzfcphbaapi_la_SOURCES = vlib.c vlib_callbacks.c vlib_aux.c vlib_sysfs.c \
|
||||||
|
vlib_sg.c
|
||||||
|
-libzfcphbaapi_la_LIBADD = -lsysfs -lsgutils
|
||||||
|
+libzfcphbaapi_la_LIBADD = -lsysfs -lsgutils2
|
||||||
|
libzfcphbaapi_la_LDFLAGS = \
|
||||||
|
-version-info $(LIB_CURRENT):$(LIB_REVISION):$(LIB_AGE) \
|
||||||
|
-lpthread -Wl,-init,_initvlib,-fini,_finivlib \
|
||||||
|
diff -Nrup lib-zfcp-hbaapi-2.0.orig/Makefile.in lib-zfcp-hbaapi-2.0/Makefile.in
|
||||||
|
--- lib-zfcp-hbaapi-2.0.orig/Makefile.in 2008-11-21 15:08:18.000000000 +0100
|
||||||
|
+++ lib-zfcp-hbaapi-2.0/Makefile.in 2009-09-25 13:22:04.000000000 +0200
|
||||||
|
@@ -248,7 +248,7 @@ lib_LTLIBRARIES = libzfcphbaapi.la
|
||||||
|
libzfcphbaapi_la_SOURCES = vlib.c vlib_callbacks.c vlib_aux.c vlib_sysfs.c \
|
||||||
|
vlib_sg.c
|
||||||
|
|
||||||
|
-libzfcphbaapi_la_LIBADD = -lsysfs -lsgutils
|
||||||
|
+libzfcphbaapi_la_LIBADD = -lsysfs -lsgutils2
|
||||||
|
libzfcphbaapi_la_LDFLAGS = \
|
||||||
|
-version-info $(LIB_CURRENT):$(LIB_REVISION):$(LIB_AGE) \
|
||||||
|
-lpthread -Wl,-init,_initvlib,-fini,_finivlib \
|
||||||
|
diff -Nrup lib-zfcp-hbaapi-2.0.orig/vlib_sg.c lib-zfcp-hbaapi-2.0/vlib_sg.c
|
||||||
|
--- lib-zfcp-hbaapi-2.0.orig/vlib_sg.c 2008-11-20 10:23:34.000000000 +0100
|
||||||
|
+++ lib-zfcp-hbaapi-2.0/vlib_sg.c 2009-09-25 13:21:52.000000000 +0200
|
||||||
|
@@ -19,6 +19,8 @@
|
||||||
|
* @brief All calls that use sg_utils library.
|
||||||
|
*/
|
||||||
|
|
||||||
|
+#include <scsi/sg_lib.h>
|
||||||
|
+#include <scsi/sg_cmds.h>
|
||||||
|
#include "vlib.h"
|
||||||
|
|
||||||
|
#define INTERVAL 10000000
|
172
mon_statd.initd
Normal file
172
mon_statd.initd
Normal file
@ -0,0 +1,172 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
#
|
||||||
|
# chkconfig: 2345 90 10
|
||||||
|
# description: Configure the mon_fsstatd and mon_procd daemons.
|
||||||
|
|
||||||
|
### BEGIN INIT INFO
|
||||||
|
# Provides: mon_statd
|
||||||
|
# Required-Start: $local_fs $remote_fs
|
||||||
|
# Required-Stop: $local_fs $remote_fs
|
||||||
|
# Should-Start:
|
||||||
|
# Should-Stop:
|
||||||
|
# Default-Start: 2 3 4 5
|
||||||
|
# Default-Stop: 0 1 6
|
||||||
|
# Short-Description: Configure the mon_fsstatd and mon_procd daemons.
|
||||||
|
# Description: Configures the mon_fsstatd and mon_procd daemons. It uses the
|
||||||
|
# configuration file /etc/sysconfig/mon_statd.
|
||||||
|
### END INIT INFO
|
||||||
|
|
||||||
|
# Source function library.
|
||||||
|
. /etc/rc.d/init.d/functions
|
||||||
|
|
||||||
|
exec_fsstat="/usr/sbin/mon_fsstatd"
|
||||||
|
prog_fsstat="mon_fsstatd"
|
||||||
|
exec_proc="/usr/sbin/mon_procd"
|
||||||
|
prog_proc="mon_procd"
|
||||||
|
|
||||||
|
config="/etc/sysconfig/mon_statd"
|
||||||
|
g_retval=0
|
||||||
|
|
||||||
|
lockfile_fsstat=/var/lock/subsys/$prog_fsstat
|
||||||
|
lockfile_proc=/var/lock/subsys/$prog_proc
|
||||||
|
|
||||||
|
[ -e $config ] && . $config || exit 6
|
||||||
|
|
||||||
|
load_kernel_module()
|
||||||
|
{
|
||||||
|
if [ ! -e /dev/monwriter ]; then
|
||||||
|
echo "Loading monwriter module..."
|
||||||
|
modprobe monwriter 2>&1
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
udevsettle
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
start_fsstat() {
|
||||||
|
[ `id -u` -eq 0 ] || exit 4
|
||||||
|
load_kernel_module
|
||||||
|
[ -x $exec_fsstat ] || exit 5
|
||||||
|
echo -n $"Starting $prog_fsstat: "
|
||||||
|
daemon $exec_fsstat -i $FSSTAT_INTERVAL
|
||||||
|
retval=$?
|
||||||
|
echo
|
||||||
|
[ $retval -eq 0 ] && touch $lockfile_fsstat
|
||||||
|
return $retval
|
||||||
|
}
|
||||||
|
|
||||||
|
start_proc() {
|
||||||
|
[ `id -u` -eq 0 ] || exit 4
|
||||||
|
load_kernel_module
|
||||||
|
[ -x $exec_proc ] || exit 5
|
||||||
|
echo -n $"Starting $prog_proc: "
|
||||||
|
daemon $exec_proc -i $PROC_INTERVAL
|
||||||
|
retval=$?
|
||||||
|
echo
|
||||||
|
[ $retval -eq 0 ] && touch $lockfile_proc
|
||||||
|
return $retval
|
||||||
|
}
|
||||||
|
|
||||||
|
stop_fsstat() {
|
||||||
|
[ `id -u` -eq 0 ] || exit 4
|
||||||
|
echo -n $"Stopping $prog_fsstat: "
|
||||||
|
killproc $exec_fsstat
|
||||||
|
retval=$?
|
||||||
|
echo
|
||||||
|
[ $retval -eq 0 ] && rm -f $lockfile_fsstat
|
||||||
|
return $retval
|
||||||
|
}
|
||||||
|
|
||||||
|
stop_proc() {
|
||||||
|
[ `id -u` -eq 0 ] || exit 4
|
||||||
|
echo -n $"Stopping $prog_proc: "
|
||||||
|
killproc $exec_proc
|
||||||
|
retval=$?
|
||||||
|
echo
|
||||||
|
[ $retval -eq 0 ] && rm -f $lockfile_proc
|
||||||
|
return $retval
|
||||||
|
}
|
||||||
|
|
||||||
|
restart_fsstat() {
|
||||||
|
stop_fsstat
|
||||||
|
start_fsstat
|
||||||
|
}
|
||||||
|
|
||||||
|
restart_proc() {
|
||||||
|
stop_proc
|
||||||
|
start_proc
|
||||||
|
}
|
||||||
|
|
||||||
|
reload_fsstat() {
|
||||||
|
restart_fsstat
|
||||||
|
}
|
||||||
|
|
||||||
|
reload_proc() {
|
||||||
|
restart_proc
|
||||||
|
}
|
||||||
|
|
||||||
|
force_reload_fsstat() {
|
||||||
|
restart_fsstat
|
||||||
|
}
|
||||||
|
|
||||||
|
force_reload_proc() {
|
||||||
|
restart_proc
|
||||||
|
}
|
||||||
|
|
||||||
|
rh_status_fsstat() {
|
||||||
|
# run checks to determine if the service is running or use generic status
|
||||||
|
status $exec_fsstat
|
||||||
|
}
|
||||||
|
|
||||||
|
rh_status_proc() {
|
||||||
|
# run checks to determine if the service is running or use generic status
|
||||||
|
status $exec_proc
|
||||||
|
}
|
||||||
|
|
||||||
|
rh_status_fsstat_q() {
|
||||||
|
rh_status_fsstat >/dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
rh_status_proc_q() {
|
||||||
|
rh_status_proc >/dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
start)
|
||||||
|
[ $FSSTAT = "yes" ] && { rh_status_fsstat_q || { start_fsstat ; g_retval=$? ; } || { g_retval=0 ; } }
|
||||||
|
[ $PROC = "yes" ] && { rh_status_proc_q || { start_proc ; g_retval=$? ; } || { g_retval=0 ; } }
|
||||||
|
;;
|
||||||
|
stop)
|
||||||
|
[ $FSSTAT = "yes" ] && { rh_status_fsstat_q && { stop_fsstat ; g_retval=$? ; } || { g_retval=0 ; } }
|
||||||
|
[ $PROC = "yes" ] && { rh_status_proc_q && { stop_proc ; g_retval=$? ; } || { g_retval=0 ; } }
|
||||||
|
;;
|
||||||
|
restart)
|
||||||
|
[ $FSSTAT = "yes" ] && { restart_fsstat ; g_retval=$? ; }
|
||||||
|
[ $PROC = "yes" ] && { restart_proc ; g_retval=$? ; }
|
||||||
|
;;
|
||||||
|
reload)
|
||||||
|
[ $FSSTAT = "yes" ] && { rh_status_fsstat_q && { reload_fsstat ; g_retval=$? ; } || { g_retval=7 ; } }
|
||||||
|
[ $PROC = "yes" ] && { rh_status_proc_q && { reload_proc ; g_retval=$? ; } || { g_retval=7 ; } }
|
||||||
|
;;
|
||||||
|
force-reload)
|
||||||
|
[ $FSSTAT = "yes" ] && { force_reload_fsstat ; g_retval=$? ; }
|
||||||
|
[ $PROC = "yes" ] && { force_reload_proc ; g_retval=$? ; }
|
||||||
|
;;
|
||||||
|
status)
|
||||||
|
[ $FSSTAT = "yes" ] && { rh_status_fsstat ; g_retval=$? ; }
|
||||||
|
[ $PROC = "yes" ] && { rh_status_proc ; g_retval=$? ; }
|
||||||
|
;;
|
||||||
|
condrestart|try-restart)
|
||||||
|
[ $FSSTAT = "yes" ] && { rh_status_fsstat_q && { restart_fsstat ; g_retval=$? ; } || { g_retval=0 ; } }
|
||||||
|
[ $PROC = "yes" ] && { rh_status_proc_q && { restart_proc ; g_retval=$? ; } || { g_retval=0 ; } }
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
|
||||||
|
exit 2
|
||||||
|
esac
|
||||||
|
exit $g_retval
|
5
s390.csh
Normal file
5
s390.csh
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# /etc/profile.d/s390.csh - set TERM variable
|
||||||
|
|
||||||
|
if ( `/sbin/consoletype stdout` == "serial" ) then
|
||||||
|
setenv TERM dumb
|
||||||
|
endif
|
6
s390.sh
Normal file
6
s390.sh
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
# /etc/profile.d/s390.sh - set TERM variable
|
||||||
|
|
||||||
|
contype=`/sbin/consoletype stdout`
|
||||||
|
if [ "$contype" == "serial" ]; then
|
||||||
|
export TERM=dumb
|
||||||
|
fi
|
1512
s390utils.spec
Normal file
1512
s390utils.spec
Normal file
File diff suppressed because it is too large
Load Diff
4
sources
Normal file
4
sources
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
856ecdd42ad358433eb3fcc886b58a89 s390-tools-1.8.2.tar.bz2
|
||||||
|
71a8ee5918f2c44c385fcfe8350cdc98 cmsfs-1.1.8c.tar.gz
|
||||||
|
2cbfffca3f07c61420899f45d221d451 lib-zfcp-hbaapi-2.0.tar.gz
|
||||||
|
ba42772e5b305b5e147344442cd70826 src_vipa-2.0.4.tar.gz
|
74
src_vipa-2.0.4-locations.patch
Normal file
74
src_vipa-2.0.4-locations.patch
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
From b2f1bf78400c686bbdbcf4c29fbbb93367abe409 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?utf-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Wed, 25 Mar 2009 09:36:08 +0100
|
||||||
|
Subject: [PATCH] fix location of the library
|
||||||
|
|
||||||
|
---
|
||||||
|
Makefile | 7 +++----
|
||||||
|
1 files changed, 3 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Makefile b/Makefile
|
||||||
|
index 669b6c6..d395fa8 100644
|
||||||
|
--- a/Makefile
|
||||||
|
+++ b/Makefile
|
||||||
|
@@ -20,7 +20,8 @@ INSTALL=install
|
||||||
|
VERSION=2.0.4
|
||||||
|
|
||||||
|
# the path to the .so
|
||||||
|
-SRC_VIPA_PATH=$(INSTROOT)/usr/lib
|
||||||
|
+LIBDIR=/usr/lib
|
||||||
|
+SRC_VIPA_PATH=$(INSTROOT)$(LIBDIR)
|
||||||
|
# the path to the starter script
|
||||||
|
SRC_VIPA_STARTER_PATH=$(INSTROOT)/usr/sbin
|
||||||
|
# path to man page
|
||||||
|
@@ -34,8 +35,7 @@ src_vipa.so: src_vipa.c
|
||||||
|
|
||||||
|
src_vipa.sh:
|
||||||
|
echo '#!/bin/bash' > src_vipa.sh
|
||||||
|
- echo 'export LD_LIBRARY_PATH=$(SRC_VIPA_PATH):$$LD_LIBRARY_PATH' >> src_vipa.sh
|
||||||
|
- echo 'export LD_PRELOAD=$(SRC_VIPA_PATH)/src_vipa.so' >> src_vipa.sh
|
||||||
|
+ echo 'export LD_PRELOAD=$(LIBDIR)/src_vipa.so' >> src_vipa.sh
|
||||||
|
echo 'exec $$@' >> src_vipa.sh
|
||||||
|
chmod 755 src_vipa.sh
|
||||||
|
|
||||||
|
@@ -44,7 +44,6 @@ install: src_vipa.so src_vipa.sh
|
||||||
|
$(INSTALL) -m 755 src_vipa.so $(SRC_VIPA_PATH)
|
||||||
|
$(INSTALL) -m 755 src_vipa.sh $(SRC_VIPA_STARTER_PATH)
|
||||||
|
$(INSTALL) -m 644 src_vipa.8 $(SRC_VIPA_MANPAGE_PATH)/man8
|
||||||
|
- ldconfig
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f src_vipa.{i,s,o,sh,so} core src_vipa-$(VERSION).tar.gz
|
||||||
|
--
|
||||||
|
1.6.0.6
|
||||||
|
|
||||||
|
From 5c21f29f4d9e82942a997775c111280b85d01bb8 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?utf-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
||||||
|
Date: Wed, 22 Apr 2009 12:53:55 +0200
|
||||||
|
Subject: [PATCH] make the man page path and script path configurable
|
||||||
|
|
||||||
|
---
|
||||||
|
Makefile | 6 ++++--
|
||||||
|
1 files changed, 4 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Makefile b/Makefile
|
||||||
|
index d395fa8..365472b 100644
|
||||||
|
--- a/Makefile
|
||||||
|
+++ b/Makefile
|
||||||
|
@@ -23,9 +23,11 @@ VERSION=2.0.4
|
||||||
|
LIBDIR=/usr/lib
|
||||||
|
SRC_VIPA_PATH=$(INSTROOT)$(LIBDIR)
|
||||||
|
# the path to the starter script
|
||||||
|
-SRC_VIPA_STARTER_PATH=$(INSTROOT)/usr/sbin
|
||||||
|
+SBINDIR=/usr/sbin
|
||||||
|
+SRC_VIPA_STARTER_PATH=$(INSTROOT)$(SBINDIR)
|
||||||
|
# path to man page
|
||||||
|
-SRC_VIPA_MANPAGE_PATH=$(INSTROOT)/usr/share/man
|
||||||
|
+MANDIR=/usr/share/man
|
||||||
|
+SRC_VIPA_MANPAGE_PATH=$(INSTROOT)$(MANDIR)
|
||||||
|
|
||||||
|
all: src_vipa.so src_vipa.sh
|
||||||
|
|
||||||
|
--
|
||||||
|
1.6.0.6
|
||||||
|
|
55
zfcpconf.sh
Normal file
55
zfcpconf.sh
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# config file syntax:
|
||||||
|
# deviceno WWPN FCPLUN
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
# 0.0.4000 0x5005076300C213e9 0x5022000000000000
|
||||||
|
# 0.0.4001 0x5005076300c213e9 0x5023000000000000
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# manual setup:
|
||||||
|
# modprobe zfcp
|
||||||
|
# echo 1 > /sys/bus/ccw/drivers/zfcp/0.0.4000/online
|
||||||
|
# echo LUN > /sys/bus/ccw/drivers/zfcp/0.0.4000/WWPN/unit_add
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
# modprobe zfcp
|
||||||
|
# echo 1 > /sys/bus/ccw/drivers/zfcp/0.0.4000/online
|
||||||
|
# echo 0x5022000000000000 > /sys/bus/ccw/drivers/zfcp/0.0.4000/0x5005076300c213e9/unit_add
|
||||||
|
|
||||||
|
CONFIG=/etc/zfcp.conf
|
||||||
|
PATH=/bin:/sbin
|
||||||
|
|
||||||
|
if [ -f "$CONFIG" ]; then
|
||||||
|
if [ ! -d /sys/bus/ccw/drivers/zfcp ]; then
|
||||||
|
modprobe zfcp
|
||||||
|
fi
|
||||||
|
if [ ! -d /sys/bus/ccw/drivers/zfcp ]; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
sed 'y/ABCDEF/abcdef/' < $CONFIG | while read line; do
|
||||||
|
case $line in
|
||||||
|
\#*) ;;
|
||||||
|
*)
|
||||||
|
[ -z "$line" ] && continue
|
||||||
|
set $line
|
||||||
|
if [ $# -eq 5 ]; then
|
||||||
|
DEVICE=$1
|
||||||
|
SCSIID=$2
|
||||||
|
WWPN=$3
|
||||||
|
SCSILUN=$4
|
||||||
|
FCPLUN=$5
|
||||||
|
echo "Warning: Deprecated values in /etc/zfcp.conf, ignoring SCSI ID $SCSIID and SCSI LUN $SCSILUN"
|
||||||
|
elif [ $# -eq 3 ]; then
|
||||||
|
DEVICE=${1##*0x}
|
||||||
|
WWPN=$2
|
||||||
|
FCPLUN=$3
|
||||||
|
fi
|
||||||
|
echo 1 > /sys/bus/ccw/drivers/zfcp/${DEVICE}/online
|
||||||
|
[ ! -d /sys/bus/ccw/drivers/zfcp/${DEVICE}/${WWPN}/${FCPLUN} ] \
|
||||||
|
&& echo $FCPLUN > /sys/bus/ccw/drivers/zfcp/${DEVICE}/${WWPN}/unit_add
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
fi
|
Loading…
Reference in New Issue
Block a user