rpms/s390utils/devel 0015-s390tools-1.8.2-zipl-dm.patch, NONE, 1.1 0016-s390tools-1.8.2-lsreipl-nss.patch, NONE, 1.1 0017-qualified-return-codes-and-further-error-handling-in.patch, NONE, 1.1 device_cio_free, NONE, 1.1 s390utils.spec, 1.14, 1.15
Dan Horák
sharkcz at fedoraproject.org
Tue Dec 22 11:00:08 UTC 2009
Author: sharkcz
Update of /cvs/pkgs/rpms/s390utils/devel
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv15366
Modified Files:
s390utils.spec
Added Files:
0015-s390tools-1.8.2-zipl-dm.patch
0016-s390tools-1.8.2-lsreipl-nss.patch
0017-qualified-return-codes-and-further-error-handling-in.patch
device_cio_free
Log Message:
* Tue Dec 22 2009 Dan Horák <dan[at]danny.cz> 2:1.8.2-6
- fixed return value in cpi initscript (#541389)
- updated zfcpconf.sh script from dracut
- added device-mapper support into zipl (#546280)
- added missing check and print NSS name in case an NSS has been IPLed (#546297)
- added device_cio_free script and its symlinks
- added qualified return codes and further error handling in znetconf (#548487)
0015-s390tools-1.8.2-zipl-dm.patch:
include/disk.h | 25 +
include/install.h | 9
include/job.h | 17
include/scan.h | 19 -
man/zipl.8 | 88 +++++
man/zipl.conf.5 | 71 ++++
src/Makefile | 1
src/bootmap.c | 70 +---
src/disk.c | 242 +++++++++++---
src/install.c | 11
src/job.c | 362 ++++++++++++++++++++-
src/scan.c | 262 ++++++++++++++-
src/zipl.c | 13
src/zipl_helper.device-mapper | 717 +++++++++++++++++++++++++++++++++++++++++-
14 files changed, 1759 insertions(+), 148 deletions(-)
--- NEW FILE 0015-s390tools-1.8.2-zipl-dm.patch ---
>From e089f907d7ba7f18479eaff61852171842a219e2 Mon Sep 17 00:00:00 2001
From: =?utf-8?q?Dan=20Hor=C3=A1k?= <dan at danny.cz>
Date: Thu, 10 Dec 2009 18:27:58 +0100
Subject: [PATCH 15/16] s390tools-1.8.2-zipl-dm
device mapper support for zipl
---
zipl/include/disk.h | 25 ++-
zipl/include/install.h | 9 +-
zipl/include/job.h | 17 +-
zipl/include/scan.h | 19 +-
zipl/man/zipl.8 | 88 +++++-
zipl/man/zipl.conf.5 | 71 ++++-
zipl/src/Makefile | 1 +
zipl/src/bootmap.c | 70 ++---
zipl/src/disk.c | 242 ++++++++++---
zipl/src/install.c | 11 +-
zipl/src/job.c | 362 +++++++++++++++++-
zipl/src/scan.c | 262 ++++++++++++-
zipl/src/zipl.c | 13 +-
zipl/src/zipl_helper.device-mapper | 716 ++++++++++++++++++++++++++++++++++++
14 files changed, 1759 insertions(+), 147 deletions(-)
create mode 100644 zipl/src/zipl_helper.device-mapper
diff --git a/zipl/include/disk.h b/zipl/include/disk.h
index c5179b7..4b39698 100644
--- a/zipl/include/disk.h
+++ b/zipl/include/disk.h
@@ -2,7 +2,7 @@
* s390-tools/zipl/include/disk.h
* Functions to handle disk layout specific operations.
*
- * Copyright IBM Corp. 2001, 2006.
+ * Copyright IBM Corp. 2001, 2009.
*
* Author(s): Carsten Otte <cotte at de.ibm.com>
* Peter Oberparleiter <Peter.Oberparleiter at de.ibm.com>
@@ -59,6 +59,19 @@ struct hd_geometry {
unsigned long start;
};
+/* Disk information source */
+typedef enum {
+ source_auto,
+ source_user,
+ source_script
+} source_t;
+
+/* targetbase definition */
+typedef enum {
+ defined_as_device,
+ defined_as_name
+} definition_t;
+
/* Disk information type */
struct disk_info {
disk_type_t type;
@@ -72,11 +85,17 @@ struct disk_info {
struct hd_geometry geo;
char* name;
char* drv_name;
+ source_t source;
+ definition_t targetbase;
};
+struct job_target_data;
-int disk_get_info(const char* device, struct disk_info** info);
-int disk_get_info_from_file(const char* filename, struct disk_info** info);
+int disk_get_info(const char* device, struct job_target_data* target,
+ struct disk_info** info);
+int disk_get_info_from_file(const char* filename,
+ struct job_target_data* target,
+ struct disk_info** info);
void disk_free_info(struct disk_info* info);
char* disk_get_type_name(disk_type_t type);
int disk_is_large_volume(struct disk_info* info);
diff --git a/zipl/include/install.h b/zipl/include/install.h
index ba31bff..5504deb 100644
--- a/zipl/include/install.h
+++ b/zipl/include/install.h
@@ -2,7 +2,7 @@
* s390-tools/zipl/include/install.h
* Functions handling the installation of the boot loader code onto disk.
*
- * Copyright IBM Corp. 2001, 2006.
+ * Copyright IBM Corp. 2001, 2009.
*
* Author(s): Carsten Otte <cotte at de.ibm.com>
* Peter Oberparleiter <Peter.Oberparleiter at de.ibm.com>
@@ -24,8 +24,9 @@ int install_tapeloader(const char* device, const char* image,
const char* parmline, const char* ramdisk,
address_t image_addr, address_t parm_addr,
address_t initrd_addr);
-int install_dump(const char* device, uint64_t mem);
-int install_mvdump(char* const device[], int device_count, uint64_t mem,
- uint8_t force);
+int install_dump(const char* device, struct job_target_data* target,
+ uint64_t mem);
+int install_mvdump(char* const device[], struct job_target_data* target,
+ int device_count, uint64_t mem, uint8_t force);
#endif /* INSTALL_H */
diff --git a/zipl/include/job.h b/zipl/include/job.h
index 824ffc4..cf881db 100644
--- a/zipl/include/job.h
+++ b/zipl/include/job.h
@@ -3,7 +3,7 @@
* Functions and data structures representing the actual 'job' that the
* user wants us to execute.
*
- * Copyright IBM Corp. 2001, 2006.
+ * Copyright IBM Corp. 2001, 2009.
*
* Author(s): Carsten Otte <cotte at de.ibm.com>
* Peter Oberparleiter <Peter.Oberparleiter at de.ibm.com>
@@ -13,6 +13,7 @@
#define JOB_H
#include "zipl.h"
+#include "disk.h"
enum job_id {
@@ -27,6 +28,17 @@ enum job_id {
job_mvdump = 9,
};
+struct job_target_data {
+ char* bootmap_dir;
+ char* targetbase;
+ disk_type_t targettype;
+ int targetcylinders;
+ int targetheads;
+ int targetsectors;
+ int targetblocksize;
+ blocknum_t targetoffset;
+};
+
struct job_ipl_data {
char* image;
char* parmline;
@@ -94,7 +106,7 @@ struct job_menu_data {
struct job_data {
enum job_id id;
- char* bootmap_dir;
+ struct job_target_data target;
char* name;
union {
struct job_ipl_data ipl;
@@ -115,5 +127,6 @@ struct job_data {
int job_get(int argc, char* argv[], struct job_data** data);
void job_free(struct job_data* job);
+int type_from_target(char *target, disk_type_t *type);
#endif /* not JOB_H */
diff --git a/zipl/include/scan.h b/zipl/include/scan.h
index b1c0e3a..ed5714e 100644
--- a/zipl/include/scan.h
+++ b/zipl/include/scan.h
@@ -2,7 +2,7 @@
* s390-tools/zipl/include/scan.h
* Scanner for zipl.conf configuration files
*
- * Copyright IBM Corp. 2001, 2006.
+ * Copyright IBM Corp. 2001, 2009.
*
* Author(s): Carsten Otte <cotte at de.ibm.com>
* Peter Oberparleiter <Peter.Oberparleiter at de.ibm.com>
@@ -15,7 +15,7 @@
#define SCAN_SECTION_NUM 7
-#define SCAN_KEYWORD_NUM 14
+#define SCAN_KEYWORD_NUM 19
enum scan_id {
scan_id_empty = 0,
@@ -40,6 +40,11 @@ enum scan_keyword_id {
scan_keyword_defaultmenu = 11,
scan_keyword_tape = 12,
scan_keyword_mvdump = 13,
+ scan_keyword_targetbase = 14,
+ scan_keyword_targettype = 15,
+ scan_keyword_targetgeometry = 16,
+ scan_keyword_targetblocksize = 17,
+ scan_keyword_targetoffset = 18,
};
enum scan_section_type {
@@ -53,6 +58,14 @@ enum scan_section_type {
section_mvdump = 6,
};
+enum scan_target_type {
+ target_type_invalid = -1,
+ target_type_scsi = 0,
[...2317 lines suppressed...]
+ $type = $DEV_TYPE_LDL;
+ } elsif ($format == 2) {
+ $type = $DEV_TYPE_CDL;
+ }
+ }
+
+ return ($type, $cyl, $heads, $sectors);
+}
+
+# get_partition_start(device)
+# Return the partition offset of device.
+sub get_partition_start($)
+{
+ my ($dev) = @_;
+ my $line;
+ my $offset;
+ local *HANDLE;
+
+ open(HANDLE, "$blockdev --report $dev 2>/dev/null|") or
+ return undef;
+ $line = <HANDLE>;
+ if ($line =~ /RO\s+RA\s+SSZ\s+BSZ\s+StartSec\s+Size\s+Device/) {
+ $line = <HANDLE>;
+ if ($line =~ /^\S+\s+\d+\s+\d+\s+\d+\s+(\d+)/) {
+ $offset = $1;
+ }
+ }
+ close(HANDLE);
+ return $offset;
+}
+
+# is_dasd(type)
+# Return whether disk with type is a DASD.
+sub is_dasd($)
+{
+ my ($type) = @_;
+
+ return ($type == $DEV_TYPE_CDL) || ($type == $DEV_TYPE_LDL) ||
+ ($type == $DEV_TYPE_FBA);
+}
+
+# get_partition_base(type, major, minor)
+# Return (major, minor) of the base device on which the partition is located.
+sub get_partition_base($$$)
+{
+ my ($type, $major, $minor) = @_;
+
+ if (is_dasd($type)) {
+ return ($major, $minor & ~$DASD_PARTN_MASK);
+ } else {
+ return ($major, $minor & ~$SCSI_PARTN_MASK);
+ }
+}
+
+# get_device_characteristics(major, minor)
+# Returns (type, blocksize, geometry, bootsectors, partstart) for device.
+sub get_device_characteristics($$)
+{
+ my ($major, $minor) = @_;
+ my $dev;
+ my $blocksize;
+ my $type;
+ my $cyl;
+ my $heads;
+ my $sectors;
+ my $geometry;
+ my $bootsectors;
+ my $partstart;
+
+ $dev = create_temp_device_node("b", $major, $minor);
+ $blocksize = get_blocksize($dev);
+ if (!defined($blocksize)) {
+ unlink($dev);
+ die("Error: Could not get block size for ".
+ get_device_name($major, $minor)."\n");
+ }
+ ($type, $cyl, $heads, $sectors) = get_dasd_info($dev);
+ if (defined($type)) {
+ $geometry = "$cyl,$heads,$sectors";
+ if ($type == $DEV_TYPE_CDL) {
+ # First track contains IPL records
+ $bootsectors = $blocksize * $sectors / $SECTOR_SIZE;
+ } elsif ($type == $DEV_TYPE_LDL) {
+ # First two blocks contain IPL records
+ $bootsectors = $blocksize * 2 / $SECTOR_SIZE;
+ } elsif ($type == $DEV_TYPE_FBA) {
+ # First block contains IPL records
+ $bootsectors = $blocksize / $SECTOR_SIZE;
+ }
+ } else {
+ # Assume SCSI if get_dasd_info failed
+ $type = $DEV_TYPE_SCSI;
+ # First block contains IPL records
+ $bootsectors = $blocksize / $SECTOR_SIZE;
+ }
+ $partstart = get_partition_start($dev);
+ unlink($dev);
+ if (!defined($partstart)) {
+ die("Error: Could not determine partition start for ".
+ get_device_name($major, $minor)."\n");
+ }
+ return ($type, $blocksize, $geometry, $bootsectors, $partstart);
+}
+
+# get_type_name(type)
+# Return textual representation of device type.
+sub get_type_name($)
+{
+ my ($type) = @_;
+
+ if ($type == $DEV_TYPE_CDL) {
+ return "CDL";
+ } elsif ($type == $DEV_TYPE_LDL) {
+ return "LDL";
+ } elsif ($type == $DEV_TYPE_FBA) {
+ return "FBA";
+ } elsif ($type == $DEV_TYPE_SCSI) {
+ return "SCSI";
+ }
+ return undef;
+}
+
+
+# check_for_mirror(index, target_list)
+# Die if there is a mirror target between index and 0.
+sub check_for_mirror($@)
+{
+ my ($i, @target_list) = @_;
+
+ for (;$i >= 0; $i--) {
+ my $entry = $target_list[$i];
+ my ($major, $minor, $target) = @$entry;
+
+ if ($target->[$TARGET_TYPE] == $TARGET_TYPE_MIRROR) {
+ # IPL records are not mirrored.
+ die("Error: Unsupported setup: Block 0 is not ".
+ "mirrored in device '".
+ get_device_name($major, $minor)."'\n");
+ }
+ }
+}
+
+# get_target_base(bottom_major, bottom_minor, start, length, target_list)
+# Return (major, minor) for the top most target in the target list that maps
+# the region on (bottom_major, bottom_minor) defined by start and length at
+# offset 0.
+sub get_target_base($$$$@)
+{
+ my ($bot_major, $bot_minor, $start, $length, @target_list) = @_;
+ my $entry;
+ my $top_major;
+ my $top_minor;
+ my $i;
+
+ # Pre-initialize with bottom major-minor
+ $top_major = $bot_major;
+ $top_minor = $bot_minor;
+ # Process all entries starting with the last one
+ for ($i = scalar(@target_list) - 1; $i >= 0; $i--) {
+ my $entry = $target_list[$i];
+ my ($major, $minor, $target) = @$entry;
+
+ if (($target->[$TARGET_START] != 0) ||
+ (get_target_start($target) != 0) ||
+ ($target->[$TARGET_LENGTH] < $length)) {
+ last;
+ }
+ $top_major = $major;
+ $top_minor = $minor;
+ }
+ # Check for mirrorring between base device and fs device.
+ check_for_mirror($i, @target_list);
+ return ($top_major, $top_minor);
+}
+
+# get_device_name(major, minor)
+# Return the name of the device specified by major and minor.
+sub get_device_name($$)
+{
+ my ($major, $minor) = @_;
+ my $name;
+ local *HANDLE;
+
+ $name = "$major:$minor";
+ open(HANDLE, "</proc/partitions") or goto out;
+ while (<HANDLE>) {
+ if (/^\s*(\d+)\s+(\d+)\s+\d+\s+(\S+)\s*$/) {
+ if (($major == $1) && ($minor == $2)) {
+ $name = $3;
+ last;
+ }
+ }
+ }
+ close(HANDLE);
+out:
+ return $name;
+}
--
1.6.3.3
0016-s390tools-1.8.2-lsreipl-nss.patch:
ccw.c | 42 ++++++++++++++++++------------------------
chreipl.h | 9 ++++++---
fcp.c | 13 +++++++------
ipl.c | 57 +++++++++++++++++++++++++++++++++++----------------------
main.c | 25 +++++++++++++++++++------
system.c | 4 ++--
6 files changed, 87 insertions(+), 63 deletions(-)
--- NEW FILE 0016-s390tools-1.8.2-lsreipl-nss.patch ---
>From 62fb535a68f1df693869e4361150259b42c6f211 Mon Sep 17 00:00:00 2001
From: =?utf-8?q?Dan=20Hor=C3=A1k?= <dan at 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
0017-qualified-return-codes-and-further-error-handling-in.patch:
znetconf | 324 +++++++++++++++++++++++++++++++++++--------------------------
znetconf.8 | 220 ++++++++++++++++++++++++++++++++++-------
2 files changed, 375 insertions(+), 169 deletions(-)
--- NEW FILE 0017-qualified-return-codes-and-further-error-handling-in.patch ---
>From 4725dd1a67185ab4296674fcd3b2cf17f2b1cf21 Mon Sep 17 00:00:00 2001
From: =?utf-8?q?Dan=20Hor=C3=A1k?= <dan at danny.cz>
Date: Thu, 17 Dec 2009 17:08:22 +0100
Subject: [PATCH] qualified return codes and further error handling in znetconf
Description: znetconf: qualified return codes and further error handling
Symptom: always returned 1 in case errors
Problem: wrapper tools not able to generate qualified error msgs
Solution: return codes
---
zconf/znetconf | 324 ++++++++++++++++++++++++++++++++----------------------
zconf/znetconf.8 | 219 +++++++++++++++++++++++++++++++------
2 files changed, 375 insertions(+), 168 deletions(-)
diff --git a/zconf/znetconf b/zconf/znetconf
index 4edf6fb..873124a 100755
--- a/zconf/znetconf
+++ b/zconf/znetconf
@@ -2,14 +2,58 @@
#
# znetconf - list and configure network devices
#
-# Tool for the automatic and semi-automatic configuration of network devices
+# Tool for the automatic and semi-automatic configuration of network devices
# from ccw devices, including network device option handling and network
# device removal.
#
-# Copyright IBM Corp. 2009
+# Copyright IBM Corp. 2009
# Author(s): Einar Lueck <elelueck at de.ibm.com>
# Steffen Maier <maier at de.ibm.com>
#
+# 9 Could not group devices
+readonly RC_COULD_NOT_GROUP_DEVICES=9
+# 10 Could not set device online
+readonly RC_COULD_NOT_SET_DEV_ONLINE=10
+# 11 Could not set device offline
+readonly RC_COULD_NOT_SET_DEV_OFFLINE=11
+# 12 Invalid attribute value pair
+readonly RC_INVALID_ATTRIBUTE_VALUE_PAIR=12
+# 13 Missing component (broken installation)
+readonly RC_BROKEN_INSTALLATION=13
+# 14 Missing device ID
+readonly RC_MISSING_DEVICE_ID=14
+# 15 Invalid device ID format
+readonly RC_INVALID_DEVICE_ID_FORMAT=15
+# 16 Driver name expected
+readonly RC_DRIVER_NAME_EXPECTED=16
+# 17 Unknown driver
+readonly RC_UNKNOWN_DRIVER=17
+# 18 Missing attribute value pair for -o|--option
+readonly RC_MISSING_ATTRIBUTE_VALUE_PAIR=18
+# 19 Invalid argument
+readonly RC_INVALID_ARGUMENT=19
+# 20 Too much arguments
+readonly RC_TOO_MUCH_ARGUMENTS=20
+# 21 No configuration found for device ID
+readonly RC_NO_CONFIG_FOUND_FOR_DEV=21
+# 22 Device is not configured
+readonly RC_DEVICE_NOT_CONFIGURED=22
+# 23 Could not ungroup device
+readonly RC_COULD_NOT_UNGROUP_DEVICE=23
+# 24 At least one option could not be configured
+readonly RC_OPTION_NOT_CONFIGURED=24
+# 25 Missing value for attribute
+readonly RC_MISSING_VALUE=25
+# 26 Device does not exist
+readonly RC_DEVICE_DOES_NOT_EXIST=26
+# 27 Device already in use
+readonly RC_DEVICE_ALREADY_IN_USE=27
+# 28 Net device did not come online
+readonly RC_NET_DEVICE_NOT_ONLINE=28
+# 29 Some devices could not be added or failed
+readonly RC_SOME_DEVICES_FAILED=29
+# 99 internal error, this should never happen
+readonly RC_INTERNAL_ERROR=99
#==============================================================================
# constants
@@ -29,6 +73,7 @@ else
fi
SYSFSDIR=$(cat /proc/mounts|awk '$3=="sysfs"{print $2; exit}')
CCWGROUPBUS_DIR=$SYSFSDIR/bus/ccwgroup
+CCWDEV_DIR=$SYSFSDIR/bus/ccw/devices
CCWGROUPBUS_DEVICEDIR=$CCWGROUPBUS_DIR/devices
CCWGROUPBUS_DRIVERDIR=$CCWGROUPBUS_DIR/drivers
DEVNOSEP=","
@@ -290,15 +335,14 @@ function lookup_layer()
#==============================================================================
#
-# group_device
+# group_device
# $1: ccwdevid[;ccwdevid][;ccwdevid]
# $2: ccwgroupdevid
# $3: driver
-# returns
+# returns
# 0 success
-# 1 group file not found
-# 2 grouping failed
-#
+# RC_COULD_NOT_GROUP_DEVICES
+#
function group_device()
{
local DEVICES=$1
@@ -307,13 +351,13 @@ function group_device()
local GROUPFILE=$CCWGROUPBUS_DRIVERDIR/$DRIVER/group
local CTCMGROUPFILE=$CCWGROUPBUS_DRIVERDIR/ctcm/group
local CTCGROUPFILE=$CCWGROUPBUS_DRIVERDIR/ctc/group
-
+
# check if group file exists
- if [ ! -e $GROUPFILE ]
+ if [ ! -e $GROUPFILE ]
then
# try to load driver
if ! modprobe $DRIVER &> /dev/null
- then
+ then
if [ $DRIVER = "ctc" ]
then
# check if ctcm driver exists
@@ -329,7 +373,7 @@ function group_device()
GROUPFILE=$CTCGROUPFILE
fi
fi
- fi
+ fi
fi
if [ -e $GROUPFILE ]
then
@@ -340,13 +384,13 @@ function group_device()
*)
print_error "Could not group devices" \
"$DEVICES"
- return 2
+ return $RC_COULD_NOT_GROUP_DEVICES
;;
esac
else
print_error "$GROUPFILE does not exist"
-
- return 1
+
+ return $RC_COULD_NOT_GROUP_DEVICES
fi
return 0
}
@@ -354,14 +398,13 @@ function group_device()
#==============================================================================
#
-# ungroup_device
+# ungroup_device
# $1: ccwgroupdevid
# $2: network device name (just for display purposes)
-# returns
+# returns
# 0 success
-# 1 group file not found
-# 2 ungrouping failed
-#
+# RC_COULD_NOT_UNGROUP_DEVICE
+#
function ungroup_device()
{
local TARGET_DEVID="$1"
@@ -378,12 +421,12 @@ function ungroup_device()
;;
*)
print_error "Failed to ungroup $TARGET_DEVID"
- return 2
+ return $RC_COULD_NOT_UNGROUP_DEVICE
;;
esac
else
print_error "$DEVICE_UNGROUPFILE does not exist."
- return 1
+ return $RC_COULD_NOT_UNGROUP_DEVICE
fi
return 0
}
@@ -393,12 +436,12 @@ function ungroup_device()
#
# try_read_netdevname
# $1: ccwgroupdevno
-# returns
+# returns
# 0 success
# 1 failed. giving up after retries
# stdout
# in case of success: device name
-#
+#
function try_read_netdevname()
{
local CCWGROUPDEVNO="$1"
@@ -406,7 +449,7 @@ function try_read_netdevname()
local NET_SUBDIR="$CCWGROUPBUS_DEVICEDIR/$CCWGROUPDEVNO/net/"
local IF_NAME=""
local rc=1
-
+
# check if interface file containing the name exists
if [ -e "$IF_NAME_FILE" ]
then
@@ -417,7 +460,7 @@ function try_read_netdevname()
IF_NAME=$(ls $NET_SUBDIR)
else
# if the file does not exist
- local LINKNAME=$(find $CCWGROUPBUS_DEVICEDIR/$CCWGROUPDEVNO/ -type l -name net*)
+ local LINKNAME=$(find $CCWGROUPBUS_DEVICEDIR/$CCWGROUPDEVNO/ -type l -name net*)
if [[ ! -z $LINKNAME ]]
then
IF_NAME=$(readlink $LINKNAME)
@@ -434,10 +477,10 @@ function try_read_netdevname()
#
# wait_for_net_device
# $1: ccwgroupdevno
-# returns
+# returns
# 0 success
# 1 failed. giving up after retries
-#
+#
function wait_for_net_device()
{
local CCWGROUPDEVNO="$1"
@@ -447,7 +490,7 @@ function wait_for_net_device()
local IF_NAME=""
local CMD_FINDNETLINK="find $CCWGROUPBUS_DEVICEDIR/$CCWGROUPDEVNO/ -type l -name net*"
local LINKNAME=""
-
+
# polling loop to wait for net device to become available
if [ -e $UDEVSETTLE ]
then
@@ -460,7 +503,7 @@ function wait_for_net_device()
fi
while [[ -z "$IF_NAME" ]] && [[ retries -lt MAX_RETRIES ]]
do
- sleep 1
+ sleep 1
retries=$retries+1
IF_NAME=$(try_read_netdevname $CCWGROUPDEVNO)
done
@@ -468,8 +511,8 @@ function wait_for_net_device()
then
echo "Successfully configured device $CCWGROUPDEVNO ($IF_NAME)"
else
- print_error "Failed to make $CCWGROUPDEVNO online."
- return 1
+ print_error "Failed to make $CCWGROUPDEVNO online."
+ return 1
fi
}
@@ -479,11 +522,11 @@ function wait_for_net_device()
# switch_device
# $1: ccwgroupdevno
# $2: 1|0 (online|offline)
-# returns
+# returns
# 0 success
# 1 command to make device online/offline returned error
# 2 online file does not exist
-#
+#
function switch_device()
{
local CCWGROUPDEVNO="$1"
@@ -491,7 +534,7 @@ function switch_device()
local DEVICE_DIRECTORY="$CCWGROUPBUS_DEVICEDIR/$CCWGROUPDEVNO"
local ONLINE_FILE="$DEVICE_DIRECTORY/online"
local STATESTR="online"
-
+
if [ $SWITCHVALUE -eq 0 ]
then
STATESTR="offline"
@@ -513,7 +556,7 @@ function switch_device()
print_error "$ONLINE_FILE does not exist."
return 2
fi
-
+
return 0
}
@@ -524,12 +567,12 @@ function switch_device()
# $1: ccwgroupdevid
# $2: option_name
# $3: option_value
-# returns
+# returns
# 0 success
# 1 option not allowed to be set (e.g. online)
# 2 unknown option
# 3 configuration failed
-#
+#
function configure_ccwgroupdev_option()
{
local CCWGROUPDEVID="$1"
@@ -539,10 +582,10 @@ function configure_ccwgroupdev_option()
# filter some attributes away
if [ "$OPTION_NAME" == "online" ]
then
- print_error "Ignoring option $OPTION_NAME=$OPTION_VALUE"
+ print_error "Ignoring option $OPTION_NAME=$OPTION_VALUE"
return 1
fi
-
+
# check if attribute exists
local ATTRFILE="$CCWGROUPBUS_DEVICEDIR/$CCWGROUPDEVID/$OPTION_NAME"
if [ -f $ATTRFILE ]
@@ -574,13 +617,13 @@ function configure_ccwgroupdev_option()
# $4: opt_count
# $5..$(5+opt_count): opt_name_array
# $5+opt_count..5+2*opt_count: opt_value_array
-# returns
+# returns
# 0 success
-# 1 grouping failed
-# 2 failed to make device online
-# 3 net device did not become available
-# 4 device online but some option could not be set
-#
+# RC_COULD_NOT_GROUP_DEVICES
+# RC_COULD_NOT_SET_DEV_ONLINE
+# RC_NET_DEVICE_NOT_ONLINE
+# RC_OPTION_NOT_CONFIGURED
+#
function add_net_device()
{
local DEVICES="$1"
@@ -591,10 +634,9 @@ function add_net_device()
local OPT_NAME_ARRAY=("${RAW[@]:4:$OPT_COUNT}")
local OPT_VALUE_ARRAY=("${RAW[@]:$[4 + $OPT_COUNT]:$OPT_COUNT}")
- group_device $DEVICES $CCWGROUPDEVID $DRIVER
- if [ $? -ne 0 ]
+ if ! group_device $DEVICES $CCWGROUPDEVID $DRIVER
then
- return 1
+ return $?
fi
local i=0
@@ -602,9 +644,8 @@ function add_net_device()
local HAS_LAYER2_OPTION=0
while [ $i -lt $OPT_COUNT ]
do
- configure_ccwgroupdev_option $CCWGROUPDEVID \
+ if ! configure_ccwgroupdev_option $CCWGROUPDEVID \
${OPT_NAME_ARRAY[$i]} ${OPT_VALUE_ARRAY[$i]}
- if [ $? -ne 0 ]
then
SOMEOPTION_FAILED=1
fi
@@ -628,22 +669,20 @@ function add_net_device()
"layer2" "$LAYER2"
fi
fi
-
- switch_device $CCWGROUPDEVNO 1
- if [ $? -ne 0 ]
+
+ if ! switch_device $CCWGROUPDEVNO 1
then
- return 2
+ return $RC_COULD_NOT_SET_DEV_ONLINE
fi
- wait_for_net_device $CCWGROUPDEVNO
- if [ $? -ne 0 ]
+ if ! wait_for_net_device $CCWGROUPDEVNO
then
- return 3
+ return $RC_NET_DEVICE_NOT_ONLINE
fi
if [ $SOMEOPTION_FAILED -ne 0 ]
then
- return 4
+ return $RC_OPTION_NOT_CONFIGURED
fi
return 0
@@ -655,26 +694,24 @@ function add_net_device()
# remove_net_device
# $1: ccwgroupdevid
# $2: network interface name (just for display purposes)
-# returns
+# returns
# 0 success
-# 1 making device offline failed
-# 2 ungrouping device failed
-#
+# RC_COULD_NOT_SET_DEV_OFFLINE
+# RC_COULD_NOT_UNGROUP_DEVICE
+#
function remove_net_device()
{
local DEVICE_TO_REMOVE="$1"
local DEVNAME="$2"
- switch_device $DEVICE_TO_REMOVE 0
- if [ $? -ne 0 ]
+ if ! switch_device $DEVICE_TO_REMOVE 0
then
- return 1
+ return $RC_COULD_NOT_SET_DEV_OFFLINE
fi
- ungroup_device $DEVICE_TO_REMOVE $DEVNAME
- if [ $? -ne 0 ]
+ if ! ungroup_device $DEVICE_TO_REMOVE $DEVNAME
then
- return 2
+ return $RC_COULD_NOT_UNGROUP_DEVICE
fi
return 0
}
@@ -684,9 +721,9 @@ function remove_net_device()
#
# list_configured
# $1 supress_header
-# returns
+# returns
# 0 success
-#
+#
function list_configured()
{
supress_header=0
@@ -723,11 +760,11 @@ function list_configured()
# read all links and parse driver, device name and ccw device
# bus-ids
- ls -l $d/ | grep '^l' |
- {
+ ls -l $d/ | grep '^l' |
+ {
- while read line
- do
+ while read line
+ do
local LINKNAME=${line// ->*/""}
LINKNAME=${LINKNAME##* }
if [ "$LINKNAME" = "driver" ]
@@ -742,14 +779,14 @@ function list_configured()
then
DEVNAME=${line##* -> */}
fi
- done
+ done
local CUTYPE=""
if [ -e $d/cdev0/cutype ]
then
read CUTYPE < $d/cdev0/cutype
fi
-
+
read ONLINE < $d/online
if [ $ONLINE -eq 1 ]
then
@@ -795,15 +832,15 @@ function print_list_unconf_header()
#
# list_unconfigured
-# returns
+# returns
# 0 success
-#
+#
function list_unconfigured()
{
local PRINTED_HEADLINES=0
local LIST_FORMATSTR="%-26.26s %-7.7s %-14.14s %5.5s %-4.4s \n"
print_scanning_4_nwdevices
-
+
$LSZNET_CALL |
{
while read no cutype chp devtype devdrv devname chlist cardtype
@@ -824,29 +861,29 @@ function list_unconfigured()
#
# store_option
# $1: attribute=value
-# returns
+# returns
# 0 success
# 1 attribute starts with a - / or is invalid
# 2 missing value
-#
+#
function store_option()
{
local OPTIONSTRING="$1"
# ensure that there is no option intepreted as an
- # attribute value pair
+ # attribute value pair
[[ "$OPTIONSTRING" =~ ^- ]]
case $? in
0)
print_error "$OPTIONSTRING is not a valid attribute" \
- "value pair"
+ "value pair"
exit 1
;;
1)
# option considered ok
;;
2)
- print_error "Internal error"
+ print_error "Internal error"
exit 1
esac
@@ -874,17 +911,17 @@ function store_option()
#
# is_complete_ccwdevbusid
# $1: possibly correct ccw device bus id
-# returns
+# returns
# 0 if the given string is a correctly formatted ccw device bus id
# 1 else
-#
+#
function is_complete_ccwdevbusid()
{
local DEV="$1"
[[ "$DEV" =~ $FORMAT_FULLDEVNO ]]
- case $? in
+ case $? in
0)
- return 0
+ return 0
;;
1)
return 1
@@ -902,41 +939,41 @@ function is_complete_ccwdevbusid()
#
# is_partial_ccwdevbusid
# $1: possibly correct partial ccw device bus id
-# returns
+# returns
# 0 if the given string is a correctly formatted partial ccw device
# bus id
# 1 else
-#
+#
function is_partial_ccwdevbusid()
{
local DEV="$1"
[[ "$DEV" =~ $FORMAT_PARTDEVNO ]]
case $? in
0)
- return 0
+ return 0
;;
1)
- return 1
+ return 1
;;
2)
print_error "Internal error"
exit 1
;;
esac
-}
+}
#==============================================================================
#
# is_ccwdevbusid_list
# $1: possibly correct list of ccw device bus ids
-# returns
+# returns
# 0 if the given string is a correctly formatted list of ccw device
# bus ids
# 1 else
-#
+#
function is_ccwdevbusid_list()
-{
+{
local DEVLIST="$1"
[[ "$DEVLIST" =~ $FORMAT_DEVLIST ]]
case $? in
@@ -959,13 +996,13 @@ function is_ccwdevbusid_list()
#
# is_shortccwdevbusid_list
# $1: possibly correct list of short ccw device bus ids
-# returns
+# returns
# 0 if the given string is a correctly formatted list of short ccw device
# bus ids
# 1 else
-#
+#
function is_shortccwdevbusid_list()
-{
+{
local DEVLIST="$1"
[[ "$DEVLIST" =~ $FORMAT_SHORTDEVLIST ]]
case $? in
@@ -987,14 +1024,14 @@ function is_shortccwdevbusid_list()
#
# is_supported_driver
# $1: possibly supported driver
-# returns
-# 0 if the given string denotes a supported driver
+# returns
+# 0 if the given string denotes a supported driver
# 1 else
-#
+#
function is_supported_driver()
{
local DRIVER="$1"
- [[ "$DRIVER" =~ "^(qeth|lcs|ctc|ctcm)$" ]]
+ [[ "$DRIVER" =~ "^(qeth|lcs|ctc|ctcm)$" ]]
case $? in
0)
return 0
@@ -1081,7 +1118,7 @@ DEVICE_TO_REMOVE=""
DO_REMOVEALL=0
NONINTERACTIVE=0
EXCEPT=""
-if [ $# -gt 0 ]
+if [ $# -gt 0 ]
then
while [ $# -gt 0 ]
do
@@ -1092,7 +1129,7 @@ then
;;
-v|--version)
print_version
- exit 0
+ exit 0
;;
-A|--add-all)
DO_ADDALL=1
@@ -1103,15 +1140,15 @@ then
if [ $# -lt 1 ]
then
print_error "Device ID expected"
- exit 1
+ exit $RC_MISSING_DEVICE_ID
fi
- # get parameter expected to be a
- # ccw device bus id
+ # get parameter expected to be a
+ # ccw device bus id
DEVICE_TO_ADD="$1"
shift
- # check syntax of ccw device bus id
+ # check syntax of ccw device bus id
if is_complete_ccwdevbusid "$DEVICE_TO_ADD" ||
is_ccwdevbusid_list "$DEVICE_TO_ADD"
then
@@ -1127,9 +1164,9 @@ then
DO_ADD=1
else
print_error "Invalid device ID format" \
- "$DEVICE_TO_ADD"
-
- exit 1
+ "$DEVICE_TO_ADD"
+
+ exit $RC_INVALID_DEVICE_ID_FORMAT
fi
;;
@@ -1142,18 +1179,18 @@ then
if [ $# -lt 1 ]
then
print_error "Driver name expected"
- exit 1
+ exit $RC_DRIVER_NAME_EXPECTED
fi
# ensure driver is supported
DRIVER="$1"
shift
if [ "$DRIVER" != "" ] && \
- ! is_supported_driver "$DRIVER"
+ ! is_supported_driver "$DRIVER"
then
# unknown driver
print_error "Unknown driver $DRIVER"
- exit 1
+ exit $RC_UNKNOWN_DRIVER
fi
;;
-o|--option)
@@ -1164,7 +1201,7 @@ then
print_error "Missing attrtibute" \
"value pair for -o|--" \
"option"
- exit 1
+ exit $RC_MISSING_ATTRIBUTE_VALUE_PAIR
fi
# get option string
@@ -1174,26 +1211,26 @@ then
# store option
if ! store_option $OPTIONSTRING
then
- exit $?
+ exit $RC_INVALID_ATTRIBUTE_VALUE_PAIR
fi
;;
-r|--remove)
DO_REMOVE=1
shift
-
+
# ensure there is a further parameter
if [ $# -lt 1 ]
then
print_error "Expecting <device_bus_id>"\
"of device to be removed"
- exit 1
+ exit $RC_MISSING_ATTRIBUTE_VALUE_PAIR
fi
# get device to be removed
DEVICE_TO_REMOVE="$1"
shift
-
- # validate it is a
+
+ # validate it is a
# ccw dev bus id (short or long)
if is_partial_ccwdevbusid "$DEVICE_TO_REMOVE"
then
@@ -1203,7 +1240,7 @@ then
then
print_error "Invalid device ID format" \
"$DEVICE_TO_REMOVE"
- exit 1
+ exit $RC_INVALID_DEVICE_ID_FORMAT
fi
;;
-R|--remove-all)
@@ -1219,7 +1256,7 @@ then
then
print_error "<device_bus_id> missing"\
"for -e|--except"
- exit 1
+ exit $RC_MISSING_DEVICE_ID
fi
# get device to be removed
@@ -1236,7 +1273,7 @@ then
then
print_error "Invalid device ID format" \
"$EXCEPT_DEVNO"
- exit 1
+ exit $RC_INVALID_DEVICE_ID_FORMAT
fi
# create a filter statement
@@ -1258,7 +1295,7 @@ then
*)
echo "$CMD: Invalid option $1"
echo "Try '$CMD --help' for more information."
- exit 1
+ exit $RC_INVALID_ARGUMENT
;;
esac
done
@@ -1271,7 +1308,7 @@ if [ $(($DO_ADD + $DO_ADDALL + $DO_LIST_UNCONFIGURED + $DO_LIST_CONFIGURED + \
then
print_error "Too much arguments"
echo "Try '$CMD --help' for more information."
- exit 1
+ exit $RC_TOO_MUCH_ARGUMENTS
fi
# react to parsed options
@@ -1290,12 +1327,31 @@ then
then
print_error "No configuration found for device ID" \
"$DEVICE_TO_ADD"
- exit 1
+ exit $RC_NO_CONFIG_FOUND_FOR_DEV
fi
else
- # define set of device numbers to be used
+ # define set of device numbers to be used
DEVICES="$DEVICE_TO_ADD"
-
+
+ # ensure none of the CCW devices is already in use
+ CCW_DEVS=${DEVICES//,/ }
+ for CCW_DEVNO in $CCW_DEVS
+ do
+ CCW_DEV_ONLINEFILE="$CCWDEV_DIR/$CCW_DEVNO/online"
+ if [ ! -e $CCW_DEV_ONLINEFILE ]
+ then
+ print_error "Device $CCW_DEVNO does not exist"
+ exit $RC_DEVICE_DOES_NOT_EXIST
+ fi
+
+ read CCW_DEV_ONLINE < $CCW_DEV_ONLINEFILE
+ if [ "$CCW_DEV_ONLINE" == "1" ]
+ then
+ print_error "$CCW_DEVNO is already in use"
+ exit $RC_DEVICE_ALREADY_IN_USE
+ fi
+ done
+
# try to find a driver for the given set of device numbers
CANDIDATE=$($LSZNET_CALL|
awk "\$7~/${DEVICE_TO_ADD//,// && \$7~/}/ {print \$5}")
@@ -1305,7 +1361,7 @@ then
# compute the expected group device number
CCWGROUPDEVNO=${DEVICES%%,*}
- # check whether an appropriate driver was determined automatically or
+ # check whether an appropriate driver was determined automatically or
# not, if not, one has to be given by the user via -d
if [ "$DRIVER" == "" ]
then
@@ -1345,7 +1401,7 @@ then
$ATTRIBUTE_COUNT "${ATTRIBUTE_NAME[@]}" \
"${ATTRIBUTE_VALUE[@]}"
then
- ADDALL_RC=1
+ ADDALL_RC=$RC_SOME_DEVICES_FAILED
fi
done
exit "$ADDALL_RC"
@@ -1363,9 +1419,9 @@ then
if [[ -z "$CCWGROUPDEVID_TO_REMOVE" ]]
then
print_error "$DEVICE_TO_REMOVE is not a configured device"
- exit 1
+ exit $RC_DEVICE_NOT_CONFIGURED
fi
-
+
echo "Remove network device $CCWGROUPDEVID_TO_REMOVE" \
"($CCWDEVBUSIDS_TO_REMOVE)?"
echo "Warning: this may affect network connectivity!"
@@ -1403,7 +1459,7 @@ then
fi
if [ $DO_LIST_UNCONFIGURED -eq 1 ]
then
- list_unconfigured
+ list_unconfigured
exit 0
fi
if [ $DO_LIST_CONFIGURED -eq 1 ]
diff --git a/zconf/znetconf.8 b/zconf/znetconf.8
index 3af8565..a6da42c 100644
--- a/zconf/znetconf.8
+++ b/zconf/znetconf.8
@@ -1,6 +1,6 @@
.TH ZNETCONF 8 "Mar 2009" "s390-tools"
-.SH NAME
+.SH NAME
znetconf \- list and configure network devices for System z network adapters
.SH SYNOPSIS
@@ -8,10 +8,10 @@ znetconf \- list and configure network devices for System z network adapters
.B [-h|--help] [-v|--version]
.br
-.br
-.B znetconf -u | -c
.br
-.B znetconf -a <device_bus_id>[,...]{2} [-o <ATTR>=<VALUE>]+ [-d <DRIVER>]
+.B znetconf -u | -c
+.br
+.B znetconf -a <device_bus_id>[,...]{2} [-o <ATTR>=<VALUE>]+ [-d <DRIVER>]
.br
.B znetconf -A [-o <ATTR>=<VALUE>]+ [-d <DRIVER>] [-e <device_bus_id>]+
.br
@@ -27,12 +27,12 @@ Based on these lists, it automatically adds or removes network devices.
For automatic configuration, znetconf builds a channel command word
(CCW) group device from sensed CCW devices, configures any specified
option through the sensed network device driver and sets the new
-network device online.
+network device online.
.P
During automatic removal, znetconf sets the device offline and removes it.
Be aware that removing all network devices leads to the
-complete loss of network connectivity. So a terminal session (e.g. 3270)
-might be required to restore.
+complete loss of network connectivity. So a terminal session (e.g. 3270)
+might be required to restore.
.SH OPTIONS
.TP 8
@@ -43,30 +43,30 @@ Print help text.
.BR -v | --version
Print the version of the s390-tools package and the znetconf command.
-.TP
-.BR -u | --unconfigured
+.TP
+.BR -u | --unconfigured
List potential network devices that are not yet configured.
For each device, the following data is provided:
.RS
.TP 4
-*
-Device IDs (device bus bus-IDs) of the CCW devices constituting the network
+*
+Device IDs (device bus bus-IDs) of the CCW devices constituting the network
device
.TP
-*
+*
Type of control unit (e.g. 1731/01)
.TP
-*
+*
Network card type (e.g. OSA (QDIO))
.TP
*
-Channel path identifier (CHPID)
+Channel path identifier (CHPID)
.TP
*
Device driver (qeth, lcs, ctc, ctcm)
.RE
-.TP
-.BR -c | --configured
+.TP
+.BR -c | --configured
List configured network devices. For each device, the following data is
provided:
.RS
@@ -104,7 +104,7 @@ device_bus_id can be any of the device
IDs listed as part of the potential network device list (argument
.BR -u ")."
For example, if znetconf
-.BR -u
+.BR -u
lists 0.0.f503,0.0.f504,0.0.f505 for a potential network device, device_bus_id
may be 0.0.f503 or 0.0.f504 or 0.0.f505.
If a device bus-ID begins with 0.0., you can abbreviate it to the final 4
@@ -115,11 +115,11 @@ If attribute value pairs are given with
.BR -o ", "
these pairs are configured for the created network device. The
device is then set online regardless of whether the given attribute value pairs
-were applied successfully.
+were applied successfully.
.br
Finally, the corresponding network interface name (e.g. eth1) is displayed.
.br
-If more then one device_bus_id is given, the given set of devices is configured as a network device. znetconf tries to sense the required device driver
+If more then one device_bus_id is given, the given set of devices is configured as a network device. znetconf tries to sense the required device driver
automatically. If the device driver cannot be sensed, you must specify it with
-d.
.BR -d "."
@@ -145,7 +145,7 @@ znetconf continues with the next remaining potential network device.
.TP
.BR -r | --remove " <device_bus_id> [-n | --non-interactive]"
-Remove the network device identified by device_bus_id. device_bus_id is one of
+Remove the network device identified by device_bus_id. device_bus_id is one of
the device IDs of the network device. They are listed as part of znetconf
.BR -c "."
znetconf sets the device offline and removes it. If
@@ -164,21 +164,105 @@ with
.TP
\fB<ATTR>\fR
Specify a device option. The option must match a sysfs attribute for the device
-to be configured.
+to be configured. For a detailed description of the semantics of sysfs
+attributes please refer to the Device Drivers, Features, and Commands book for
+Linux on System z. The attributes are:
+
+.RS
+.B qeth
+.br
+broadcast_mode
+.br
+buffer_count
+.br
+canonical_macaddr
+.br
+checksumming
+.br
+fake_broadcast
+.br
+ipa_takeover/add4
+.br
+ipa_takeover/add6
+.br
+ipa_takeover/del4
+.br
+ipa_takeover/del6
+.br
+ipa_takeover/enable
+.br
+ipa_takeover/invert4
+.br
+ipa_takeover/invert6
+.br
+isolation
+.br
+large_send
+.br
+layer2
+.br
+performance_stats
+.br
+portname
+.br
+portno
+.br
+priority_queueing
+.br
+route4
+.br
+route6
+.br
+rxip/add4
+.br
+rxip/add6
+.br
+rxip/del4
+.br
+rxip/del6
+.br
+vipa/add4
+.br
+vipa/add6
+.br
+vipa/del4
+.br
+vipa/del
+.RE
+
+.RS
+.B ctc(m)
+.br
+buffer
+.br
+loglevel
+.br
+protocol
+.br
+stats
+.RE
+
+.RS
+.B lcs
+.br
+portno
+.br
+lancmd_timeout
+.RE
.TP
-\fB<device_bus_id>\fR
+\fB<device_bus_id>\fR
Specify the device bus-ID of a CCW device. Device bus-IDs have the form
([A-Fa-f0-9].[A-Fa-f0-9].)[A-Fa-f0-9]{4}.
-If a device bus-ID begins with 0.0., you can abbreviate it to the final 4
+If a device bus-ID begins with 0.0., you can abbreviate it to the final 4
hexadecimal digits.
For example, you can abbreviate 0.0.f503 to f503.
.TP
\fB<DRIVER>\fR
-Specify the device driver for the device. Valid values are qeth, lcs, ctc, or
+Specify the device driver for the device. Valid values are qeth, lcs, ctc, or
ctcm.
.SH EXAMPLES
@@ -242,9 +326,9 @@ Shows the list of potential network devices. Example output:
Device IDs Type Card Type CHPID Drv.
.br
--------------------------------------------------------
-0.0.f500,0.0.f501,0.0.f502 1731/01 OSA (QDIO) 00 qeth
+0.0.f500,0.0.f501,0.0.f502 1731/01 OSA (QDIO) 00 qeth
.br
-0.0.f503,0.0.f504,0.0.f505 1731/01 OSA (QDIO) 01 qeth
+0.0.f503,0.0.f504,0.0.f505 1731/01 OSA (QDIO) 01 qeth
.RE
.P
\fBznetconf -a 0.0.f503\fR
@@ -258,13 +342,13 @@ lists the new network device.
.P
\fBznetconf -a f503\fR
.RS
-This command is equivalent to \fBznetconf -a 0.0.f503\fR.
+This command is equivalent to \fBznetconf -a 0.0.f503\fR.
.RE
.P
\fBznetconf -a f503 -o layer2=0 -o portname=myname\fR
.RS
-Adds the potential network device
-with 0.0.f503 as one of its device bus-IDs
+Adds the potential network device
+with 0.0.f503 as one of its device bus-IDs
and configures the options layer2 with value 0 and
portname with myname.
.RE
@@ -288,9 +372,9 @@ Device IDs Type Card Type CHPID Drv. Name State
\fBznetconf -r 0.0.f503\fR
.RS
-Removes the network device with 0.0.f503 as one of its device bus-IDs.
+Removes the network device with 0.0.f503 as one of its device bus-IDs.
You can only remove configured devices as listed by znetconf
-.BR -c "."
+.BR -c "."
After successfully running this command the corresponding device appears in the
list of potential network devices as listed by znetconf
.BR -u "."
@@ -303,9 +387,76 @@ This command is equivalent to \fBznetconf -r 0.0.f503\fR.
.P
.SH DIAGNOSTICS
-If znetconf runs successfully, the exit status is 0. In case of errors, 1 is
-returned.
-
+If znetconf runs successfully, the exit status is 0. In case of errors, the following codes are returned:
+.TP
+.BR 0
+success
+.TP
+.BR 9
+could not group devices
+.TP
+.BR 10
+could not set device online
+.TP
+.BR 11
+could not set device offline
+.TP
+.BR 12
+invalid attribute value pair
+.TP
+.BR 13
+missing component (broken installation)
+.TP
+.BR 14
+missing device ID
+.TP
+.BR 15
+invalid device ID format
+.TP
+.BR 16
+driver name expected
+.TP
+.BR 17
+unknown driver
+.TP
+.BR 18
+missing attribute value pair for -o|--option
+.TP
+.BR 19
+invalid argument
+.TP
+.BR 20
+too much arguments
+.TP
+.BR 21
+no configuration found for device ID
+.TP
+.BR 22
+device is not configured
+.TP
+.BR 23
+could not ungroup device
+.TP
+.BR 24
+at least one option could not be configured
+.TP
+.BR 25
+missing value for attribute
+.TP
+.BR 26
+device does not exist
+.TP
+.BR 27
+device already in use
+.TP
+.BR 28
+net device did not come online
+.TP
+.BR 29
+some devices could not be added or failed
+.TP
+.BR 99
+internal znetconf bug
.SH AUTHOR
.nf
This man-page was written by Einar Lueck <elelueck at de.ibm.com>.
--
1.6.3.3
--- NEW FILE device_cio_free ---
#!/bin/sh
#
# Copyright 2009 Red Hat, Inc.
# License: GPLv2
# Author: Dan Horák <dhorak at 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
#
DASDCONFIG=/etc/dasd.conf
ZFCPCONFIG=/etc/zfcp.conf
ZNETCONFIG=/etc/ccw.conf
BLACKLIST=/proc/cio_ignore
VERBOSE=
PATH=/bin:/usr/bin:/sbin:/usr/sbin
ALL_DEVICES=
usage()
{
echo "$0 [-h|--help] [-V|--verbose]"
exit 1
}
# accepts single device, comma-separated lists and dash separated ranges and their combinations
free_device()
{
local DEV
[ -z "$1" ] && return
DEV=$(echo $1 | tr "A-Z" "a-z")
[ $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
}
# wait until a device appears on the ccw bus
wait_on_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
sleep $t
[ -f "$DEVICE_ONLINE" ] && return
done
echo "Error: device $DEV still not ready"
}
# check how we were called
case $(basename "$0") in
"dasd_cio_free")
CONFIG=$DASDCONFIG
MODE=dasd
;;
"zfcp_cio_free")
CONFIG=$ZFCPCONFIG
MODE=zfcp
;;
"znet_cio_free")
CONFIG=$ZNETCONFIG
MODE=znet
;;
*)
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
if [ $# -gt 0 ]; then
case $1 in
-V|--verbose)
VERBOSE=yes
shift
;;
-h|--help)
usage
;;
*)
echo "Error: unknown option $1"
usage
;;
esac
fi
if [ ! -f $BLACKLIST ]; then
echo "Error: $BLACKLIST kernel interface doesn't exist"
exit 2
fi
if [ $MODE = "dasd" -o $MODE = "zfcp" ]; then
# process the config file
if [ -f "$CONFIG" ]; then
while read line; do
case $line in
\#*) ;;
*)
[ -z "$line" ] && continue
set $line
free_device $1
;;
esac
done < $CONFIG
fi
fi
if [ $MODE = "dasd" ]; then
# process the device list defined as option for the dasd module
DEVICES=$(modprobe --showconfig | 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/,$//')
free_device $DEVICES
fi
if [ $MODE = "znet" ]; then
# process the config file
if [ -f "$CONFIG" ]; then
while read line; do
case $line in
\#*) ;;
*)
[ -z "$line" ] && continue
# grep 2 or 3 channels from beginning of each line
DEVICES=$(echo $line | egrep -i -o "^([0-9]\.[0-9]\.[a-f0-9]+,){1,2}([0-9]\.[0-9]\.[a-f0-9]+)")
free_device $DEVICES
;;
esac
done < $CONFIG
fi
# process channels from network interface configurations
for line in $(egrep -i -h "^[[:space:]]*SUBCHANNELS=['\"]?([0-9]\.[0-9]\.[a-f0-9]+,){1,2}([0-9]\.[0-9]\.[a-f0-9]+)['\"]?([[:space:]]+#|[[:space:]]*$)" /etc/sysconfig/network-scripts/ifcfg-* 2> /dev/null)
do
eval "$line"
free_device $SUBCHANNELS
done
fi
# wait until recently unblocked devices are ready
# at this point we know the content of ALL_DEVICES is syntacticly correct
IFS=","
set $ALL_DEVICES
while [ "$1" ]
do
DEV="$1"
IFS="."
# get the lower bound for range or get the single device
LOWER=${DEV%%-*}
read -a L <<< "$LOWER"
if [ ${#L[@]} -eq 1 ]; then
L[2]=${L[0]}
L[0]=0
L[1]=0
fi
# get the upper bound for range or get the single device
UPPER=${DEV##*-}
read -a U <<< "$UPPER"
if [ ${#U[@]} -eq 1 ]; then
U[2]=${U[0]}
U[0]=0
U[1]=0
fi
# iterate thru all devices
for (( i=0x${L[0]}; i<=0x${U[0]}; i++ )); do
for (( j=0x${L[1]}; j<=0x${U[1]}; j++ )); do
for (( k=0x${L[2]}; k<=0x${U[2]}; k++ )); do
wait_on_device "$(printf %x.%x.%04x $i $j $k)"
done
done
done
# go to the next device
shift
done
Index: s390utils.spec
===================================================================
RCS file: /cvs/pkgs/rpms/s390utils/devel/s390utils.spec,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -p -r1.14 -r1.15
--- s390utils.spec 13 Nov 2009 10:22:21 -0000 1.14
+++ s390utils.spec 22 Dec 2009 11:00:08 -0000 1.15
@@ -8,7 +8,7 @@ Name: s390utils
Summary: Utilities and daemons for IBM System/z
Group: System Environment/Base
Version: 1.8.2
-Release: 5%{?dist}
+Release: 6%{?dist}
Epoch: 2
License: GPLv2 and GPLv2+ and CPL
Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
@@ -31,6 +31,7 @@ Source11: cpi.sysconfig
# files for DASD initialization
Source12: dasd.udev
Source13: dasdconf.sh
+Source14: device_cio_free
Patch1: 0001-s390-tools-1.5.3-zipl-zfcpdump-2.patch
Patch2: 0002-s390-tools-1.8.1-zipl-automenu.patch
@@ -46,6 +47,9 @@ Patch11: 0011-update-readahead-value-fo
Patch12: 0012-fix-multipath-device-detection-in-ziomon.patch
Patch13: 0013-zipl-handle-status-during-ipl.patch
Patch14: 0014-dasdview-fdasd-fix-floating-point-error-for-unformat.patch
+Patch15: 0015-s390tools-1.8.2-zipl-dm.patch
+Patch16: 0016-s390tools-1.8.2-lsreipl-nss.patch
+Patch17: 0017-qualified-return-codes-and-further-error-handling-in.patch
Patch100: cmsfs-1.1.8-warnings.patch
Patch101: cmsfs-1.1.8-kernel26.patch
@@ -117,6 +121,15 @@ be used together with the zSeries (s390)
# Fix floating point error for unformatted devices in fdasd and dasdview (#537144)
%patch14 -p1 -b .dasd-zero-division
+# Add device-mapper support into zipl (#546280)
+%patch15 -p1 -b .zipl-dm
+
+# Add missing check and print NSS name in case an NSS has been IPLed (#546297)
+%patch16 -p1 -b .lsreipl-nss
+
+# Add qualified return codes and further error handling in znetconf (#548487)
+%patch17 -p1 -b .znetconf-returncodes
+
#
# cmsfs
#
@@ -190,6 +203,9 @@ rm -rf ${RPM_BUILD_ROOT}
mkdir -p $RPM_BUILD_ROOT{%{_lib},%{_libdir},/sbin,/bin,/boot,%{_mandir}/man1,%{_mandir}/man8,%{_sbindir},%{_bindir},%{_sysconfdir}/{profile.d,udev/rules.d,sysconfig},%{_initddir}}
+# workaround an issue in the zipl-device-mapper patch
+rm -f zipl/src/zipl_helper.device-mapper.*
+
make install \
INSTROOT=$RPM_BUILD_ROOT \
MANDIR=$RPM_BUILD_ROOT%{_mandir} \
@@ -252,6 +268,14 @@ install -p -m 644 include/vtoc.h $RPM_BU
install -p -m 644 %{SOURCE11} ${RPM_BUILD_ROOT}%{_sysconfdir}/sysconfig/cpi
install -p -m 755 %{SOURCE10} ${RPM_BUILD_ROOT}%{_initddir}/cpi
+# device_cio_free
+install -p -m 755 %{SOURCE14} ${RPM_BUILD_ROOT}/sbin
+pushd ${RPM_BUILD_ROOT}/sbin
+for lnk in dasd zfcp znet; do
+ ln -sf device_cio_free ${lnk}_cio_free
+done
+popd
+
%clean
rm -rf ${RPM_BUILD_ROOT}
@@ -422,9 +446,11 @@ fi
%doc README
%doc LICENSE
/sbin/zipl
+/sbin/dasd_cio_free
/sbin/dasdfmt
/sbin/dasdinfo
/sbin/dasdview
+/sbin/device_cio_free
/sbin/fdasd
/sbin/chccwdev
/sbin/chchp
@@ -446,7 +472,9 @@ fi
/sbin/tape390_crypt
/sbin/tunedasd
/sbin/vmcp
+/sbin/zfcp_cio_free
/sbin/zgetdump
+/sbin/znet_cio_free
/sbin/znetconf
/sbin/dbginfo.sh
%{_sbindir}/lsreipl
@@ -798,6 +826,14 @@ User-space development files for the s39
%changelog
+* Tue Dec 22 2009 Dan Horák <dan[at]danny.cz> 2:1.8.2-6
+- fixed return value in cpi initscript (#541389)
+- updated zfcpconf.sh script from dracut
+- added device-mapper support into zipl (#546280)
+- added missing check and print NSS name in case an NSS has been IPLed (#546297)
+- added device_cio_free script and its symlinks
+- added qualified return codes and further error handling in znetconf (#548487)
+
* Fri Nov 13 2009 Dan Horák <dan[at]danny.cz> 2:1.8.2-5
- added multiple fixes from IBM (#533955, #537142, #537144)
More information about the scm-commits
mailing list