mirror of
https://github.com/ibm-s390-linux/s390-tools.git
synced 2026-08-05 02:14:52 +00:00
Compare commits
34 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 8565e591bd | |||
| 80443ab629 | |||
| 8b3cc6e4c1 | |||
| 5693c16894 | |||
| 8bf5f8d0e2 | |||
| 99ab2db6ad | |||
| 784ac7d190 | |||
| 53f166673d | |||
| d4ea321a97 | |||
| 1a63894487 | |||
| e3fc9478bf | |||
| f110a77b68 | |||
| 712433d7f9 | |||
| 2c4c210ca8 | |||
| 58e2135d87 | |||
| 5dbe73403f | |||
| 819513ab38 | |||
| 7e6d782699 | |||
| cc82be3135 | |||
| 1b318fe114 | |||
| 87f47f60e4 | |||
| 0f55dab2de | |||
| b58adc26f4 | |||
| 91509973fe | |||
| 39520546c5 | |||
| 8d1a7fecd0 | |||
| a6507b330d | |||
| d37dc68693 | |||
| b0007fea98 | |||
| 1e248abd53 | |||
| 61baa23e48 | |||
| 261763f133 | |||
| f4b2da6c9d | |||
| 1f607fed3d |
@@ -1,5 +1,23 @@
|
|||||||
Release history for s390-tools (MIT version)
|
Release history for s390-tools (MIT version)
|
||||||
--------------------------------------------
|
--------------------------------------------
|
||||||
|
* __v2.10.0 (2019-07-31)__
|
||||||
|
|
||||||
|
For Linux kernel version: 5.2
|
||||||
|
|
||||||
|
Changes of existing tools:
|
||||||
|
- zdev: Add zfcp dix parameter handling
|
||||||
|
- cpumf: Add support for CPU-Measurement Facility counters SVN 6
|
||||||
|
|
||||||
|
Bug Fixes:
|
||||||
|
- libutil: Add functions to test path is read/write-only
|
||||||
|
- zdev: Fix reporting of read-only sysfs attributes
|
||||||
|
- zdev: Improve handling of invalid udev rules
|
||||||
|
- zipl: Fix stfle zero padding
|
||||||
|
- zipl: Fix build issues
|
||||||
|
- zipl: Remove trailing spaces from the fields defined in BLS files
|
||||||
|
- zipl: Do not overwrite BOOT_IMAGE entry
|
||||||
|
- zkey: Fix auto-detection of clear key bitsize for XTS keys
|
||||||
|
|
||||||
* __v2.9.0 (2019-05-21)__
|
* __v2.9.0 (2019-05-21)__
|
||||||
|
|
||||||
For Linux kernel version: 5.0 / 5.1
|
For Linux kernel version: 5.0 / 5.1
|
||||||
|
|||||||
+1
-1
@@ -5,7 +5,7 @@ COMMON_INCLUDED = true
|
|||||||
# The variable "DISTRELEASE" should be overwritten in rpm spec files with:
|
# The variable "DISTRELEASE" should be overwritten in rpm spec files with:
|
||||||
# "make DISTRELEASE=%{release}" and "make install DISTRELEASE=%{release}"
|
# "make DISTRELEASE=%{release}" and "make install DISTRELEASE=%{release}"
|
||||||
VERSION = 2
|
VERSION = 2
|
||||||
RELEASE = 9
|
RELEASE = 10
|
||||||
PATCHLEVEL = 0
|
PATCHLEVEL = 0
|
||||||
DISTRELEASE = build-$(shell date +%Y%m%d)
|
DISTRELEASE = build-$(shell date +%Y%m%d)
|
||||||
S390_TOOLS_RELEASE = $(VERSION).$(RELEASE).$(PATCHLEVEL)-$(DISTRELEASE)
|
S390_TOOLS_RELEASE = $(VERSION).$(RELEASE).$(PATCHLEVEL)-$(DISTRELEASE)
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@ include ../common.mak
|
|||||||
CPUMF_DATADIR = $(TOOLS_DATADIR)/cpumf
|
CPUMF_DATADIR = $(TOOLS_DATADIR)/cpumf
|
||||||
DATA_FILES = cpum-cf-hw-counter.map \
|
DATA_FILES = cpum-cf-hw-counter.map \
|
||||||
cpum-cf-cfvn-1.ctr cpum-cf-cfvn-3.ctr \
|
cpum-cf-cfvn-1.ctr cpum-cf-cfvn-3.ctr \
|
||||||
cpum-cf-csvn-generic.ctr \
|
cpum-cf-csvn-12345.ctr cpum-cf-csvn-6.ctr \
|
||||||
cpum-cf-extended-z10.ctr cpum-cf-extended-z196.ctr \
|
cpum-cf-extended-z10.ctr cpum-cf-extended-z196.ctr \
|
||||||
cpum-cf-extended-zEC12.ctr cpum-sf-modes.ctr \
|
cpum-cf-extended-zEC12.ctr cpum-sf-modes.ctr \
|
||||||
cpum-cf-extended-z13.ctr cpum-cf-extended-z14.ctr
|
cpum-cf-extended-z13.ctr cpum-cf-extended-z14.ctr
|
||||||
|
|||||||
@@ -267,7 +267,12 @@ sub cpumf_load_ctrdef($;$)
|
|||||||
# List of "generic" counter sets
|
# List of "generic" counter sets
|
||||||
my @def = ();
|
my @def = ();
|
||||||
push @def, "cfvn-" . $version->{cfvn};
|
push @def, "cfvn-" . $version->{cfvn};
|
||||||
push @def, "csvn-generic";
|
if ($version->{csvn} >= 1 && $version->{csvn} <= 6) {
|
||||||
|
push @def, "csvn-12345";
|
||||||
|
}
|
||||||
|
if ($version->{csvn} == 6) {
|
||||||
|
push @def, "csvn-6";
|
||||||
|
}
|
||||||
|
|
||||||
my $h = {};
|
my $h = {};
|
||||||
# Load counter set definition
|
# Load counter set definition
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
Counter: 80 Name:ECC_FUNCTION_COUNT
|
||||||
|
Short-Description:ECC Function Count
|
||||||
|
Description:
|
||||||
|
This counter counts the
|
||||||
|
total number of the elliptic-curve cryptography (ECC)
|
||||||
|
functions issued by the CPU.
|
||||||
|
.
|
||||||
|
Counter: 81 Name:ECC_CYCLES_COUNT
|
||||||
|
Short-Description:ECC Cycles Count
|
||||||
|
Description:
|
||||||
|
This counter counts the total
|
||||||
|
number of CPU cycles when the ECC coprocessor is
|
||||||
|
busy performing the elliptic-curve cryptography
|
||||||
|
(ECC) functions issued by the CPU.
|
||||||
|
.
|
||||||
|
Counter: 82 Name:ECC_BLOCKED_FUNCTION_COUNT
|
||||||
|
Short-Description:Ecc Blocked Function Count
|
||||||
|
Description:
|
||||||
|
This counter
|
||||||
|
counts the total number of the elliptic-curve
|
||||||
|
cryptography (ECC) functions that are issued by the CPU
|
||||||
|
and are blocked because the ECC coprocessor is
|
||||||
|
busy performing a function issued by another CPU.
|
||||||
|
.
|
||||||
|
Counter: 83 Name:ECC_BLOCKED_CYCLES_COUNT
|
||||||
|
Short-Description:ECC Blocked Cycles Count
|
||||||
|
Description:
|
||||||
|
This counter counts
|
||||||
|
the total number of CPU cycles blocked for the elliptic-curve
|
||||||
|
cryptography (ECC) functions issued by the
|
||||||
|
CPU because the ECC coprocessor is busy perform-
|
||||||
|
ing a function issued by another CPU.
|
||||||
|
.
|
||||||
@@ -14,7 +14,8 @@
|
|||||||
'cfvn-3' => 'cpum-cf-cfvn-3.ctr',
|
'cfvn-3' => 'cpum-cf-cfvn-3.ctr',
|
||||||
|
|
||||||
# CSVN
|
# CSVN
|
||||||
'csvn-generic' => 'cpum-cf-csvn-generic.ctr',
|
'csvn-12345' => 'cpum-cf-csvn-12345.ctr',
|
||||||
|
'csvn-6' => 'cpum-cf-csvn-6.ctr',
|
||||||
|
|
||||||
# Extended counters
|
# Extended counters
|
||||||
2097 => 'cpum-cf-extended-z10.ctr',
|
2097 => 'cpum-cf-extended-z10.ctr',
|
||||||
@@ -27,4 +28,7 @@
|
|||||||
2965 => 'cpum-cf-extended-z13.ctr',
|
2965 => 'cpum-cf-extended-z13.ctr',
|
||||||
3906 => 'cpum-cf-extended-z14.ctr',
|
3906 => 'cpum-cf-extended-z14.ctr',
|
||||||
3907 => 'cpum-cf-extended-z14.ctr',
|
3907 => 'cpum-cf-extended-z14.ctr',
|
||||||
|
# Identical with z14
|
||||||
|
8561 => 'cpum-cf-extended-z14.ctr',
|
||||||
|
8562 => 'cpum-cf-extended-z14.ctr',
|
||||||
};
|
};
|
||||||
|
|||||||
+2
-2
@@ -397,7 +397,7 @@ static void fdasd_error(fdasd_anchor_t *anc, enum fdasd_failure why, char *str)
|
|||||||
fputc('\n', stderr);
|
fputc('\n', stderr);
|
||||||
fputs(err_str, stderr);
|
fputs(err_str, stderr);
|
||||||
|
|
||||||
fdasd_exit(anc, -1);
|
fdasd_exit(anc, EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -3040,5 +3040,5 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
* @{
|
* @{
|
||||||
* @brief Work with paths
|
* @brief Work with paths
|
||||||
*
|
*
|
||||||
* Copyright IBM Corp. 2016, 2017
|
* Copyright IBM Corp. 2016, 2019
|
||||||
*
|
*
|
||||||
* s390-tools is free software; you can redistribute it and/or modify
|
* s390-tools is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the MIT license. See LICENSE for details.
|
* it under the terms of the MIT license. See LICENSE for details.
|
||||||
@@ -21,5 +21,7 @@ bool util_path_is_writable(const char *fmt, ...);
|
|||||||
bool util_path_is_dir(const char *fmt, ...);
|
bool util_path_is_dir(const char *fmt, ...);
|
||||||
bool util_path_is_reg_file(const char *fmt, ...);
|
bool util_path_is_reg_file(const char *fmt, ...);
|
||||||
bool util_path_exists(const char *fmt, ...);
|
bool util_path_exists(const char *fmt, ...);
|
||||||
|
bool util_path_is_readonly_file(const char *fmt, ...);
|
||||||
|
bool util_path_is_writeonly_file(const char *fmt, ...);
|
||||||
|
|
||||||
#endif /** LIB_UTIL_PATH_H @} */
|
#endif /** LIB_UTIL_PATH_H @} */
|
||||||
|
|||||||
@@ -112,6 +112,12 @@ int main(int argc, char *argv[])
|
|||||||
case OPT_NOSHORT:
|
case OPT_NOSHORT:
|
||||||
printf("Specified: --noshort\n");
|
printf("Specified: --noshort\n");
|
||||||
break;
|
break;
|
||||||
|
case 'l':
|
||||||
|
printf("Specified: -l\n");
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
|
printf("Specified: --manual\n");
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
util_opt_print_parse_error(c, argv);
|
util_opt_print_parse_error(c, argv);
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
|
|||||||
+65
-18
@@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* Work with paths
|
* Work with paths
|
||||||
*
|
*
|
||||||
* Copyright IBM Corp. 2016, 2017
|
* Copyright IBM Corp. 2016, 2019
|
||||||
*
|
*
|
||||||
* s390-tools is free software; you can redistribute it and/or modify
|
* s390-tools is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the MIT license. See LICENSE for details.
|
* it under the terms of the MIT license. See LICENSE for details.
|
||||||
@@ -107,7 +107,7 @@ bool util_path_is_readable(const char *fmt, ...)
|
|||||||
bool rc;
|
bool rc;
|
||||||
|
|
||||||
UTIL_VASPRINTF(&path, fmt, ap);
|
UTIL_VASPRINTF(&path, fmt, ap);
|
||||||
rc = access(path, R_OK) == 0 ? true : false;
|
rc = access(path, R_OK) == 0;
|
||||||
free(path);
|
free(path);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
@@ -131,7 +131,7 @@ bool util_path_is_writable(const char *fmt, ...)
|
|||||||
bool rc;
|
bool rc;
|
||||||
|
|
||||||
UTIL_VASPRINTF(&path, fmt, ap);
|
UTIL_VASPRINTF(&path, fmt, ap);
|
||||||
rc = access(path, W_OK) == 0 ? true : false;
|
rc = access(path, W_OK) == 0;
|
||||||
free(path);
|
free(path);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
@@ -150,18 +150,14 @@ bool util_path_is_writable(const char *fmt, ...)
|
|||||||
*/
|
*/
|
||||||
bool util_path_is_reg_file(const char *fmt, ...)
|
bool util_path_is_reg_file(const char *fmt, ...)
|
||||||
{
|
{
|
||||||
|
bool rc = false;
|
||||||
struct stat sb;
|
struct stat sb;
|
||||||
va_list ap;
|
va_list ap;
|
||||||
char *path;
|
char *path;
|
||||||
bool rc;
|
|
||||||
|
|
||||||
UTIL_VASPRINTF(&path, fmt, ap);
|
UTIL_VASPRINTF(&path, fmt, ap);
|
||||||
if (stat(path, &sb)) {
|
if (stat(path, &sb) == 0)
|
||||||
rc = false;
|
rc = S_ISREG(sb.st_mode);
|
||||||
goto free_str;
|
|
||||||
}
|
|
||||||
rc = (sb.st_mode & S_IFREG) ? true : false;
|
|
||||||
free_str:
|
|
||||||
free(path);
|
free(path);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@@ -179,18 +175,14 @@ free_str:
|
|||||||
*/
|
*/
|
||||||
bool util_path_is_dir(const char *fmt, ...)
|
bool util_path_is_dir(const char *fmt, ...)
|
||||||
{
|
{
|
||||||
|
bool rc = false;
|
||||||
struct stat sb;
|
struct stat sb;
|
||||||
va_list ap;
|
va_list ap;
|
||||||
char *path;
|
char *path;
|
||||||
bool rc;
|
|
||||||
|
|
||||||
UTIL_VASPRINTF(&path, fmt, ap);
|
UTIL_VASPRINTF(&path, fmt, ap);
|
||||||
if (stat(path, &sb)) {
|
if (stat(path, &sb) == 0)
|
||||||
rc = false;
|
rc = S_ISDIR(sb.st_mode);
|
||||||
goto free_str;
|
|
||||||
}
|
|
||||||
rc = (sb.st_mode & S_IFDIR) ? true : false;
|
|
||||||
free_str:
|
|
||||||
free(path);
|
free(path);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@@ -213,7 +205,62 @@ bool util_path_exists(const char *fmt, ...)
|
|||||||
bool rc;
|
bool rc;
|
||||||
|
|
||||||
UTIL_VASPRINTF(&path, fmt, ap);
|
UTIL_VASPRINTF(&path, fmt, ap);
|
||||||
rc = access(path, F_OK) == 0 ? true : false;
|
rc = access(path, F_OK) == 0;
|
||||||
free(path);
|
free(path);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test if path exists, is a regular file, and permission is read-only
|
||||||
|
*
|
||||||
|
* @param[in] fmt Format string for path to test
|
||||||
|
* @param[in] ... Variable arguments for format string
|
||||||
|
*
|
||||||
|
* @returns true Path exists, is a regular file, and permission does
|
||||||
|
* not allow any write but allows read
|
||||||
|
* false Otherwise
|
||||||
|
*/
|
||||||
|
bool util_path_is_readonly_file(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
bool rc = false;
|
||||||
|
struct stat sb;
|
||||||
|
va_list ap;
|
||||||
|
char *path;
|
||||||
|
|
||||||
|
UTIL_VASPRINTF(&path, fmt, ap);
|
||||||
|
if (stat(path, &sb) == 0) {
|
||||||
|
rc = S_ISREG(sb.st_mode) &&
|
||||||
|
(sb.st_mode & 0222) == 0 &&
|
||||||
|
(sb.st_mode & 0444) != 0;
|
||||||
|
}
|
||||||
|
free(path);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test if path exists, is a regular file, and permission is write-only
|
||||||
|
*
|
||||||
|
* @param[in] fmt Format string for path to test
|
||||||
|
* @param[in] ... Variable arguments for format string
|
||||||
|
*
|
||||||
|
* @returns true Path exists, is a regular file, and permission does
|
||||||
|
* not allow any read but allows write
|
||||||
|
* false Otherwise
|
||||||
|
*/
|
||||||
|
bool util_path_is_writeonly_file(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
bool rc = false;
|
||||||
|
struct stat sb;
|
||||||
|
va_list ap;
|
||||||
|
char *path;
|
||||||
|
|
||||||
|
UTIL_VASPRINTF(&path, fmt, ap);
|
||||||
|
if (stat(path, &sb) == 0) {
|
||||||
|
rc = S_ISREG(sb.st_mode) &&
|
||||||
|
(sb.st_mode & 0222) != 0 &&
|
||||||
|
(sb.st_mode & 0444) == 0;
|
||||||
|
}
|
||||||
|
free(path);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* util_path_example - Example program for util_path
|
* util_path_example - Example program for util_path
|
||||||
*
|
*
|
||||||
* Copyright IBM Corp. 2016, 2017
|
* Copyright IBM Corp. 2016, 2019
|
||||||
*
|
*
|
||||||
* s390-tools is free software; you can redistribute it and/or modify
|
* s390-tools is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the MIT license. See LICENSE for details.
|
* it under the terms of the MIT license. See LICENSE for details.
|
||||||
@@ -13,6 +13,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
#include "lib/util_path.h"
|
#include "lib/util_path.h"
|
||||||
#include "lib/util_prg.h"
|
#include "lib/util_prg.h"
|
||||||
@@ -26,7 +27,7 @@ const struct util_prg prg = {
|
|||||||
{
|
{
|
||||||
.owner = "IBM Corp.",
|
.owner = "IBM Corp.",
|
||||||
.pub_first = 2001,
|
.pub_first = 2001,
|
||||||
.pub_last = 2017,
|
.pub_last = 2019,
|
||||||
},
|
},
|
||||||
UTIL_PRG_COPYRIGHT_END
|
UTIL_PRG_COPYRIGHT_END
|
||||||
}
|
}
|
||||||
@@ -72,9 +73,17 @@ static void test_path(const char *path)
|
|||||||
else
|
else
|
||||||
printf("reg_file=no ");
|
printf("reg_file=no ");
|
||||||
if (util_path_is_dir(path))
|
if (util_path_is_dir(path))
|
||||||
printf("dir=yes");
|
printf("dir=yes ");
|
||||||
else
|
else
|
||||||
printf("dir=no ");
|
printf("dir=no ");
|
||||||
|
if (util_path_is_readonly_file(path))
|
||||||
|
printf("read-only_file=yes ");
|
||||||
|
else
|
||||||
|
printf("read-only_file=no ");
|
||||||
|
if (util_path_is_writeonly_file(path))
|
||||||
|
printf("write-only_file=yes");
|
||||||
|
else
|
||||||
|
printf("write-only_file=no ");
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* Provide main function and command line parsing.
|
* Provide main function and command line parsing.
|
||||||
*
|
*
|
||||||
* Copyright IBM Corp. 2016, 2017
|
* Copyright IBM Corp. 2016, 2019
|
||||||
*
|
*
|
||||||
* s390-tools is free software; you can redistribute it and/or modify
|
* s390-tools is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the MIT license. See LICENSE for details.
|
* it under the terms of the MIT license. See LICENSE for details.
|
||||||
@@ -57,7 +57,7 @@ const struct util_prg prg = {
|
|||||||
{
|
{
|
||||||
.owner = "IBM Corp.",
|
.owner = "IBM Corp.",
|
||||||
.pub_first = 2016,
|
.pub_first = 2016,
|
||||||
.pub_last = 2017,
|
.pub_last = 2019,
|
||||||
},
|
},
|
||||||
UTIL_PRG_COPYRIGHT_END
|
UTIL_PRG_COPYRIGHT_END
|
||||||
}
|
}
|
||||||
@@ -236,7 +236,7 @@ static char *get_chp_dir(int css, int id)
|
|||||||
char *path;
|
char *path;
|
||||||
|
|
||||||
path = util_path_sysfs("devices/css%x/chp%x.%x", css, css, id);
|
path = util_path_sysfs("devices/css%x/chp%x.%x", css, css, id);
|
||||||
if ((stat(path, &sb) == 0) && (sb.st_mode == S_IFDIR))
|
if ((stat(path, &sb) == 0) && S_ISDIR(sb.st_mode))
|
||||||
return path;
|
return path;
|
||||||
free(path);
|
free(path);
|
||||||
return util_path_sysfs("devices/css%x/chp%x.%02x", css, css, id);
|
return util_path_sysfs("devices/css%x/chp%x.%02x", css, css, id);
|
||||||
@@ -296,7 +296,7 @@ static void perform_command(int css, int id)
|
|||||||
char *path;
|
char *path;
|
||||||
|
|
||||||
path = get_chp_dir(css, id);
|
path = get_chp_dir(css, id);
|
||||||
if ((stat(path, &sb) != 0) || ((sb.st_mode & S_IFMT) != S_IFDIR)) {
|
if ((stat(path, &sb) != 0) || !S_ISDIR(sb.st_mode)) {
|
||||||
printf("Skipping unknown channel-path %x.%02x\n", css, id);
|
printf("Skipping unknown channel-path %x.%02x\n", css, id);
|
||||||
goto out_free_path;
|
goto out_free_path;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,6 +72,11 @@ the parallel execution of cryptographic operations.
|
|||||||
Cryptographic performance measurement data might not be available when Linux
|
Cryptographic performance measurement data might not be available when Linux
|
||||||
is running as guest under z/VM or under KVM. \fBzcryptstats\fP then displays an
|
is running as guest under z/VM or under KVM. \fBzcryptstats\fP then displays an
|
||||||
error message and exits.
|
error message and exits.
|
||||||
|
.PP
|
||||||
|
.B Note:
|
||||||
|
\fBzcryptstats\fP utilizes the device node \fB/dev/chsc\fP. When this device
|
||||||
|
node is not available, you might have to load kernel module \fBchsc_sch\fP using
|
||||||
|
\fBmodprobe chsc_sch\fP to make it available.
|
||||||
.
|
.
|
||||||
.
|
.
|
||||||
.
|
.
|
||||||
|
|||||||
@@ -2393,7 +2393,11 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
g.chsc_fd = open(CHSC_DEVICE, O_RDWR);
|
g.chsc_fd = open(CHSC_DEVICE, O_RDWR);
|
||||||
if (g.chsc_fd < 0) {
|
if (g.chsc_fd < 0) {
|
||||||
|
rc = errno;
|
||||||
warnx("File '%s:' %s", CHSC_DEVICE, strerror(errno));
|
warnx("File '%s:' %s", CHSC_DEVICE, strerror(errno));
|
||||||
|
if (rc == ENOENT)
|
||||||
|
warnx("You might have to load kernel module 'chsc_sch' "
|
||||||
|
"using 'modprobe chsc_sch'");
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
pr_verbose("Device '%s' has been opened successfully", CHSC_DEVICE);
|
pr_verbose("Device '%s' has been opened successfully", CHSC_DEVICE);
|
||||||
|
|||||||
+6
-6
@@ -1128,12 +1128,6 @@ then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# check existence of ccwgroup devices
|
|
||||||
if ! [ -d $CCWGROUPBUS_DIR ]; then
|
|
||||||
print_error "There are no ccwgroup devices"
|
|
||||||
exit $RC_NO_CCWGROUP
|
|
||||||
fi
|
|
||||||
|
|
||||||
# determine environment
|
# determine environment
|
||||||
check_vm_env
|
check_vm_env
|
||||||
|
|
||||||
@@ -1298,6 +1292,12 @@ then
|
|||||||
exit $RC_TOO_MUCH_ARGUMENTS
|
exit $RC_TOO_MUCH_ARGUMENTS
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# check existence of ccwgroup devices
|
||||||
|
if ! [ -d $CCWGROUPBUS_DIR ]; then
|
||||||
|
print_error "There are no ccwgroup devices"
|
||||||
|
exit $RC_NO_CCWGROUP
|
||||||
|
fi
|
||||||
|
|
||||||
# react to parsed options
|
# react to parsed options
|
||||||
if [ $DO_ADD -eq 1 ]
|
if [ $DO_ADD -eq 1 ]
|
||||||
then
|
then
|
||||||
|
|||||||
@@ -136,6 +136,12 @@ void _warn(const char *, ...);
|
|||||||
fprintf(stderr, "%s:%d: ", __FILE__, __LINE__); \
|
fprintf(stderr, "%s:%d: ", __FILE__, __LINE__); \
|
||||||
_warn(__VA_ARGS__); \
|
_warn(__VA_ARGS__); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
void _warn_once(const char *, ...);
|
||||||
|
#define warn_once(...) do { \
|
||||||
|
if (debug_enabled) \
|
||||||
|
fprintf(stderr, "%s:%d: ", __FILE__, __LINE__); \
|
||||||
|
_warn_once(__VA_ARGS__); \
|
||||||
|
} while (0)
|
||||||
#define info(...) do { if (!quiet) fprintf(stdout_data ? stderr : stdout, \
|
#define info(...) do { if (!quiet) fprintf(stdout_data ? stderr : stdout, \
|
||||||
__VA_ARGS__); } while (0)
|
__VA_ARGS__); } while (0)
|
||||||
#define verb(...) do { if (verbose) fprintf(stdout_data ? stderr : stdout, \
|
#define verb(...) do { if (verbose) fprintf(stdout_data ? stderr : stdout, \
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ struct udev_file {
|
|||||||
};
|
};
|
||||||
|
|
||||||
exit_code_t udev_read_file(const char *, struct udev_file **);
|
exit_code_t udev_read_file(const char *, struct udev_file **);
|
||||||
|
bool udev_file_is_empty(struct udev_file *file);
|
||||||
void udev_free_file(struct udev_file *);
|
void udev_free_file(struct udev_file *);
|
||||||
void udev_file_print(struct udev_file *);
|
void udev_file_print(struct udev_file *);
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* zdev - Modify and display the persistent configuration of devices
|
* zdev - Modify and display the persistent configuration of devices
|
||||||
*
|
*
|
||||||
* Copyright IBM Corp. 2016, 2017
|
* Copyright IBM Corp. 2016, 2019
|
||||||
*
|
*
|
||||||
* s390-tools is free software; you can redistribute it and/or modify
|
* s390-tools is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the MIT license. See LICENSE for details.
|
* it under the terms of the MIT license. See LICENSE for details.
|
||||||
@@ -12,6 +12,8 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "ccw.h"
|
#include "ccw.h"
|
||||||
|
#include "exit_code.h"
|
||||||
|
#include "misc.h"
|
||||||
|
|
||||||
#define ZFCP_LUN_NAME "zfcp-lun"
|
#define ZFCP_LUN_NAME "zfcp-lun"
|
||||||
#define SCSI_ATTR_PREFIX "scsi_dev"
|
#define SCSI_ATTR_PREFIX "scsi_dev"
|
||||||
|
|||||||
+2
-2
@@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* chzdev: Configure z Systems specific devices
|
* chzdev: Configure z Systems specific devices
|
||||||
*
|
*
|
||||||
* Copyright IBM Corp. 2016, 2017
|
* Copyright IBM Corp. 2016, 2019
|
||||||
*
|
*
|
||||||
* s390-tools is free software; you can redistribute it and/or modify
|
* s390-tools is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the MIT license. See LICENSE for details.
|
* it under the terms of the MIT license. See LICENSE for details.
|
||||||
@@ -2573,7 +2573,7 @@ static exit_code_t do_export(struct options *opts)
|
|||||||
info("Exporting data to standard output\n");
|
info("Exporting data to standard output\n");
|
||||||
} else {
|
} else {
|
||||||
info("Exporting data to %s\n", opts->export);
|
info("Exporting data to %s\n", opts->export);
|
||||||
if (!util_path_exists(opts->export)) {
|
if (!util_path_exists("%s", opts->export)) {
|
||||||
rc = path_create(opts->export);
|
rc = path_create(opts->export);
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
|
|||||||
+3
-2
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* zdev - Modify and display the persistent configuration of devices
|
* zdev - Modify and display the persistent configuration of devices
|
||||||
*
|
*
|
||||||
* Copyright IBM Corp. 2016, 2017
|
* Copyright IBM Corp. 2016, 2019
|
||||||
*
|
*
|
||||||
* s390-tools is free software; you can redistribute it and/or modify
|
* s390-tools is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the MIT license. See LICENSE for details.
|
* it under the terms of the MIT license. See LICENSE for details.
|
||||||
@@ -10,6 +10,7 @@
|
|||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
#include "lib/util_path.h"
|
#include "lib/util_path.h"
|
||||||
|
|
||||||
@@ -521,7 +522,7 @@ void device_read_active_settings(struct device *dev, read_scope_t scope)
|
|||||||
s = setting_list_apply_actual(dev->active.settings, a, name,
|
s = setting_list_apply_actual(dev->active.settings, a, name,
|
||||||
value);
|
value);
|
||||||
if (link || (scope == scope_all &&
|
if (link || (scope == scope_all &&
|
||||||
!util_path_is_writable(path)))
|
util_path_is_readonly_file("%s", path)))
|
||||||
s->readonly = 1;
|
s->readonly = 1;
|
||||||
if (link)
|
if (link)
|
||||||
free(link);
|
free(link);
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ unsigned long longrun_total;
|
|||||||
unsigned long longrun_current;
|
unsigned long longrun_current;
|
||||||
|
|
||||||
static struct util_list *delayed_messages;
|
static struct util_list *delayed_messages;
|
||||||
|
static struct util_list *warn_once_messages;
|
||||||
static FILE *dryrun_file;
|
static FILE *dryrun_file;
|
||||||
|
|
||||||
static FILE *dryrun_get_file(void)
|
static FILE *dryrun_get_file(void)
|
||||||
@@ -245,6 +246,7 @@ static void dryrun_print(void)
|
|||||||
void misc_exit(void)
|
void misc_exit(void)
|
||||||
{
|
{
|
||||||
strlist_free(delayed_messages);
|
strlist_free(delayed_messages);
|
||||||
|
strlist_free(warn_once_messages);
|
||||||
if (dryrun_file) {
|
if (dryrun_file) {
|
||||||
if (verbose)
|
if (verbose)
|
||||||
dryrun_print();
|
dryrun_print();
|
||||||
@@ -362,6 +364,29 @@ void _warn(const char *format, ...)
|
|||||||
va_end(args);
|
va_end(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Report a warning: print an error message to standard error. Only print each
|
||||||
|
* warning once. */
|
||||||
|
void _warn_once(const char *format, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
char *str;
|
||||||
|
|
||||||
|
va_start(args, format);
|
||||||
|
if (vasprintf(&str, format, args) == -1)
|
||||||
|
oom();
|
||||||
|
va_end(args);
|
||||||
|
|
||||||
|
/* Check if message was printed before. */
|
||||||
|
if (!warn_once_messages)
|
||||||
|
warn_once_messages = strlist_new();
|
||||||
|
if (!strlist_find(warn_once_messages, str)) {
|
||||||
|
fprintf(stderr, "%s", str);
|
||||||
|
strlist_add(warn_once_messages, "%s", str);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(str);
|
||||||
|
}
|
||||||
|
|
||||||
/* Print an error message indicating an out-of-memory situation and exit. */
|
/* Print an error message indicating an out-of-memory situation and exit. */
|
||||||
void oom(void)
|
void oom(void)
|
||||||
{
|
{
|
||||||
|
|||||||
+4
-3
@@ -10,6 +10,7 @@
|
|||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#include "lib/util_path.h"
|
#include "lib/util_path.h"
|
||||||
@@ -259,7 +260,7 @@ bool module_set_params(const char *mod, struct setting_list *settings)
|
|||||||
struct setting *s;
|
struct setting *s;
|
||||||
char *path;
|
char *path;
|
||||||
const char *value;
|
const char *value;
|
||||||
bool result;
|
bool readonly;
|
||||||
exit_code_t rc;
|
exit_code_t rc;
|
||||||
|
|
||||||
/* First check if all modified settings can be applied this way. */
|
/* First check if all modified settings can be applied this way. */
|
||||||
@@ -277,9 +278,9 @@ bool module_set_params(const char *mod, struct setting_list *settings)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
path = path_get_sys_module_param(mod, s->name);
|
path = path_get_sys_module_param(mod, s->name);
|
||||||
result = util_path_is_writable(path);
|
readonly = util_path_is_readonly_file("%s", path);
|
||||||
free(path);
|
free(path);
|
||||||
if (!result) {
|
if (readonly) {
|
||||||
/* Sysfs file is not writable. */
|
/* Sysfs file is not writable. */
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -346,6 +346,21 @@ exit_code_t udev_read_file(const char *path, struct udev_file **file_ptr)
|
|||||||
return EXIT_OK;
|
return EXIT_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check if a udev file does not contain any statements. */
|
||||||
|
bool udev_file_is_empty(struct udev_file *file)
|
||||||
|
{
|
||||||
|
struct udev_line_node *l;
|
||||||
|
|
||||||
|
if (!file)
|
||||||
|
return true;
|
||||||
|
util_list_iterate(&file->lines, l) {
|
||||||
|
if (l->line[0])
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static bool get_ids_cb(const char *filename, void *data)
|
static bool get_ids_cb(const char *filename, void *data)
|
||||||
{
|
{
|
||||||
char *prefix = data;
|
char *prefix = data;
|
||||||
|
|||||||
+7
-2
@@ -108,8 +108,13 @@ exit_code_t udev_ccw_read_device(struct device *dev, bool autoconf)
|
|||||||
rc = udev_read_file(path, &file);
|
rc = udev_read_file(path, &file);
|
||||||
if (rc)
|
if (rc)
|
||||||
goto out;
|
goto out;
|
||||||
udev_file_get_settings(file, st->dev_attribs, state->settings);
|
if (udev_file_is_empty(file)) {
|
||||||
state->exists = 1;
|
warn_once("Warning: Invalid udev rule: %s\n", path);
|
||||||
|
state->exists = 0;
|
||||||
|
} else {
|
||||||
|
udev_file_get_settings(file, st->dev_attribs, state->settings);
|
||||||
|
state->exists = 1;
|
||||||
|
}
|
||||||
udev_free_file(file);
|
udev_free_file(file);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|||||||
@@ -163,9 +163,14 @@ exit_code_t udev_ccwgroup_read_device(struct device *dev, bool autoconf)
|
|||||||
rc = udev_read_file(path, &file);
|
rc = udev_read_file(path, &file);
|
||||||
if (rc)
|
if (rc)
|
||||||
goto out;
|
goto out;
|
||||||
udev_file_get_settings(file, st->dev_attribs, state->settings);
|
if (udev_file_is_empty(file)) {
|
||||||
expand_id(dev, file);
|
warn_once("Warning: Invalid udev rule: %s\n", path);
|
||||||
state->exists = 1;
|
state->exists = 0;
|
||||||
|
} else {
|
||||||
|
udev_file_get_settings(file, st->dev_attribs, state->settings);
|
||||||
|
expand_id(dev, file);
|
||||||
|
state->exists = 1;
|
||||||
|
}
|
||||||
udev_free_file(file);
|
udev_free_file(file);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
@@ -344,6 +349,9 @@ static char *read_full_id(const char *path)
|
|||||||
out:
|
out:
|
||||||
free(text);
|
free(text);
|
||||||
|
|
||||||
|
if (!id)
|
||||||
|
warn_once("Warning: Invalid udev rule: %s\n", path);
|
||||||
|
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -393,6 +393,9 @@ static exit_code_t udev_read_zfcp_lun_rule(const char *filename,
|
|||||||
out:
|
out:
|
||||||
udev_free_file(file);
|
udev_free_file(file);
|
||||||
|
|
||||||
|
if (!node)
|
||||||
|
warn_once("Warning: Invalid udev rule: %s\n", filename);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -475,11 +478,17 @@ static void zfcp_lun_node_to_state(struct zfcp_lun_node *node,
|
|||||||
struct attrib *a;
|
struct attrib *a;
|
||||||
char *name;
|
char *name;
|
||||||
|
|
||||||
state->exists = 1;
|
|
||||||
state->modified = 0;
|
state->modified = 0;
|
||||||
state->deconfigured = 0;
|
state->deconfigured = 0;
|
||||||
state->definable = 0;
|
state->definable = 0;
|
||||||
|
|
||||||
|
if (!node) {
|
||||||
|
state->exists = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
state->exists = 1;
|
||||||
|
|
||||||
util_list_iterate(&node->fc_settings->list, s) {
|
util_list_iterate(&node->fc_settings->list, s) {
|
||||||
a = attrib_find(attribs, s->name);
|
a = attrib_find(attribs, s->name);
|
||||||
setting_list_add(state->settings,
|
setting_list_add(state->settings,
|
||||||
@@ -519,10 +528,7 @@ exit_code_t udev_zfcp_lun_read_device(struct device *dev, bool autoconf)
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
node = zfcp_lun_node_find(luns, dev->devid);
|
node = zfcp_lun_node_find(luns, dev->devid);
|
||||||
if (node)
|
zfcp_lun_node_to_state(node, st->dev_attribs, state);
|
||||||
zfcp_lun_node_to_state(node, st->dev_attribs, state);
|
|
||||||
else
|
|
||||||
rc = EXIT_DEVICE_NOT_FOUND;
|
|
||||||
|
|
||||||
out:
|
out:
|
||||||
zfcp_lun_node_list_free(luns);
|
zfcp_lun_node_list_free(luns);
|
||||||
|
|||||||
+19
-5
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* zdev - Modify and display the persistent configuration of devices
|
* zdev - Modify and display the persistent configuration of devices
|
||||||
*
|
*
|
||||||
* Copyright IBM Corp. 2016, 2017
|
* Copyright IBM Corp. 2016, 2019
|
||||||
*
|
*
|
||||||
* s390-tools is free software; you can redistribute it and/or modify
|
* s390-tools is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the MIT license. See LICENSE for details.
|
* it under the terms of the MIT license. See LICENSE for details.
|
||||||
@@ -67,7 +67,7 @@ static struct attrib zfcp_tattr_allow_lun_scan = {
|
|||||||
"Control the use of the automatic LUN scanning feature for FCP\n"
|
"Control the use of the automatic LUN scanning feature for FCP\n"
|
||||||
"devices that are configured in N_PORT ID Virtualization mode.\n"
|
"devices that are configured in N_PORT ID Virtualization mode.\n"
|
||||||
" 0: Automatic LUN scanning is disabled\n"
|
" 0: Automatic LUN scanning is disabled\n"
|
||||||
" 1: Automatic LUN scanning is enabled\n\n",
|
" 1: Automatic LUN scanning is enabled\n",
|
||||||
.nounload = 1,
|
.nounload = 1,
|
||||||
.defval = "1",
|
.defval = "1",
|
||||||
.accept = ACCEPT_ARRAY(ACCEPT_RANGE(0, 1)),
|
.accept = ACCEPT_ARRAY(ACCEPT_RANGE(0, 1)),
|
||||||
@@ -75,16 +75,28 @@ static struct attrib zfcp_tattr_allow_lun_scan = {
|
|||||||
|
|
||||||
static struct attrib zfcp_tattr_dif = {
|
static struct attrib zfcp_tattr_dif = {
|
||||||
.name = "dif",
|
.name = "dif",
|
||||||
.title = "Enable DIF/DIX data consistency checking",
|
.title = "Enable DIF data consistency checking",
|
||||||
.desc =
|
.desc =
|
||||||
"Control the use of the end-to-end data consistency checking\n"
|
"Control the use of the DIF data consistency checking\n"
|
||||||
"mechanism (DIF/DIX):\n"
|
"mechanism:\n"
|
||||||
" 0: DIF is disabled\n"
|
" 0: DIF is disabled\n"
|
||||||
" 1: DIF is enabled when supported by the FCP device hardware\n",
|
" 1: DIF is enabled when supported by the FCP device hardware\n",
|
||||||
.defval = "0",
|
.defval = "0",
|
||||||
.accept = ACCEPT_ARRAY(ACCEPT_RANGE(0, 1)),
|
.accept = ACCEPT_ARRAY(ACCEPT_RANGE(0, 1)),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct attrib zfcp_tattr_dix = {
|
||||||
|
.name = "dix",
|
||||||
|
.title = "Enable DIF&DIX data consistency checking",
|
||||||
|
.desc =
|
||||||
|
"Control the use of the end-to-end data consistency checking\n"
|
||||||
|
"mechanism (DIF&DIX):\n"
|
||||||
|
" 0: DIF&DIX is disabled\n"
|
||||||
|
" 1: DIF&DIX is enabled when supported by the FCP device hardware\n",
|
||||||
|
.defval = "0",
|
||||||
|
.accept = ACCEPT_ARRAY(ACCEPT_RANGE(0, 1)),
|
||||||
|
};
|
||||||
|
|
||||||
static struct attrib zfcp_tattr_datarouter = {
|
static struct attrib zfcp_tattr_datarouter = {
|
||||||
.name = "datarouter",
|
.name = "datarouter",
|
||||||
.title = "Enable hardware data routing",
|
.title = "Enable hardware data routing",
|
||||||
@@ -160,6 +172,7 @@ static void all_bools_to_num(struct setting_list *list)
|
|||||||
util_list_iterate(&list->list, s) {
|
util_list_iterate(&list->list, s) {
|
||||||
if (s->attrib == &zfcp_tattr_allow_lun_scan ||
|
if (s->attrib == &zfcp_tattr_allow_lun_scan ||
|
||||||
s->attrib == &zfcp_tattr_dif ||
|
s->attrib == &zfcp_tattr_dif ||
|
||||||
|
s->attrib == &zfcp_tattr_dix ||
|
||||||
s->attrib == &zfcp_tattr_datarouter ||
|
s->attrib == &zfcp_tattr_datarouter ||
|
||||||
s->attrib == &zfcp_tattr_no_auto_port_rescan) {
|
s->attrib == &zfcp_tattr_no_auto_port_rescan) {
|
||||||
/* Convert Y to 1 and N to 0. */
|
/* Convert Y to 1 and N to 0. */
|
||||||
@@ -295,6 +308,7 @@ struct devtype zfcp_devtype = {
|
|||||||
&zfcp_tattr_queue_depth,
|
&zfcp_tattr_queue_depth,
|
||||||
&zfcp_tattr_allow_lun_scan,
|
&zfcp_tattr_allow_lun_scan,
|
||||||
&zfcp_tattr_dif,
|
&zfcp_tattr_dif,
|
||||||
|
&zfcp_tattr_dix,
|
||||||
&zfcp_tattr_datarouter,
|
&zfcp_tattr_datarouter,
|
||||||
&zfcp_tattr_no_auto_port_rescan,
|
&zfcp_tattr_no_auto_port_rescan,
|
||||||
&zfcp_tattr_port_scan_ratelimit,
|
&zfcp_tattr_port_scan_ratelimit,
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* zdev - Modify and display the persistent configuration of devices
|
* zdev - Modify and display the persistent configuration of devices
|
||||||
*
|
*
|
||||||
* Copyright IBM Corp. 2016, 2017
|
* Copyright IBM Corp. 2016, 2019
|
||||||
*
|
*
|
||||||
* s390-tools is free software; you can redistribute it and/or modify
|
* s390-tools is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the MIT license. See LICENSE for details.
|
* it under the terms of the MIT license. See LICENSE for details.
|
||||||
@@ -64,7 +64,7 @@ static struct attrib zfcp_host_attr_port_rescan = {
|
|||||||
.title = "Trigger a port rescan for the FCP device",
|
.title = "Trigger a port rescan for the FCP device",
|
||||||
.desc =
|
.desc =
|
||||||
"Rescan FCP device for available remote ports by writing the value 1\n"
|
"Rescan FCP device for available remote ports by writing the value 1\n"
|
||||||
"to this attribute\n",
|
"to this attribute.\n",
|
||||||
.activeonly = 1,
|
.activeonly = 1,
|
||||||
.writeonly = 1,
|
.writeonly = 1,
|
||||||
.accept = ACCEPT_ARRAY(ACCEPT_NUM(1)),
|
.accept = ACCEPT_ARRAY(ACCEPT_NUM(1)),
|
||||||
|
|||||||
+4
-1
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* zdev - Modify and display the persistent configuration of devices
|
* zdev - Modify and display the persistent configuration of devices
|
||||||
*
|
*
|
||||||
* Copyright IBM Corp. 2016, 2017
|
* Copyright IBM Corp. 2016, 2019
|
||||||
*
|
*
|
||||||
* s390-tools is free software; you can redistribute it and/or modify
|
* s390-tools is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the MIT license. See LICENSE for details.
|
* it under the terms of the MIT license. See LICENSE for details.
|
||||||
@@ -246,6 +246,7 @@ static unsigned long zfcp_lun_num_ids_in_range(const char *range)
|
|||||||
|
|
||||||
static bool zfcp_lun_is_id_in_range(const char *id, const char *range)
|
static bool zfcp_lun_is_id_in_range(const char *id, const char *range)
|
||||||
{
|
{
|
||||||
|
/* No ranges are supported on zfcp lun IDs. */
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -317,6 +318,7 @@ struct namespace zfcp_lun_namespace = {
|
|||||||
/*
|
/*
|
||||||
* zfcp lun device attributes.
|
* zfcp lun device attributes.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static struct attrib zfcp_lun_attr_failed = {
|
static struct attrib zfcp_lun_attr_failed = {
|
||||||
.name = "failed",
|
.name = "failed",
|
||||||
.title = "Check and restart FCP SCSI device recovery",
|
.title = "Check and restart FCP SCSI device recovery",
|
||||||
@@ -1080,6 +1082,7 @@ static exit_code_t zfcp_lun_st_detect_definable(struct subtype *st,
|
|||||||
/*
|
/*
|
||||||
* zfcp lun subtype.
|
* zfcp lun subtype.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct subtype zfcp_lun_subtype = {
|
struct subtype zfcp_lun_subtype = {
|
||||||
.super = &subtype_base,
|
.super = &subtype_base,
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -6,7 +6,7 @@ CFLAGS_BOOT = $(NO_PIE_CFLAGS) -Os -g -I../include -D__ASSEMBLY__ \
|
|||||||
-fno-builtin -ffreestanding -fno-asynchronous-unwind-tables \
|
-fno-builtin -ffreestanding -fno-asynchronous-unwind-tables \
|
||||||
-fno-delete-null-pointer-checks \
|
-fno-delete-null-pointer-checks \
|
||||||
-fexec-charset=IBM1047 -m64 -mpacked-stack \
|
-fexec-charset=IBM1047 -m64 -mpacked-stack \
|
||||||
-mstack-size=8192 -mstack-guard=128 -msoft-float \
|
-mstack-size=4096 -mstack-guard=128 -msoft-float \
|
||||||
-W -Wall -Wformat-security
|
-W -Wall -Wformat-security
|
||||||
|
|
||||||
FILES = fba0.bin fba1b.bin fba2.bin \
|
FILES = fba0.bin fba1b.bin fba2.bin \
|
||||||
@@ -46,7 +46,7 @@ stage3.exec: head.o stage3.o kdump3.o libc.o sclp.o sclp_stage3.o \
|
|||||||
kdump.o entry.o stage3.lds
|
kdump.o entry.o stage3.lds
|
||||||
|
|
||||||
%.exec: %.o
|
%.exec: %.o
|
||||||
@STAGE=$$( \
|
STAGE=$$( \
|
||||||
echo $@ | awk ' \
|
echo $@ | awk ' \
|
||||||
match($$0,/[0-9]+b*/){ \
|
match($$0,/[0-9]+b*/){ \
|
||||||
print substr($$0,RSTART,RLENGTH) \
|
print substr($$0,RSTART,RLENGTH) \
|
||||||
@@ -59,7 +59,7 @@ stage3.exec: head.o stage3.o kdump3.o libc.o sclp.o sclp_stage3.o \
|
|||||||
2) SFLAGS="$(NO_PIE_LINKFLAGS) -nostdlib -Wl,-T,stage2.lds";; \
|
2) SFLAGS="$(NO_PIE_LINKFLAGS) -nostdlib -Wl,-T,stage2.lds";; \
|
||||||
3) SFLAGS="$(NO_PIE_LINKFLAGS) -nostdlib -Wl,-T,stage3.lds";; \
|
3) SFLAGS="$(NO_PIE_LINKFLAGS) -nostdlib -Wl,-T,stage3.lds";; \
|
||||||
esac; \
|
esac; \
|
||||||
$(LINK) $$SFLAGS -m64 $^ -o $@
|
$(LINK) $$SFLAGS -m64 $(filter %.o, $^) -o $@
|
||||||
|
|
||||||
%.bin: %.exec
|
%.bin: %.exec
|
||||||
$(OBJCOPY) -O binary \
|
$(OBJCOPY) -O binary \
|
||||||
@@ -91,7 +91,7 @@ stage3.bin: stage3.exec
|
|||||||
--only-section=.stage2dump.tail \
|
--only-section=.stage2dump.tail \
|
||||||
--only-section=.eckd2dump_mv.tail \
|
--only-section=.eckd2dump_mv.tail \
|
||||||
--only-section=.fixup \
|
--only-section=.fixup \
|
||||||
--pad-to=0xf000 \
|
--pad-to=0xe000 \
|
||||||
$< $@
|
$< $@
|
||||||
|
|
||||||
data.o: $(FILES)
|
data.o: $(FILES)
|
||||||
|
|||||||
+1
-1
@@ -15,7 +15,7 @@
|
|||||||
#include "stage2.h"
|
#include "stage2.h"
|
||||||
|
|
||||||
/* address of extra command line */
|
/* address of extra command line */
|
||||||
#define COMMAND_LINE_EXTRA (0xA000-0x400)
|
#define COMMAND_LINE_EXTRA 0xE000
|
||||||
|
|
||||||
/* max command line length */
|
/* max command line length */
|
||||||
#define COMMAND_LINE_SIZE 896
|
#define COMMAND_LINE_SIZE 896
|
||||||
|
|||||||
+14
-7
@@ -452,6 +452,18 @@ static inline int test_facility(unsigned long nr)
|
|||||||
return __test_facility(nr, &S390_lowcore.stfle_fac_list);
|
return __test_facility(nr, &S390_lowcore.stfle_fac_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline unsigned long __stfle_asm(u64 *stfle_fac_list, int size)
|
||||||
|
{
|
||||||
|
register unsigned long reg0 asm("0") = size - 1;
|
||||||
|
|
||||||
|
asm volatile(
|
||||||
|
".insn s,0xb2b00000,0(%1)" /* stfle */
|
||||||
|
: "+d" (reg0)
|
||||||
|
: "a" (stfle_fac_list)
|
||||||
|
: "memory", "cc");
|
||||||
|
return reg0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* stfle - Store facility list extended
|
* stfle - Store facility list extended
|
||||||
* @stfle_fac_list: array where facility list can be stored
|
* @stfle_fac_list: array where facility list can be stored
|
||||||
@@ -470,13 +482,8 @@ static inline void stfle(u64 *stfle_fac_list, int size)
|
|||||||
memcpy(stfle_fac_list, &S390_lowcore.stfl_fac_list, 4);
|
memcpy(stfle_fac_list, &S390_lowcore.stfl_fac_list, 4);
|
||||||
if (S390_lowcore.stfl_fac_list & 0x01000000) {
|
if (S390_lowcore.stfl_fac_list & 0x01000000) {
|
||||||
/* More facility bits available with stfle */
|
/* More facility bits available with stfle */
|
||||||
register unsigned long reg0 asm("0") = size - 1;
|
nr = __stfle_asm(stfle_fac_list, size);
|
||||||
|
nr = MIN((nr + 1) * 8, size * 8UL);
|
||||||
asm volatile(".insn s,0xb2b00000,0(%1)" /* stfle */
|
|
||||||
: "+d" (reg0)
|
|
||||||
: "a" (stfle_fac_list)
|
|
||||||
: "memory", "cc");
|
|
||||||
nr = (reg0 + 1) * 8; /* # bytes stored by stfle */
|
|
||||||
}
|
}
|
||||||
memset((char *) stfle_fac_list + nr, 0, size * 8 - nr);
|
memset((char *) stfle_fac_list + nr, 0, size * 8 - nr);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,8 @@
|
|||||||
* 0x6000-0x8fff Memory allocation (heap)
|
* 0x6000-0x8fff Memory allocation (heap)
|
||||||
* 0x9000-0x9fff Memory to load stage3 parameter to
|
* 0x9000-0x9fff Memory to load stage3 parameter to
|
||||||
* 0xa000-0xdfff Memory to load stage3 to
|
* 0xa000-0xdfff Memory to load stage3 to
|
||||||
* 0xe000-0xffff Stack
|
* 0xe000-0xe3ff command line extra
|
||||||
|
* 0xe400-0xffff Stack
|
||||||
*
|
*
|
||||||
* Special memory locations
|
* Special memory locations
|
||||||
* ------------------------
|
* ------------------------
|
||||||
|
|||||||
+1
-1
@@ -22,7 +22,7 @@
|
|||||||
#define OLDMEM_SIZE 0x10420
|
#define OLDMEM_SIZE 0x10420
|
||||||
#define COMMAND_LINE 0x10480
|
#define COMMAND_LINE 0x10480
|
||||||
#define COMMAND_LINE_SIZE 896
|
#define COMMAND_LINE_SIZE 896
|
||||||
#define COMMAND_LINE_EXTRA (0xA000-0x400)
|
#define COMMAND_LINE_EXTRA 0xE000
|
||||||
|
|
||||||
#define STAGE3_FLAG_SCSI 0x0001000000000000ULL
|
#define STAGE3_FLAG_SCSI 0x0001000000000000ULL
|
||||||
#define STAGE3_FLAG_KDUMP 0x0002000000000000ULL
|
#define STAGE3_FLAG_KDUMP 0x0002000000000000ULL
|
||||||
|
|||||||
+3
-3
@@ -360,11 +360,11 @@ Control the zIPL secure boot support.
|
|||||||
auto (default)
|
auto (default)
|
||||||
Write signatures if available and supported by the system.
|
Write signatures if available and supported by the system.
|
||||||
1
|
1
|
||||||
Signatures are written independent of support indicated by the local
|
Write signatures regardless of support indicated by the local
|
||||||
system. Also missing signatures for stage 3 and kernel IPL files
|
system. Missing signatures for stage 3 and kernel IPL files
|
||||||
will result in an error.
|
will result in an error.
|
||||||
0
|
0
|
||||||
No signatures will be written.
|
Do not write signatures.
|
||||||
|
|
||||||
|
|
||||||
.SH EXAMPLE
|
.SH EXAMPLE
|
||||||
|
|||||||
@@ -527,17 +527,17 @@ non-default memory location.
|
|||||||
.B Configuration section:
|
.B Configuration section:
|
||||||
.br
|
.br
|
||||||
Control the zIPL secure boot support.
|
Control the zIPL secure boot support.
|
||||||
Set this option to one of the following:
|
Set this option to one of the following values:
|
||||||
.IP " - " 12
|
.IP " - " 12
|
||||||
.BR auto:
|
.BR auto:
|
||||||
Write signatures if available and supported by the system.
|
Write signatures if available and supported by the system.
|
||||||
.IP " - " 12
|
.IP " - " 12
|
||||||
.BR 1:
|
.BR 1:
|
||||||
Signatures are written independent of support indicated by the local system.
|
Write signatures regardless of support indicated by the local system.
|
||||||
Also missing signatures for stage 3 and kernel IPL files will result in an error.
|
Missing signatures for stage 3 and kernel IPL files will result in an error.
|
||||||
.IP " - " 12
|
.IP " - " 12
|
||||||
.BR 0:
|
.BR 0:
|
||||||
No signatures will be written.
|
Do not write signatures.
|
||||||
|
|
||||||
The default value for
|
The default value for
|
||||||
.B 'secure'
|
.B 'secure'
|
||||||
|
|||||||
@@ -699,6 +699,10 @@ scan_bls_field(struct misc_file_buffer *file, struct scan_token* scan,
|
|||||||
}
|
}
|
||||||
|
|
||||||
val_end = file->pos;
|
val_end = file->pos;
|
||||||
|
|
||||||
|
while (val_end > val_start && isblank(file->buffer[val_end - 1]))
|
||||||
|
val_end--;
|
||||||
|
|
||||||
file->buffer[key_end] = '\0';
|
file->buffer[key_end] = '\0';
|
||||||
file->buffer[val_end] = '\0';
|
file->buffer[val_end] = '\0';
|
||||||
|
|
||||||
@@ -780,6 +784,7 @@ scan_bls(const char* blsdir, struct scan_token** token, int scan_size)
|
|||||||
case EOF:
|
case EOF:
|
||||||
break;
|
break;
|
||||||
case '\t':
|
case '\t':
|
||||||
|
case '\n':
|
||||||
case '\0':
|
case '\0':
|
||||||
case ' ':
|
case ' ':
|
||||||
file.pos++;
|
file.pos++;
|
||||||
|
|||||||
+10
-23
@@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* Keystore handling functions
|
* Keystore handling functions
|
||||||
*
|
*
|
||||||
* Copyright IBM Corp. 2018
|
* Copyright IBM Corp. 2018, 2019
|
||||||
*
|
*
|
||||||
* s390-tools is free software; you can redistribute it and/or modify
|
* s390-tools is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the MIT license. See LICENSE for details.
|
* it under the terms of the MIT license. See LICENSE for details.
|
||||||
@@ -133,14 +133,7 @@ static int _keystore_get_key_filenames(struct keystore *keystore,
|
|||||||
*/
|
*/
|
||||||
static int _keystore_reencipher_key_exists(struct key_filenames *file_names)
|
static int _keystore_reencipher_key_exists(struct key_filenames *file_names)
|
||||||
{
|
{
|
||||||
struct stat sb;
|
return util_path_is_reg_file("%s", file_names->renc_filename);
|
||||||
int rc;
|
|
||||||
|
|
||||||
rc = stat(file_names->renc_filename, &sb);
|
|
||||||
if (rc == 0 && !S_ISREG(sb.st_mode))
|
|
||||||
rc = 1;
|
|
||||||
|
|
||||||
return !rc;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -153,20 +146,14 @@ static int _keystore_reencipher_key_exists(struct key_filenames *file_names)
|
|||||||
*/
|
*/
|
||||||
static int _keystore_exists_keyfiles(struct key_filenames *file_names)
|
static int _keystore_exists_keyfiles(struct key_filenames *file_names)
|
||||||
{
|
{
|
||||||
struct stat sb_skey, sb_info;
|
bool rc_skey, rc_info;
|
||||||
int rc_skey, rc_info;
|
|
||||||
|
|
||||||
rc_skey = stat(file_names->skey_filename, &sb_skey);
|
rc_skey = util_path_is_reg_file("%s", file_names->skey_filename);
|
||||||
if (rc_skey == 0 && !S_ISREG(sb_skey.st_mode))
|
rc_info = util_path_is_reg_file("%s", file_names->info_filename);
|
||||||
rc_skey = 1;
|
|
||||||
|
|
||||||
rc_info = stat(file_names->info_filename, &sb_info);
|
if (rc_skey && rc_info)
|
||||||
if (rc_info == 0 && !S_ISREG(sb_info.st_mode))
|
|
||||||
rc_info = 1;
|
|
||||||
|
|
||||||
if (rc_skey == 0 && rc_info == 0)
|
|
||||||
return 1;
|
return 1;
|
||||||
if (rc_skey != 0 && rc_info != 0 &&
|
if (!rc_skey && !rc_info &&
|
||||||
_keystore_reencipher_key_exists(file_names) == 0)
|
_keystore_reencipher_key_exists(file_names) == 0)
|
||||||
return 0;
|
return 0;
|
||||||
return -1;
|
return -1;
|
||||||
@@ -1378,7 +1365,7 @@ struct keystore *keystore_new(const char *directory, bool verbose)
|
|||||||
warnx("Can not access '%s': %s", directory, strerror(errno));
|
warnx("Can not access '%s': %s", directory, strerror(errno));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (!(sb.st_mode & S_IFDIR)) {
|
if (!S_ISDIR(sb.st_mode)) {
|
||||||
warnx("'%s' is not a directory", directory);
|
warnx("'%s' is not a directory", directory);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -3063,7 +3050,7 @@ out:
|
|||||||
* @returnd 0 if the user confirmed the deletion, a negative errno value
|
* @returnd 0 if the user confirmed the deletion, a negative errno value
|
||||||
* otherwise
|
* otherwise
|
||||||
*/
|
*/
|
||||||
static int _keystore_propmp_for_remove(struct keystore *keystore,
|
static int _keystore_prompt_for_remove(struct keystore *keystore,
|
||||||
const char *name,
|
const char *name,
|
||||||
struct key_filenames *file_names)
|
struct key_filenames *file_names)
|
||||||
{
|
{
|
||||||
@@ -3129,7 +3116,7 @@ int keystore_remove_key(struct keystore *keystore, const char *name,
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (!quiet) {
|
if (!quiet) {
|
||||||
if (_keystore_propmp_for_remove(keystore, name,
|
if (_keystore_prompt_for_remove(keystore, name,
|
||||||
&file_names) != 0)
|
&file_names) != 0)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -267,7 +267,7 @@ static u8 *read_clear_key(const char *keyfile, size_t keybits, bool xts,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
keybits = DOUBLE_KEYSIZE_FOR_XTS(size * 8, xts);
|
keybits = HALF_KEYSIZE_FOR_XTS(size * 8, xts);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (keybits) {
|
switch (keybits) {
|
||||||
|
|||||||
+5
-12
@@ -1067,7 +1067,7 @@ static int command_generate(void)
|
|||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
if (g.apqns == NULL && g.noapqncheck) {
|
if (g.apqns == NULL && g.noapqncheck) {
|
||||||
warnx("Option '--noapqncheck' is only valid together with "
|
warnx("Option '--no-apqn-check' is only valid together with "
|
||||||
"the '--apqns|-a' option");
|
"the '--apqns|-a' option");
|
||||||
util_prg_print_parse_error();
|
util_prg_print_parse_error();
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
@@ -1088,7 +1088,7 @@ static int command_generate(void)
|
|||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
if (g.noapqncheck) {
|
if (g.noapqncheck) {
|
||||||
warnx("Option '--noapqncheck' is not valid for "
|
warnx("Option '--no-apqn-check' is not valid for "
|
||||||
"generating a key outside of the repository");
|
"generating a key outside of the repository");
|
||||||
util_prg_print_parse_error();
|
util_prg_print_parse_error();
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
@@ -1317,7 +1317,7 @@ static int command_validate_file(void)
|
|||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
if (g.noapqncheck) {
|
if (g.noapqncheck) {
|
||||||
warnx("Option '--noapqncheck' is not valid for "
|
warnx("Option '--no-apqn-check' is not valid for "
|
||||||
"validating a key outside of the repository");
|
"validating a key outside of the repository");
|
||||||
util_prg_print_parse_error();
|
util_prg_print_parse_error();
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
@@ -1375,13 +1375,6 @@ static int command_validate_repository(void)
|
|||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
if (g.apqns == NULL && g.noapqncheck) {
|
|
||||||
warnx("Option '--noapqncheck' is only valid together with "
|
|
||||||
"the '--apqns|-a' option");
|
|
||||||
util_prg_print_parse_error();
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
rc = keystore_validate_key(g.keystore, g.name, g.apqns, g.noapqncheck,
|
rc = keystore_validate_key(g.keystore, g.name, g.apqns, g.noapqncheck,
|
||||||
g.pkey_fd);
|
g.pkey_fd);
|
||||||
|
|
||||||
@@ -1421,7 +1414,7 @@ static int command_import(void)
|
|||||||
g.sector_size = 0;
|
g.sector_size = 0;
|
||||||
|
|
||||||
if (g.apqns == NULL && g.noapqncheck) {
|
if (g.apqns == NULL && g.noapqncheck) {
|
||||||
warnx("Option '--noapqncheck' is only valid together with "
|
warnx("Option '--no-apqn-check' is only valid together with "
|
||||||
"the '--apqns|-a' option");
|
"the '--apqns|-a' option");
|
||||||
util_prg_print_parse_error();
|
util_prg_print_parse_error();
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
@@ -1501,7 +1494,7 @@ static int command_change(void)
|
|||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
if (g.apqns == NULL && g.noapqncheck) {
|
if (g.apqns == NULL && g.noapqncheck) {
|
||||||
warnx("Option '--noapqncheck' is only valid together with "
|
warnx("Option '--no-apqn-check' is only valid together with "
|
||||||
"the '--apqns|-a' option");
|
"the '--apqns|-a' option");
|
||||||
util_prg_print_parse_error();
|
util_prg_print_parse_error();
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
|
|||||||
Reference in New Issue
Block a user