From 9b225fac81186176075f673dfe5cf8e373b2068a Mon Sep 17 00:00:00 2001 From: Dan Horak Date: Sun, 20 Jul 2008 09:24:05 +0200 Subject: [PATCH 1/8] s390-tools-1.5.3-zipl-zfcpdump-2 --- common.mak | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common.mak b/common.mak index 44adc6e..4373da5 100644 --- a/common.mak +++ b/common.mak @@ -62,8 +62,8 @@ GROUP = $(shell id -gn) export INSTROOT BINDIR LIBDIR MANDIR OWNER GROUP # Special defines for zfcpdump -ZFCPDUMP_DIR = /usr/local/share/zfcpdump -ZFCPDUMP_IMAGE = zfcpdump.image +ZFCPDUMP_DIR = /boot +ZFCPDUMP_IMAGE = zfcpdump ZFCPDUMP_RD = zfcpdump.rd export ZFCPDUMP_DIR ZFCPDUMP_IMAGE ZFCPDUMP_RD -- 1.8.1.4 From a3d9221076f9eb7cc8434baac71327f786351c63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dan=20Hor=C3=A1k?= Date: Thu, 23 Apr 2009 11:46:01 +0200 Subject: [PATCH 2/8] s390-tools-1.8.1-fdasd-su --- fdasd/fdasd.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/fdasd/fdasd.c b/fdasd/fdasd.c index ba22475..f2ac417 100644 --- a/fdasd/fdasd.c +++ b/fdasd/fdasd.c @@ -2229,10 +2229,12 @@ static void fdasd_get_geometry (fdasd_anchor_t *anc) if (anc->verbose) printf("disk type check : ok\n"); if (dasd_info.FBA_layout != 0) { - snprintf(err_str, ERROR_STRING_SIZE, - "%s is not formatted with z/OS compatible " - "disk layout!", options.device); - fdasd_error(anc, wrong_disk_format, err_str); + if (!anc->silent) { + snprintf(err_str, ERROR_STRING_SIZE, + "%s is not formatted with z/OS compatible " + "disk layout!", options.device); + fdasd_error(anc, wrong_disk_format, err_str); + } } if (anc->verbose) printf("disk layout check : ok\n"); -- 1.8.1.4 From d13c754f68ea838a47b8125006b9b493cfbbb7f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dan=20Hor=C3=A1k?= Date: Wed, 21 Aug 2013 12:13:30 +0200 Subject: [PATCH 3/8] dbginfo.sh: Avoiding exclusion list for pipes in sysfs Description: dbginfo.sh: Avoiding exclusion list for pipes in sysfs Symptom: The dbginfo.sh script hangs Problem: The trace pipes for CPU tracing in sysfs can potentially block dbginfo. Solution: Switch over to make use of dd with the nonblock option to savely collect the whole sysfs without keeping an exclusion list up to date Reproduction: Run dbginfo on a kernel that provides trace_pipe and trace_pipe_raw --- scripts/dbginfo.sh | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/scripts/dbginfo.sh b/scripts/dbginfo.sh index 6d07132..0ada40b 100755 --- a/scripts/dbginfo.sh +++ b/scripts/dbginfo.sh @@ -181,8 +181,8 @@ fi if test ${LINUX_SUPPORT_SYSFSDBF} -eq 1; then if test -e /proc/s390dbf; then PROCFILES="${PROCFILES}\ - `find /proc/s390dbf -type f -not -path \"*/raw\" -not -path \"*/flush\" 2>/dev/null`\ - " + `find /proc/s390dbf -type f -not -path \"*/raw\" -not -path \"*/flush\" 2>/dev/null`\ + " fi fi @@ -492,12 +492,9 @@ collect_sysfs() { mkdir -p "${WORKPATH}${dir_name}" done - find /sys -noleaf -type f -perm /444 \ - -a -not -name "*trace_pipe" \ - -a -not -path "*debug/hid*/events" \ - -a -not -path "*debug/usb/usbmon/*" 2>/dev/null | while IFS= read -r file_name; do + find /sys -noleaf -type f -perm /444 2>/dev/null | while IFS= read -r file_name; do echo " ${file_name}" - cp -P --preserve=links -L --parents "${file_name}" "${WORKPATH}" + dd if="${file_name}" iflag=nonblock of="${WORKPATH}${file_name}" done if test ${debugfs_mounted} -eq 1; then @@ -574,7 +571,7 @@ call_run_command() { # check if command exists if ! which "${raw_cmd}" >/dev/null 2>&1; then - # check if command is a builtin + # check if command is a builtin if ! command -v "${raw_cmd}" >/dev/null 2>&1; then echo " WARNING: Command \"${raw_cmd}\" not available" >> "${logfile}" echo >> "${logfile}" @@ -722,7 +719,7 @@ environment_setup() if test -e "${WORKDIR_BASE}${SCRIPTNAME}".lock; then print_alreadyrunning - exit 1 + exit 1 else touch "${WORKDIR_BASE}${SCRIPTNAME}".lock fi -- 1.8.1.4 From 7d540e7f40c731092ac655d1d38af7d69ceee706 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dan=20Hor=C3=A1k?= Date: Wed, 21 Aug 2013 12:13:58 +0200 Subject: [PATCH 4/8] zipl: Fix zipl "--force" option for DASD multi-volume dump Description: zipl: Fix zipl "--force" option for DASD multi-volume dump Symptom: When specifying "--force" and afterwards the dump partition is modified, for example by creating a swap partition, the dump still fails with the message "Wrong signature". Problem: The "larl" instruction was used to load an odd address which results in an incorrect even address. Solution: Load the correct even address. Reproduction: 1) Create ECKD MV dump DASDs: $ zipl -M mvdump.list --force 2) Modify partitions: $ dd if=/dev/zero of=/dev/dasdx1 3) Create dump -> Should work with this fix --- zipl/boot/eckd2mvdump.S | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/zipl/boot/eckd2mvdump.S b/zipl/boot/eckd2mvdump.S index f1cec78..529d6b3 100644 --- a/zipl/boot/eckd2mvdump.S +++ b/zipl/boot/eckd2mvdump.S @@ -153,7 +153,7 @@ _dump_mem_64: .Lcheck_sign: larl %r7,.Lforce - tm 0(%r7),0x01 # was zipl --force specified? + tm 1(%r7),0x01 # was zipl --force specified? bo .Lheaders-0b(%r13) # yes, skip signature check llgf %r2,.Ldev_start_blk-0b(%r13) # start block of partition lghi %r3,TMP_PAGE_START # destination of read operation @@ -576,8 +576,9 @@ _ioblock_64: .byte 0x85, 0x40, 0xa2, 0xa3, 0x81, 0x94, 0x97, 0xa2 .byte 0x00 -.org (MVDUMP_TOOL_SIZE - 9) +.org (MVDUMP_TOOL_SIZE - 10) .Lforce: + .byte 0x00 .byte 0x00 # is set to 0x01 by zipl -f .Lmem_upper_limit: .long 0xffffffff,0xffffffff # can be used for memsize=xxx -- 1.8.1.4 From 21caf0d0dc05c5e950f369f72027a203a7d3e772 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dan=20Hor=C3=A1k?= Date: Tue, 5 Nov 2013 12:23:18 +0100 Subject: [PATCH 5/8] zipl: Use "possible_cpus" kernel parameter Description: zipl: Use "possible_cpus" kernel parameter Symptom: The zfcpdump system might run out-of memory. Problem: For each possible CPU the zfcpdump kernel consumes memory for the per-CPU data structures. Since it only runs with one CPU this is not necessary. Because only 32 MiB are available for zfcpdump the per-CPU data should not be allocated. Solution: Use the kernel parameter "possible_cpus=1". Reproduction: To verify that the fix is included check that the zipl -D output line "kernel parmline" contains "possible_cpus=1". --- zipl/src/bootmap.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/zipl/src/bootmap.c b/zipl/src/bootmap.c index cc2ed16..68dffe1 100644 --- a/zipl/src/bootmap.c +++ b/zipl/src/bootmap.c @@ -603,10 +603,11 @@ create_dump_fs_parmline(const char* parmline, const char* root_dev, if (!result) return NULL; snprintf(result, DUMP_PARAM_MAX_LEN, "%s%sroot=%s dump_part=%d " - "dump_mem=%lld maxcpus=%d cgroup_disable=memory", + "dump_mem=%lld maxcpus=%d possible_cpus=%d " + "cgroup_disable=memory", parmline ? parmline : "", parmline ? " " : "", root_dev, part_num, - (unsigned long long) mem, max_cpus); + (unsigned long long) mem, max_cpus, max_cpus); result[DUMP_PARAM_MAX_LEN - 1] = 0; return result; } -- 1.8.1.4 From d3792e20601152ac2deea8d592b9fc176590ec5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dan=20Hor=C3=A1k?= Date: Tue, 19 Nov 2013 18:02:03 +0100 Subject: [PATCH 6/8] dbginfo.sh: enhancements for script execution and man page Description: dbginfo.sh: enhancements for script execution and man page Symptom: The result of the data collection does not provide all required information which is required to finally analyze the situation. Problem: The execution of the script has the following issues * The script does not verify if it is running for user root * The script does not post any messages into syslog during runtime. This makes it quite difficulty to verify, when the data collection started and ended. * The script does not run in a dedicated locale. The output of various tools can include messages in the language which has been set by the administrator. * Some Linux on System z specific tools are not yet processed during data collection, such as lsmem and lschp. * Some important configuration files are still not collected, such as openssl.conf and openssl.cnf. * Some parts in the man page might not be shown properly Solution: The following changes are implemented: * Added verification if the script is executed for user root * Added logging mechanism to print messages into syslog. * Added statement for LC_ALL to set the "C" 'standard' locale * Added lsmem and lschp for commands being executed * Added openssl.conf and openssl.cnf to be collected as configuration files * Corrected some parts in the man page Reproduction: Some information how to reproduce the issues * Run the script as 'non-root' user. The output will not contain all the important information. * Run the script and verify if something is stated in syslog, when the script is executed. * Run the script on a system, where the locale is set to 'non-en' locale. Some out put of important commands will be printed in the non-en locale. * Run the data collection and verify that the output of lsmem, and lschp and that the config files openssl.conf, and openssl.cnf are not collected. --- scripts/dbginfo.sh | 167 ++++++++++++++++++++++++++++++--------------------- scripts/dbginfo.sh.1 | 34 +++++------ 2 files changed, 116 insertions(+), 85 deletions(-) diff --git a/scripts/dbginfo.sh b/scripts/dbginfo.sh index 0ada40b..9b64076 100755 --- a/scripts/dbginfo.sh +++ b/scripts/dbginfo.sh @@ -28,6 +28,9 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################### +# Switching to neutral locale +export LC_ALL=C + # The kernel release version as delivered from uname -r readonly KERNEL_RELEASE_VERSION="`uname -r 2>/dev/null`" @@ -44,6 +47,9 @@ readonly TERMINAL="`tty 2>/dev/null`" # The processor ID for the first processor readonly PROCESSORID=`grep -E ".*processor 0:.*" /proc/cpuinfo | sed 's/.*identification[[:space:]]*\=[[:space:]]*\([[:alnum:]]*\).*/\1/g'` +# The processor version for the first processor +readonly PROCESSORVERSION=`grep -E ".*processor 0:.*" /proc/cpuinfo | sed 's/.*version[[:space:]]*\=[[:space:]]*\([[:alnum:]]*\).*/\1/g'` + # The current date readonly DATETIME=`date +%Y-%m-%d-%H-%M-%S 2>/dev/null` @@ -114,13 +120,13 @@ else readonly LINUX_SUPPORT_SYSFSDBF=0 fi -# Is this Linux on System z under z/VM (0=yes, 1=no) -if grep -q 'z/VM' /proc/sysinfo 2>/dev/null; then - readonly LINUX_ON_ZVM=0 +if test "x${PROCESSORVERSION}" = "xFF" || test "x${PROCESSORVERSION}" = "xff"; then + readonly RUNTIME_ENVIRONMENT=`grep -E "VM00.*Control Program.*" /proc/sysinfo| sed 's/.*:[[:space:]]*\([[:graph:]]*\).*/\1/g'`; else - readonly LINUX_ON_ZVM=1 + readonly RUNTIME_ENVIRONMENT="LPAR" fi + ######################################## # Collection of proc fs entries @@ -181,8 +187,8 @@ fi if test ${LINUX_SUPPORT_SYSFSDBF} -eq 1; then if test -e /proc/s390dbf; then PROCFILES="${PROCFILES}\ - `find /proc/s390dbf -type f -not -path \"*/raw\" -not -path \"*/flush\" 2>/dev/null`\ - " + `find /proc/s390dbf -type f -not -path \"*/raw\" -not -path \"*/flush\" 2>/dev/null`\ + " fi fi @@ -277,7 +283,9 @@ CMDS="uname -a\ :multipath -d\ :multipath -t\ :lsqeth\ + :lschp\ :lscss\ + :lsmem\ :lsdasd\ :ziorep_config -ADM\ :lsmod\ @@ -376,7 +384,7 @@ collect_cmdsout() { local cmd local ifs_orig="${IFS}" - pr_log_stdout " 1 of ${COLLECTION_COUNT}: Collecting command output" + pr_syslog_stdout "1 of ${COLLECTION_COUNT}: Collecting command output" IFS=: for cmd in ${CMDS}; do @@ -397,8 +405,8 @@ collect_vmcmdsout() { local module_loaded=1 local ifs_orig="${IFS}" - if test ${LINUX_ON_ZVM} -eq 0; then - pr_log_stdout " 2 of ${COLLECTION_COUNT}: Collecting z/VM command output" + if echo "${RUNTIME_ENVIRONMENT}" | grep -qi "z/VM" >/dev/null 2>&1; then + pr_syslog_stdout "2 of ${COLLECTION_COUNT}: Collecting z/VM command output" if type vmcp >/dev/null 2>&1; then cp_command="vmcp" @@ -412,8 +420,8 @@ collect_vmcmdsout() { fi else pr_log_stdout " " - pr_log_stdout " WARNING: No program found to communicate to z/VM CP" - pr_log_stdout " WARNING: Skipping the collection of z/VM command output" + pr_log_stdout "WARNING: No program found to communicate to z/VM CP" + pr_log_stdout "WARNING: Skipping the collection of z/VM command output" pr_log_stdout " " return 1 fi @@ -443,7 +451,7 @@ collect_vmcmdsout() { rmmod vmcp fi else - pr_log_stdout " 2 of ${COLLECTION_COUNT}: Running in LPAR, no z/VM command output collected" + pr_syslog_stdout "2 of ${COLLECTION_COUNT}: Collecting z/VM command output skipped - no z/VM environment" fi pr_log_stdout " " @@ -454,7 +462,7 @@ collect_vmcmdsout() { collect_procfs() { local file_name - pr_log_stdout " 3 of ${COLLECTION_COUNT}: Collecting procfs" + pr_syslog_stdout "3 of ${COLLECTION_COUNT}: Collecting procfs" for file_name in ${PROCFILES}; do call_collect_file "${file_name}" @@ -473,7 +481,7 @@ collect_sysfs() { # Requires kernel version newer then 2.4 if test ${LINUX_SUPPORT_SYSFS} -eq 0; then - pr_log_stdout " 4 of ${COLLECTION_COUNT}: Collecting sysfs" + pr_syslog_stdout "4 of ${COLLECTION_COUNT}: Collecting sysfs" # Requires kernel version of 2.6.13 or newer if test ${LINUX_SUPPORT_SYSFSDBF} -eq 0; then if ! grep -qE "${MOUNT_POINT_DEBUGFS}.*debugfs" /proc/mounts 2>/dev/null; then @@ -481,7 +489,7 @@ collect_sysfs() { sleep 2 debugfs_mounted=1; else - pr_log_stdout " WARNING: \"Unable to mount debugfs ${MOUNT_POINT_DEBUGFS}\"" + pr_log_stdout "WARNING: \"Unable to mount debugfs ${MOUNT_POINT_DEBUGFS}\"" fi fi fi @@ -493,7 +501,7 @@ collect_sysfs() { done find /sys -noleaf -type f -perm /444 2>/dev/null | while IFS= read -r file_name; do - echo " ${file_name}" + echo " ${file_name}" dd if="${file_name}" iflag=nonblock of="${WORKPATH}${file_name}" done @@ -501,7 +509,7 @@ collect_sysfs() { umount "${MOUNT_POINT_DEBUGFS}" fi else - pr_log_stdout " 4 of ${COLLECTION_COUNT}: Collecting sysfs skipped. Kernel `uname -r` must be newer than 2.4" + pr_syslog_stdout "4 of ${COLLECTION_COUNT}: Collecting sysfs skipped. Kernel `uname -r` must be newer than 2.4" fi pr_log_stdout " " @@ -512,7 +520,7 @@ collect_sysfs() { collect_logfiles() { local file_name - pr_log_stdout " 5 of ${COLLECTION_COUNT}: Collecting log files" + pr_syslog_stdout "5 of ${COLLECTION_COUNT}: Collecting log files" for file_name in ${LOGFILES}; do call_collect_file "${file_name}" @@ -521,11 +529,12 @@ collect_logfiles() { pr_log_stdout " " } + ######################################## collect_configfiles() { local file_name - pr_log_stdout " 6 of ${COLLECTION_COUNT}: Collecting config files" + pr_syslog_stdout "6 of ${COLLECTION_COUNT}: Collecting config files" for file_name in ${CONFIGFILES}; do call_collect_file "${file_name}" @@ -542,16 +551,16 @@ collect_osaoat() { if which qethqoat >/dev/null 2>&1; then if test -n "${network_devices}"; then - pr_log_stdout " 7 of ${COLLECTION_COUNT}: Collecting osa oat output" + pr_syslog_stdout "7 of ${COLLECTION_COUNT}: Collecting osa oat output" for network_device in "${network_devices}"; do call_run_command "qethqoat ${network_device}" "${OUTPUT_FILE_OSAOAT}.out" && call_run_command "qethqoat -r ${network_device}" "${OUTPUT_FILE_OSAOAT}_${network_device}.raw" done else - pr_log_stdout " 7 of ${COLLECTION_COUNT}: Collecting osa oat output skipped - no devices" + pr_syslog_stdout "7 of ${COLLECTION_COUNT}: Collecting osa oat output skipped - no devices" fi else - pr_log_stdout " 7 of ${COLLECTION_COUNT}: Collecting osa oat output skipped - not available" + pr_syslog_stdout "7 of ${COLLECTION_COUNT}: Collecting osa oat output skipped - not available" fi pr_log_stdout " " @@ -571,16 +580,16 @@ call_run_command() { # check if command exists if ! which "${raw_cmd}" >/dev/null 2>&1; then - # check if command is a builtin + # check if command is a builtin if ! command -v "${raw_cmd}" >/dev/null 2>&1; then - echo " WARNING: Command \"${raw_cmd}\" not available" >> "${logfile}" + echo "WARNING: Command \"${raw_cmd}\" not available" >> "${logfile}" echo >> "${logfile}" return 1; fi fi if ! eval "${cmd}" >> "${logfile}" 2>&1; then - echo " WARNING: Command \"${cmd}\" failed" >> "${logfile}" + echo "WARNING: Command \"${cmd}\" failed" >> "${logfile}" echo >> "${logfile}" return 1 else @@ -595,7 +604,7 @@ call_collect_file() { local directory_name local file_name="${1}" - echo " ${file_name}" + echo " ${file_name}" directory_name="`dirname \"${file_name}\" 2>/dev/null`" if test ! -e "${WORKPATH}${directory_name}"; then @@ -616,8 +625,8 @@ call_collect_file() { # print version info print_version() { cat </dev/null; then - echo " ERROR: Target directory ${WORKPATH} already exists or" - echo " ${WORKDIR_BASE} does not exist!" + echo "ERROR: Target directory ${WORKPATH} already exists or" + echo " ${WORKDIR_BASE} does not exist!" exit 1 fi } @@ -736,18 +745,18 @@ environment_setup() # create gzip-ped tar file create_package() { - pr_stdout " Finalizing: Creating archive with collected data" + pr_stdout "Finalizing: Creating archive with collected data" cd "${WORKDIR_BASE}" if ! tar -czf "${WORKARCHIVE}" "${WORKDIR_CURRENT}"; then pr_stdout " " - pr_stdout " ERROR: Collection of data failed!" - pr_stdout " The creation of ${WORKARCHIVE} was not successful." - pr_stdout " Please check the directory ${WORKDIR_BASE}" - pr_stdout " to provide enough free available space." + pr_stdout "ERROR: Collection of data failed!" + pr_stdout " The creation of ${WORKARCHIVE} was not successful." + pr_stdout " Please check the directory ${WORKDIR_BASE}" + pr_stdout " to provide enough free available space." else pr_stdout " " - pr_stdout " Collected data was saved to:" + pr_stdout "Collected data was saved to:" pr_stdout " >> ${WORKARCHIVE} <<" fi @@ -761,14 +770,14 @@ environment_cleanup() { if ! rm -rf "${WORKPATH}" 2>/dev/null; then pr_stdout " " - pr_stdout " WARNING: Deletion of ${WORKPATH} failed" - pr_stdout " Please remove the directory manually" + pr_stdout "WARNING: Deletion of ${WORKPATH} failed" + pr_stdout "Please remove the directory manually" pr_stdout " " fi if ! rm -f "${WORKDIR_BASE}${SCRIPTNAME}".lock 2>/dev/null; then pr_stdout " " - pr_stdout " WARNING: Deletion of ${WORKDIR_BASE}${SCRIPTNAME} failed" - pr_stdout " Please remove the file manually" + pr_stdout "WARNING: Deletion of ${WORKDIR_BASE}${SCRIPTNAME} failed" + pr_stdout "Please remove the file manually" pr_stdout " " fi } @@ -779,12 +788,13 @@ environment_cleanup() emergency_exit() { pr_stdout " " - pr_stdout " INFO: Data collection has been interrupted" - pr_stdout " INFO: Cleanup of temporary collected data" + pr_stdout "INFO: Data collection has been interrupted" + pr_stdout "INFO: Cleanup of temporary collected data" environment_cleanup - pr_stdout " INFO: Emergency exit processed" - + pr_stdout "INFO: Emergency exit processed" + pr_stdout " " + logger -t "${SCRIPTNAME}" "Data collection interrupted" exit; } @@ -806,10 +816,27 @@ pr_log_stdout() } +######################################## +# Function to print to stdout and into log file when rediretion is active +pr_syslog_stdout() +{ + echo "$@" + echo "$@" >&8 + logger -t ${SCRIPTNAME} "$@" +} + + ############################################################################### # Running the script commandline_parse ${*} + +# Verification to run as root +if test `/usr/bin/id -u 2>/dev/null` -ne 0; then + echo "ERROR: You must be user root to run ${SCRIPTNAME}!" + exit 1 +fi + environment_setup print_version @@ -820,11 +847,13 @@ exec 8>&1 9>&2 >${LOGFILE} 2>&1 trap emergency_exit 1 2 15 pr_log_stdout "" -pr_log_stdout " Hardware platform = `uname -i`" -pr_log_stdout " Kernel version = ${KERNEL_VERSION}.${KERNEL_MAJOR_REVISION}.${KERNEL_MINOR_REVISION} (`uname -r 2>/dev/null`)" -pr_log_stdout " Runtime environment = `test ${LINUX_ON_ZVM} -eq 0 && echo 'z/VM' || echo 'LPAR'`" +pr_log_stdout "Hardware platform = `uname -i`" +pr_log_stdout "Kernel version = ${KERNEL_VERSION}.${KERNEL_MAJOR_REVISION}.${KERNEL_MINOR_REVISION} (`uname -r 2>/dev/null`)" +pr_log_stdout "Runtime environment = ${RUNTIME_ENVIRONMENT}" pr_log_stdout "" +logger -t "${SCRIPTNAME}" "Starting data collection" + collect_cmdsout collect_vmcmdsout @@ -845,6 +874,8 @@ create_package environment_cleanup +logger -t "${SCRIPTNAME}" "Data collection completed" + exec 1>&8 2>&9 8>&- 9>&- #EOF diff --git a/scripts/dbginfo.sh.1 b/scripts/dbginfo.sh.1 index cdef849..c0975cc 100644 --- a/scripts/dbginfo.sh.1 +++ b/scripts/dbginfo.sh.1 @@ -1,5 +1,5 @@ -.TH DBGINFO.SH 1 "November 2012" "s390-tools" - +.TH DBGINFO.SH 1 "October 2013" "s390-tools" + .SH NAME dbginfo.sh \- collect runtime, configuration and trace information for debugging Linux on System z @@ -44,35 +44,35 @@ Sample invocation: .P [root@host]# dbginfo.sh .br - dbginfo.sh: Debug information script version %S390_TOOLS_VERSION% +dbginfo.sh: Debug information script version %S390_TOOLS_VERSION% .br - Copyright IBM Corp. 2002, 2012 +Copyright IBM Corp. 2002, 2013 .PP - Hardware platform = s390x +Hardware platform = s390x .br - Kernel version = 3.0.13 (3.0.13\-0.27\-default) +Kernel version = .br - Runtime environment = z/VM +Runtime environment = z/VM .PP - 1 of 7: Collecting command output +1 of 7: Collecting command output .PP - 2 of 7: Collecting z/VM command output +2 of 7: Collecting z/VM command output .PP - 3 of 7: Collecting procfs +3 of 7: Collecting procfs .PP - 4 of 7: Collecting sysfs +4 of 7: Collecting sysfs .PP - 5 of 7: Collecting log files +5 of 7: Collecting log files .PP - 6 of 7: Collecting config files +6 of 7: Collecting config files .PP - 7 of 7: Collecting osa oat output skipped +7 of 7: Collecting osa oat output skipped \- not available .PP - Finalizing: Creating archive with collected data +Finalizing: Creating archive with collected data .PP - Collected data was saved to: +Collected data was saved to: .br - >> /tmp/DBGINFO\-2012\-10\-14\-13\-10\-42-host-123456.tgz << + >> /tmp/DBGINFO\-2013\-10\-08\-10\-43\-16\-host\-012345.tgz << .SH HINTS Run the script with root authority. .br -- 1.8.1.4 From 31cd858e82efd289c4ea8ea4801346746aefcd2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dan=20Hor=C3=A1k?= Date: Tue, 19 Nov 2013 18:02:35 +0100 Subject: [PATCH 7/8] dbginfo.sh: avoid double data collection Description: dbginfo.sh: avoid double data collection Symptom: Execution of dbginfo.sh fails with 'no space left on device' Problem: The data collection of the dbginfo.sh script collects two times entries from the sysfs. First, the script itself collects all 'files' and later on, the script ziomon_fcpconf is collecting a subset of the sysfs along with some additional data. The additional data (information about the /dev entries) is collected by the dbginfo.sh script also. Therefore, the execution of ziomon_fcpconf is obsolete. Solution: Avoid the execution of ziomon_fcpconf in the dbginfo.sh script Reproduction: Run the dbginfo.sh script on a machine, where /tmp should be able to cover the amount of data being collected. The machine should have quite a lot of devices being attached. --- scripts/dbginfo.sh | 4 ---- 1 file changed, 4 deletions(-) diff --git a/scripts/dbginfo.sh b/scripts/dbginfo.sh index 9b64076..e83774b 100755 --- a/scripts/dbginfo.sh +++ b/scripts/dbginfo.sh @@ -81,9 +81,6 @@ readonly OUTPUT_FILE_VMCMD="${WORKPATH}zvm_runtime.out" # File that includes content of files from sysfs readonly OUTPUT_FILE_SYSFS="${WORKPATH}sysfsfiles.out" -# File that includes content of zFCP settings -readonly OUTPUT_FILE_FCPCONF="${WORKPATH}scsi" - # File that includes content of OSA OAT readonly OUTPUT_FILE_OSAOAT="${WORKPATH}osa_oat" @@ -314,7 +311,6 @@ CMDS="uname -a\ :java -version\ :cat /root/.bash_history\ :env\ - :ziomon_fcpconf -o ${OUTPUT_FILE_FCPCONF}\ " ######################################## -- 1.8.1.4 From 4009f4a16c96f7fee65d77de112ef61109fdc0bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dan=20Hor=C3=A1k?= Date: Wed, 15 Jan 2014 15:08:29 +0100 Subject: [PATCH 8/8] zipl: fix segmentation fault in automenu array Description: zipl: fix segmentation fault in automenu array Symptom: Building an automenu with a large number of entries may lead to a 'double free or corruption' error in zipl. Problem: The array to store automenu items is to small. Solution: Correct the calculation for automenu array size. Reproduction: Use zipl and build an automenu with a large number of entries in the zipl configuration file. --- zipl/src/scan.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/zipl/src/scan.c b/zipl/src/scan.c index 597b01c..c357418 100644 --- a/zipl/src/scan.c +++ b/zipl/src/scan.c @@ -1672,10 +1672,14 @@ scan_build_automenu(struct scan_token* scan) if (scan[i].id == scan_id_section_heading) num_sections++; } - size = /* old scan array + delimiter */ i + 1 + - /* defaultboot heading + keyword */ 2 + - /* automenu heading + keywords */ 10 + - /* missing target definitions */ num_sections * num_targets; + size = /* old scan array + delimiter */ i + 1 + + /* defaultboot heading */ 1 + + /* defaultmenu */ 1 + + /* menu heading */ 1 + + /* keyword default,prompt,timeout */ 3 + + /* target keywords*/ num_targets + + /* missing target definitions */ num_sections * num_targets + + /* number assigment */ num_sections; size *= sizeof(struct scan_token); new_scan = misc_malloc(size); if (!new_scan) -- 1.8.1.4