Hello community, here is the log from the commit of package s390-tools for openSUSE:Factory checked in at 2017-11-03 16:21:40 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/s390-tools (Old) and /work/SRC/openSUSE:Factory/.s390-tools.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "s390-tools" Fri Nov 3 16:21:40 2017 rev:11 rq:537235 version:2.1.0 Changes: -------- --- /work/SRC/openSUSE:Factory/s390-tools/s390-tools.changes 2017-10-25 17:44:30.787886244 +0200 +++ /work/SRC/openSUSE:Factory/.s390-tools.new/s390-tools.changes 2017-11-03 16:21:47.842877303 +0100 @@ -1,0 +2,8 @@ +Wed Oct 25 17:21:30 UTC 2017 - [email protected] + +- Modified s390-tools-sles15-Format-devices-in-parallel.patch to + reset the rc variable before using it again (bsc#1063393). +- Reverted the changes to the *_configure scripts until + bsc#1064791 is fixed. + +------------------------------------------------------------------- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ ctc_configure ++++++ --- /var/tmp/diff_new_pack.qwTXCe/_old 2017-11-03 16:21:49.082832175 +0100 +++ /var/tmp/diff_new_pack.qwTXCe/_new 2017-11-03 16:21:49.086832029 +0100 @@ -2,127 +2,316 @@ # # ctc_configure # -# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany. -# -# Configures a CTC device by calling the IBM-provided chzdev command. -# Whereas this script used to validate the parameters provided to it, -# we now rely on chzdev to do that instead. The script is intended only -# as a "translation layer" to provide backward compatability for older -# scripts and tools that invoke it. +# Configures a CTC device # # Usage: # ctc_configure <read channel> <write channel> <online> [<protocol>] # # read/write channel = x.y.ssss where -# x is always 0 until IBM creates something that -# uses that number -# y is the logical channel subsystem (lcss) number. -# Most often this is 0, but it could be non-zero -# ssss is the four digit subchannel address of the -# device, in hexidecimal, with leading zeros. +# x is always 0 until IBM creates something that uses that number +# y is the logical channel subsystem (lcss) number. Most often this is 0, but it could be non-zero +# ssss is the four digit subchannel address of the device, in hexidecimal, with leading zeros. # online = 0 to take the device offline # 1 to bring the device online -# protocol = 0 Compatibility with peers other than OS/390®, or z/OS, for -# example, a z/VM TCP service machine. This is the default. +# protocol = 0 Compatibility with peers other than OS/390®, or z/OS, for example, a z/VM TCP service machine. This is the default. # 1 Enhanced package checking for Linux peers. # 3 For compatibility with OS/390 or z/OS peers. -# 4 For MPC connections to VTAM on traditional mainframe -# operating systems. +# 4 For MPC connections to VTAM on traditional mainframe operating systems. # # Return values: -# Return codes are determined by the chzdev command. +# 1 sysfs not mounted +# 2 Invalid status for <online> +# 3 No device found for read-channel +# 4 No device found for write-channel +# 5 Invalid device type +# 6 Device type mismatch +# 7 Could not load module +# 8 CCW devices grouped different devices +# 9 Could not group devices +# 10 Could not set device online +# 11 Could not set device offline # +if [ "${DEBUG}" != "yes" ]; then + DEBUG="no" +fi + +DATUM=$(date) + +add_channel_for_cio() { + echo "$* # $DATUM" >> /boot/zipl/active_devices.txt +} + +remove_channel_for_cio() { + [ -w /boot/zipl/active_devices.txt ] && sed -i -e "/^$1/d" /boot/zipl/active_devices.txt +} + mesg () { echo "$@" } debug_mesg () { - case "${DEBUG}" in - yes) mesg "$@" ;; - *) ;; + case "$DEBUG" in + yes) mesg "$@" ;; + *) ;; esac } -add_cio_channel() { - echo "$* # ${DATE}" >> /boot/zipl/active_devices.txt -} - -remove_cio_channel() { - [ -w /boot/zipl/active_devices.txt ] && sed -i -e "/^${1}/d" /boot/zipl/active_devices.txt -} +# Get the mount point for sysfs +while read MNTPT MNTDIR MNTSYS MNTTYPE; do + if test "$MNTSYS" = "sysfs"; then + SYSFS="$MNTDIR" + break; + fi +done </proc/mounts + +if [ -z "$SYSFS" ]; then + mesg "/sysfs not present" + exit 1 +fi -usage(){ - echo "Usage: ${0} <read channel> <write channel> <online> [<protocol>]" - echo " read/write channel = x.y.ssss where" - echo " x is always 0 until IBM creates something that" - echo " uses that number" - echo " y is the logical channel subsystem (lcss) number." - echo " Most often this is 0, but it could be non-zero" - echo " ssss is the four digit subchannel address of the" - echo " device, in hexidecimal, with leading zeros." - echo " online = 0 to take the device offline" - echo " 1 to bring the device online" - echo " protocol = 0 Compatibility with peers other than OS/390®, or z/OS, for" - echo " example, a z/VM TCP service machine. This is the default." - echo " 1 Enhanced package checking for Linux peers." - echo " 3 For compatibility with OS/390 or z/OS peers." - echo " 4 For MPC connections to VTAM on traditional mainframe" - echo " operating systems." -} +if [ $# -lt 3 ] ; then + echo "Usage: $0 <read channel> <write channel> <online> [<protocol>]" + echo " read/write channel = x.y.ssss where" + echo " x is always 0 until IBM creates something that uses that number" + echo " y is the logical channel subsystem (lcss) number. Most often this is 0, but it could be non-zero" + echo " ssss is the four digit subchannel address of the device, in hexidecimal, with leading zeros." + echo " online = 0 to take the device offline" + echo " 1 to bring the device online" + echo " protocol = 0 Compatibility with peers other than OS/390®, or z/OS, for example, a z/VM TCP service machine. This is the default." + echo " 1 Enhanced package checking for Linux peers." + echo " 3 For compatibility with OS/390 or z/OS peers." + echo " 4 For MPC connections to VTAM on traditional mainframe operating systems." + exit 1 +fi -if [ "${DEBUG}" != "yes" ]; then - DEBUG="no" +CTC_READ_CHAN=$1 +CTC_WRITE_CHAN=$2 +ONLINE=$3 +CTC_MODE=$4 + +[ -z "$CTC_MODE" ] && CTC_MODE=0 + +if [ -z "$ONLINE" ] || [ "$ONLINE" -ne "1" -a "$ONLINE" -ne "0" ]; then + mesg "Invalid device status $ONLINE" + exit 2 fi -DATE=$(date) +_ccw_dir=${SYSFS}/bus/ccw/devices -CTC_READ_CHAN=${1} -CTC_WRITE_CHAN=${2} -ON_OFF=${3} -CTC_MODE=${4} +debug_mesg "Configuring CTC/LCS device ${CTC_READ_CHAN}/${CTC_WRITE_CHAN}" -if [ -z "${CTC_READ_CHAN}" ] || [ -z "${CTC_WRITE_CHAN}" ] || [ -z "${ON_OFF}" ]; then - mesg "You didn't specify all the needed parameters." - usage - exit 1 + +if test ! -d "$_ccw_dir/$CTC_READ_CHAN" ; then + mesg "device $_ccw_dir/$CTC_READ_CHAN does not exist" + exit 3 +fi +if test ! -d "$_ccw_dir/$CTC_WRITE_CHAN" ; then + mesg "device $_ccw_dir/$CTC_WRITE_CHAN does not exist" + exit 4 fi -if [ -z "${CTC_MODE}" ]; then - PARM_LIST="${PARM_LIST} protocol=0" -else PARM_LIST="${PARM_LIST} protocol=${CTC_MODE}" +CCW_CHAN_GROUP= +for ccw in $_ccw_dir/$CTC_READ_CHAN $_ccw_dir/$CTC_WRITE_CHAN; do + + read _cu_type < $ccw/cutype + read _dev_type < $ccw/devtype + + case "$_cu_type" in + 3088/01) + # P/390 network adapter + CCW_CHAN_NAME="cu3088" + CCW_CHAN_GROUP="lcs" + ;; + 3088/08) + # Channel To Channel + CCW_CHAN_NAME="cu3088" + CCW_CHAN_GROUP="ctcm" + ;; + 3088/1e) + # FICON adapter + CCW_CHAN_NAME="cu3088" + CCW_CHAN_GROUP="ctcm" + ;; + 3088/1f) + # ESCON adapter (I.e. hardware CTC device) + CCW_CHAN_NAME="cu3088" + CCW_CHAN_GROUP="ctcm" + ;; + 3088/60) + # Lan Channel Station + CCW_CHAN_NAME="cu3088" + CCW_CHAN_GROUP="lcs" + ;; + *) + CCW_CHAN_NAME= + ;; + esac + + if [ -z "$CCW_CHAN_NAME" ]; then + mesg "Not a valid CTC device (cu $_cutype, dev $_devtype)" + exit 5 + fi + + [ -z "$tmp_chan" ] && tmp_chan=$CCW_CHAN_GROUP +done + +if [ "$tmp_chan" != "$CCW_CHAN_GROUP" ] ; then + mesg "CTC type mismatch (read: $tmp_chan, write: $CCW_CHAN_GROUP)" + exit 6 fi -if [ -f /sys/bus/ccw/devices/${CTC_READ_CHAN}/cutype ]; then - read CU_TYPE < /sys/bus/ccw/devices/${CTC_READ_CHAN}/cutype -else mesg "Psuedo file/sys/bus/ccw/devices/${CTC_READ_CHAN}/cutype doesn't exist." - mesg "Check to see if sysfs is mounted." - exit 1 +_ccw_groupdir=${SYSFS}/bus/ccwgroup + +# Check for modules +if test ! -d "${_ccw_groupdir}/drivers/${CCW_CHAN_GROUP}" ; then + /sbin/modprobe $CCW_CHAN_GROUP + + # Re-check whether module loading has succeeded + if test ! -d "${_ccw_groupdir}/drivers/${CCW_CHAN_GROUP}"; then + mesg "Could not load module ${CCW_CHAN_GROUP}" + exit 7 + fi fi -if [ "${CU_TYPE}" == "3088/01" ] || [ "${CU_TYPE}" == "3088/60" ]; then - DEV_TYPE="lcs" -else DEV_TYPE="ctc" +# Check for grouping +_ccw_status_dir= +if [ -e ${_ccw_dir}/${CTC_READ_CHAN}/group_device ] ; then + _ccw_status_dir=$(cd -P ${_ccw_dir}/${CTC_READ_CHAN}/group_device; echo $PWD) +fi +if [ -e ${_ccw_dir}/${CTC_WRITE_CHAN}/group_device ] ; then + _tmp_status_dir=$(cd -P ${_ccw_dir}/${CTC_READ_CHAN}/group_device; echo $PWD) + if [ "$_ccw_status_dir" ] && [ "$_ccw_status_dir" != "$_tmp_status_dir" ] ; then + mesg "CCW devices grouped to different devices" + exit 8 + fi + _ccw_status_dir=$_tmp_status_dir +fi +# +# Addresses are free (but may be bound to the wrong driver) +# +_ccw_drivers=${SYSFS}/bus/ccw/drivers +for i in ${CTC_READ_CHAN} ${CTC_WRITE_CHAN} + do + if [ "$CCW_CHAN_GROUP" = "lcs" ] + then + if [ -e "${_ccw_drivers}/ctcm/${i}" ] ; then + echo $i > ${_ccw_drivers}/ctcm/unbind + fi + if [ ! -e "${_ccw_drivers}/lcs/${i}" ] ; then + echo $i > ${_ccw_drivers}/ctcm/bind + fi + else + if [ -e "${_ccw_drivers}/lcs/${i}" ] ; then + echo $i > ${_ccw_drivers}/lcs/unbind + fi + if [ ! -e "${_ccw_drivers}/ctcm/${i}" ] ; then + echo $i > ${_ccw_drivers}/ctcm/bind + fi + fi + done + +debug_mesg "Group is ${_ccw_groupdir}/drivers/${CCW_CHAN_GROUP}/group" +if [ -z "$_ccw_status_dir" ] ; then + echo "$CTC_READ_CHAN,$CTC_WRITE_CHAN" > ${_ccw_groupdir}/drivers/${CCW_CHAN_GROUP}/group + if [ -e ${_ccw_dir}/${CTC_READ_CHAN}/group_device ] ; then + _ccw_status_dir=$(cd -P ${_ccw_dir}/${CTC_READ_CHAN}/group_device; echo $PWD) + fi fi -if [ "${ON_OFF}" == 0 ]; then - debug_mesg "chzdev -d ${DEV_TYPE} ${CTC_READ_CHAN}" - chzdev -d ${DEV_TYPE} ${CTC_READ_CHAN} -elif [ "${ON_OFF}" == 1 ]; then - debug_mesg "chzdev -e ${DEV_TYPE} ${CTC_READ_CHAN} ${PARM_LIST}" - chzdev -e ${DEV_TYPE} ${CTC_READ_CHAN} ${PARM_LIST} -else mesg "You must specify a 0 or a 1 for the online/offline attribute." - usage - exit 1 +if [ -z "$_ccw_status_dir" -o ! -e "$_ccw_status_dir" ] ; then + mesg "Could not group $CCW_CHAN_GROUP devices $CTC_READ_CHAN/$CTC_WRITE_CHAN" + exit 9 fi -RC=${?} -if [ ${RC} -ne 0 ]; then - exit ${RC} +CCW_CHAN_ID=${_ccw_status_dir##*/} + +read _ccw_dev_status < $_ccw_status_dir/online + +if [ "$ONLINE" -eq 1 ]; then + # Check whether we need to do something + if [ "$_ccw_dev_status" -eq 0 ]; then + if [ "$CTC_MODE" -gt 0 -a "$CCW_CHAN_GROUP" != "lcs" ]; then + echo $CTC_MODE > $_ccw_status_dir/protocol + fi + # Set the device online + debug_mesg "Setting device online" + echo "1" > $_ccw_status_dir/online + # Re-read device status + read _ccw_dev_status < $_ccw_status_dir/online + if [ "$_ccw_dev_status" -eq 0 ]; then + mesg "Could not set device ${CCW_CHAN_ID} online" + exit 10 + fi + else + debug_mesg "Device ${CCW_CHAN_ID} is already online" + fi +else + if [ "$_ccw_dev_status" -eq 1 ]; then + # Set the device offline + debug_mesg "Setting device offline" + echo "$ONLINE" > $_ccw_status_dir/online + + # Re-read to check whether we have succeeded + _ccw_dev_status=$(cat $_ccw_status_dir/online) + if [ "$_ccw_dev_status" -ne "$ONLINE" ]; then + mesg "Could not set device ${CCW_CHAN_ID} offline" + exit 11 + fi + else + debug_mesg "Device ${CCW_CHAN_ID} is already offline" + fi + # Always reset CTC Protocol + if [ "$CCW_CHAN_GROUP" != "lcs" ]; then + echo 0 > $_ccw_status_dir/protocol + fi fi -if [ ${ON_OFF} == 1 ]; then - add_cio_channel "${CTC_READ_CHAN},${CTC_WRITE_CHAN}" -else remove_cio_channel "${CTC_READ_CHAN}" - remove_cio_channel "${CTC_WRITE_CHAN}" +RULES_DIR=/etc/udev/rules.d +RULES_FILE=51-${CCW_CHAN_GROUP}-${CCW_CHAN_ID}.rules + +if [ -d "$RULES_DIR" ]; then + if [ -f ${RULES_DIR}/${RULES_FILE} ]; then + rm -f ${RULES_DIR}/${RULES_FILE} + fi + remove_channel_for_cio "$CTC_READ_CHAN" + remove_channel_for_cio "$CTC_WRITE_CHAN" + + if [ "$ONLINE" -eq "1" ]; then + add_channel_for_cio "$CTC_READ_CHAN,$CTC_WRITE_CHAN" + # Write a new udev rules file + cat > ${RULES_DIR}/${RULES_FILE} <<EOF +# Configure ${CCW_CHAN_GROUP} device at ${CTC_READ_CHAN}/${CTC_WRITE_CHAN} (Protocol ${CTC_MODE}) +ACTION=="add", SUBSYSTEM=="ccw", KERNEL=="$CTC_READ_CHAN", RUN+="/sbin/modprobe --quiet $CCW_CHAN_GROUP" +ACTION=="add", SUBSYSTEM=="ccw", KERNEL=="$CTC_READ_CHAN", DRIVER!="?*", GOTO="ctc-${CTC_READ_CHAN}-no-unbind" +ACTION=="add", SUBSYSTEM=="ccw", KERNEL=="$CTC_READ_CHAN", DRIVER=="ctcm", GOTO="ctc-${CTC_READ_CHAN}-no-unbind" +ACTION=="add", SUBSYSTEM=="ccw", KERNEL=="$CTC_READ_CHAN", ATTR{driver/unbind}="$CTC_READ_CHAN" +LABEL="ctc-${CTC_READ_CHAN}-no-unbind" +ACTION=="add", SUBSYSTEM=="ccw", KERNEL=="$CTC_READ_CHAN", DRIVER!="?*", ATTR{[drivers/ccw:ctcm]bind}="$CTC_READ_CHAN" +ACTION=="add", SUBSYSTEM=="ccw", KERNEL=="$CTC_WRITE_CHAN", DRIVER!="?*", GOTO="ctc-${CTC_WRITE_CHAN}-no-unbind" +ACTION=="add", SUBSYSTEM=="ccw", KERNEL=="$CTC_WRITE_CHAN", DRIVER=="ctcm", GOTO="ctc-${CTC_WRITE_CHAN}-no-unbind" +ACTION=="add", SUBSYSTEM=="ccw", KERNEL=="$CTC_WRITE_CHAN", ATTR{driver/unbind}="$CTC_WRITE_CHAN" +LABEL="ctc-${CTC_WRITE_CHAN}-no-unbind" +ACTION=="add", SUBSYSTEM=="ccw", KERNEL=="$CTC_WRITE_CHAN", DRIVER!="?*", ATTR{[drivers/ccw:ctcm]bind}="$CTC_WRITE_CHAN" +ACTION=="add", SUBSYSTEM=="ccw", KERNEL=="$CTC_READ_CHAN", IMPORT{program}="collect $CCW_CHAN_ID %k $CTC_READ_CHAN $CTC_WRITE_CHAN $CCW_CHAN_GROUP" +ACTION=="add", SUBSYSTEM=="ccw", KERNEL=="$CTC_WRITE_CHAN", RUN+="/sbin/modprobe --quiet $CCW_CHAN_GROUP" +ACTION=="add", SUBSYSTEM=="ccw", KERNEL=="$CTC_WRITE_CHAN", IMPORT{program}="collect $CCW_CHAN_ID %k $CTC_READ_CHAN $CTC_WRITE_CHAN $CCW_CHAN_GROUP" +ACTION=="add", SUBSYSTEM=="drivers", KERNEL=="$CCW_CHAN_GROUP", IMPORT{program}="collect $CCW_CHAN_ID %k $CTC_READ_CHAN $CTC_WRITE_CHAN $CCW_CHAN_GROUP" +ACTION=="remove", SUBSYSTEM=="ccw", KERNEL=="$CTC_READ_CHAN", IMPORT{program}="collect --remove $CCW_CHAN_ID %k $CTC_READ_CHAN $CTC_WRITE_CHAN $CCW_CHAN_GROUP" +ACTION=="remove", SUBSYSTEM=="ccw", KERNEL=="$CTC_WRITE_CHAN", IMPORT{program}="collect --remove $CCW_CHAN_ID %k $CTC_READ_CHAN $CTC_WRITE_CHAN $CCW_CHAN_GROUP" +ACTION=="remove", SUBSYSTEM=="drivers", KERNEL=="$CCW_CHAN_GROUP", IMPORT{program}="collect --remove $CCW_CHAN_ID %k $CTC_READ_CHAN $CTC_WRITE_CHAN $CCW_CHAN_GROUP" +TEST=="[ccwgroup/${CCW_CHAN_ID}]", GOTO="ctc-${CCW_CHAN_ID}-end" +ACTION=="add", SUBSYSTEM=="ccw", ENV{COLLECT_$CCW_CHAN_ID}=="0", ATTR{[drivers/ccwgroup:$CCW_CHAN_GROUP]group}="$CTC_READ_CHAN,$CTC_WRITE_CHAN" +ACTION=="add", SUBSYSTEM=="drivers", KERNEL=="$CCW_CHAN_GROUP", ENV{COLLECT_$CCW_CHAN_ID}=="0", ATTR{group}="$CTC_READ_CHAN,$CTC_WRITE_CHAN" +LABEL="ctc-${CCW_CHAN_ID}-end" +EOF + if [ "$CTC_MODE" -gt 0 ]; then + cat >> ${RULES_DIR}/${RULES_FILE} <<EOF +ACTION=="add", SUBSYSTEM=="ccwgroup", KERNEL=="$CCW_CHAN_ID", ATTR{protocol}="$CTC_MODE" +EOF + fi + cat >> ${RULES_DIR}/${RULES_FILE} <<EOF +ACTION=="add", SUBSYSTEM=="ccwgroup", KERNEL=="$CCW_CHAN_ID", ATTR{online}="1" +EOF + fi fi ++++++ dasd_configure ++++++ --- /var/tmp/diff_new_pack.qwTXCe/_old 2017-11-03 16:21:49.114831010 +0100 +++ /var/tmp/diff_new_pack.qwTXCe/_new 2017-11-03 16:21:49.114831010 +0100 @@ -1,146 +1,409 @@ #! /bin/sh # # dasd_configure +# $Id: dasd_configure,v 1.10 2004/11/26 15:50:48 hare Exp $ # -# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2001-2014 SUSE LINUX Products GmbH, Nuernberg, Germany. # -# Configures a DASD device by calling the IBM-provided chzdev command. -# Whereas this script used to validate the parameters provided to it, -# we now rely on chzdev to do that instead. The script is intended only -# as a "translation layer" to provide backward compatability for older -# scripts and tools that invoke it. +# Configures or deconfigures a DASD device # # Usage: # dasd_configure [-f -t <dasd_type> ] <ccwid> <online> [use_diag] # -# -f Override safety checks -# -t DASD type. Must be provided if -f is used. Only dasd-eckd and -# dasd-fba are supported - Deprecated +# -f force creation of udev rules, do not check values in /sys. +# -t DASD type. Must be provided if -f is used. # ccwid = x.y.ssss where # x is always 0 until IBM creates something that uses that number -# y is the logical channel subsystem (lcss) number. Most often -# this is 0, but it could be non-zero -# ssss is the four digit subchannel address of the device, in -# hexidecimal, with leading zeros. +# y is the logical channel subsystem (lcss) number. Most often this is 0, but it could be non-zero +# ssss is the four digit subchannel address of the device, in hexidecimal, with leading zeros. # online = 0 to take the device offline # 1 to bring the device online # use_diag = 0 to _not_ use z/VM DIAG250 I/O, which is the default # 1 to use z/VM DIAG250 I/O # # Return values: -# Return codes are determined by the chzdev command. +# 1 If the "Usage:" line is displayed, not enough parameters specified. +# 1 sysfs not mounted (if the "Usage:" line is not displayed). +# 2 Invalid status for <online> +# 3 No device found for <ccwid> +# 4 Could not change state of the device +# 5 Device is not a DASD +# 6 Could not load module +# 7 Failed to activate DASD +# 8 DASD not formatted +# 9 Only dasd-fba or dasd-eckd is supported. # +if [ "${DEBUG}" != "yes" ]; then + DEBUG="no" +fi + +exitcode=0 +DASD_FORCE=0 +DASD_TYPE="unknown" + +DATUM=$(date) + +add_channel_for_cio() { + echo "$* # $DATUM" >> /boot/zipl/active_devices.txt +} + +remove_channel_for_cio() { + [ -w /boot/zipl/active_devices.txt ] && sed -i -e "/^$1/d" /boot/zipl/active_devices.txt +} + mesg () { echo "$@" } debug_mesg () { - case "${DEBUG}" in + case "$DEBUG" in yes) mesg "$@" ;; *) ;; esac } -add_cio_channel() { - echo "$* # ${DATE}" >> /boot/zipl/active_devices.txt -} - -remove_cio_channel() { - [ -w /boot/zipl/active_devices.txt ] && sed -i -e "/^${1}/d" /boot/zipl/active_devices.txt -} - -usage(){ - echo "Usage: ${0} [-f -t <dasd_type> ] <ccwid> <online> [use_diag]" - echo - echo " -f Override safety checks" - echo " -t DASD type. Must be provided if -f is used. Only dasd-eckd and" - echo " dasd-fba are supported - Deprecated" - echo " ccwid = x.y.ssss where" - echo " x is always 0 until IBM creates something that uses that number" - echo " y is the logical channel subsystem (lcss) number. Most often" - echo " this is 0, but it could be non-zero" - echo " ssss is the four digit subchannel address of the device, in" - echo " hexidecimal, with leading zeros." - echo " online = 0 to take the device offline" - echo " 1 to bring the device online" - echo " use_diag = 0 to _not_ use z/VM DIAG250 I/O, which is the default" - echo " 1 to use z/VM DIAG250 I/O" -} - -if [ "${DEBUG}" != "yes" ]; then - DEBUG="no" +if [ $# -lt 2 ] ; then + echo "Usage: $0 [options] <ccwid> <online> [use_diag]" + echo + echo " -f force creation of udev rules, do not check values in /sys." + echo " -t DASD type. Must be provided if -f is used." + echo " ccwid = x.y.ssss where" + echo " x is always 0 until IBM creates something that uses that number" + echo " y is the logical channel subsystem (lcss) number. Most often this is 0, but it could be non-zero" + echo " ssss is the four digit subchannel address of the device, in hexidecimal, with leading zeros." + echo " online = 0 to take the device offline" + echo " 1 to bring the device online" + echo " use_diag = 0 to _not_ use z/VM DIAG250 I/O, which is the default" + echo " 1 to use z/VM DIAG250 I/O" + exit 1 fi -DATE=$(date) - -DASD_FORCE=0 +while [ $# -gt 0 ] ; do + case "$1" in + -f) # force creation of udev rules, do not check values in /sys + DASD_FORCE=1 + ;; + -t*) # drive type. Must be provided if -f is used. + if [ "$1" = "-t" ] ; then + if [ "$2" = "dasd-eckd" -o "$2" = "dasd-fba" ]; then + DASD_TYPE=$2 + shift + else + debug_mesg "Only dasd-eckd or dasd-fba are supported." + exit 9 + fi + fi + ;; + *) + break; + ;; + esac + shift +done -############################################################ -# Parse the parameters from the command line -# -ARGS=$(getopt --options ft: -n "dasd_configure" -- "$@") -if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi +if [ $DASD_FORCE -eq 0 ]; then + # Get the mount point for sysfs + while read MNTPT MNTDIR MNTSYS MNTTYPE; do + if test "$MNTSYS" = "sysfs"; then + SYSFS="$MNTDIR" + break; + fi + done </proc/mounts + + if [ -z "$SYSFS" ]; then + mesg "/sysfs not present" + exit 1 + fi +else + CCW_CHAN_NAME=$DASD_TYPE + case $DASD_TYPE in + *eckd) + DISCIPLINE=ECKD + ;; + *fba) + DISCIPLINE=FBA + ;; + *) + mesg "Only dasd-eckd or dasd-fba are supported." + exit 9 + ;; + esac +fi # First instance of if [ $DASD_FORCE -eq 0 ] -eval set -- "${ARGS}" -debug_mesg "All the parms passed were ${ARGS}" +CCW_CHAN_ID=$1 +ONLINE=$2 +USE_DIAG=$3 + +[ -z "$USE_DIAG" ] && USE_DIAG=0 + +if [ -z "$ONLINE" ] || [ "$ONLINE" -ne "1" -a "$ONLINE" -ne "0" ]; then + mesg "Invalid device status $ONLINE" + mesg "It must be a zero or a one." + exit 2 +fi -while true; do - case "${1}" in - -f) debug_mesg "This used to mean udev rules will always be generated." - debug_mesg "For chzdev, it means safety checks will be overridden." - debug_mesg "Kinda sorta the same thing, really." - PARM_LIST="${PARM_LIST} -f" - DASD_FORCE=1 - shift 1 - ;; - -t) debug_mesg "This used to set the card type to ${2}" - debug_mesg "Now it gets ignored." - shift 2 - ;; - --) debug_mesg "Found the end of parms indicator: --" - shift 1 - break - ;; - *) debug_mesg "At the catch-all select entry" - debug_mesg "What was selected was ${1}" - shift 1 - ;; - esac -done +if [ $DASD_FORCE -eq 0 ]; then + _ccw_dir=${SYSFS}/bus/ccw/devices -CCW_CHAN_ID=${1} -ON_OFF=${2} -USE_DIAG=${3} - -if [ -z "${CCW_CHAN_ID}" ] || [ -z "${ON_OFF}" ]; then - mesg "You didn't specify all the needed parameters." - usage - exit 1 -fi + debug_mesg "Configuring device ${CCW_CHAN_ID}" + _ccw_status_dir="$_ccw_dir/$CCW_CHAN_ID" -if [ -n "${USE_DIAG}" ]; then - PARM_LIST="${PARM_LIST} use_diag=${USE_DIAG}" -else PARM_LIST="${PARM_LIST} use_diag=0" + if test ! -d "$_ccw_status_dir" ; then + if test "$ONLINE" -eq 1 ; then + mesg "No device ${CCW_CHAN_ID}" + exit 3 + fi + _ccw_dev_status=0 + else + read _cu_type < $_ccw_status_dir/cutype + read _dev_type < $_ccw_status_dir/devtype + + case "$_cu_type" in + 3990/*|2105/*|2107/*|1750/*|9343/*) + CCW_CHAN_NAME="dasd-eckd" + MODULE=dasd_eckd_mod + DISCIPLINE=ECKD + ;; + 6310/*) + CCW_CHAN_NAME="dasd-fba" + MODULE=dasd_fba_mod + DISCIPLINE=FBA + ;; + 3880/*) + case "$_dev_type" in + 3390/*) + CCW_CHAN_NAME="dasd-eckd" + MODULE=dasd_eckd_mod + DISCIPLINE=ECKD + ;; + 3370/*) + CCW_CHAN_NAME="dasd-fba" + MODULE=dasd_fba_mod + DISCIPLINE=FBA + ;; + *) + CCW_CHAN_NAME= + ;; + esac + ;; + *) + CCW_CHAN_NAME= + ;; + esac + + if [ -z "$CCW_CHAN_NAME" ]; then + mesg "Not a DASD device (cu $_cutype, dev $_devtype)" + exit 5 + fi + + # Check for modules + if test ! -d "${SYSFS}/bus/ccw/drivers/${CCW_CHAN_NAME}" ; then + /sbin/modprobe $MODULE + + # Re-check whether module loading has succeeded + if test ! -d "${SYSFS}/bus/ccw/drivers/${CCW_CHAN_NAME}"; then + mesg "Could not load module ${MODULE}" + exit 6 + fi + fi + + read _ccw_dev_status < $_ccw_status_dir/online + fi # if test ! -d "$_ccw_status_dir" + + # + # We check whether we are running under z/VM by looking for the string + # "Control Program: z/VM" in /proc/sysinfo + # + /bin/grep "Control Program: z/VM" /proc/sysinfo 2>&1 > /dev/null + if [ -x /sbin/vmcp -a $? -eq 0 ]; then + # Unconditionally load the vmcp module, loader might be broken + [ -x /sbin/modprobe ] && /sbin/modprobe -q vmcp + # Wait until udev is settled + [ -x /sbin/udevadm ] && /sbin/udevadm settle --timeout=30 + + # Check read-only status of virtual DASDs from z/VM + if /sbin/vmcp q v dasd > /dasd_attr.lst 2> /dev/null; then + while read x dev type label attr1 attr2 rest; do + dev=`echo $dev|tr A-F a-f` + if test "$type" = "ON"; then + attr="$attr2" + else + attr="$attr1" + fi + if [ "$CCW_CHAN_ID" = "0.0.$dev" ]; then + if test "$attr" = "R/O"; then + _ccw_use_readonly="1" + fi + fi + done < /dasd_attr.lst + fi + rm -f /dasd_attr.lst + fi # if [ -x /sbin/vmcp -a $? -eq 0 ] + + if [ "$ONLINE" -eq 1 ]; then + # Check whether we need to do something + read _ccw_use_diag < $_ccw_status_dir/use_diag + + if [ "$_ccw_use_diag" -ne "$USE_DIAG" ] && + [ "$_ccw_dev_status" -eq 1 ] ; then + # We need to change the DIAG access mode + # so we have to set the device offline first + debug_mesg "Setting device offline for DIAG access" + echo "0" > $_ccw_status_dir/online + # Re-read device status + read _ccw_dev_status < $_ccw_status_dir/online + if [ "$_ccw_dev_status" -ne 0 ]; then + mesg "Could not set the device offline for DIAG access" + exit 4 + fi + fi + + if [ "$_ccw_dev_status" -eq 0 ]; then + # Set readonly access if detected + if [ "$_ccw_use_readonly" ]; then + debug_mesg "Setting device read-only" + echo 1 > $_ccw_status_dir/readonly + fi + + if [ "$USE_DIAG" -eq 1 ]; then + # Load the diag module if possible + [ -x /sbin/modprobe ] && /sbin/modprobe -q dasd_diag_mod + _has_dasd_diag=$(/bin/sed -n '/^dasd_diag_mod/p' /proc/modules) + if [ "$_has_dasd_diag" ]; then + # DIAG mode is special: + # We can only be sure if DIAG is available + # _after_ we have activated the device + debug_mesg "Activating DIAG access mode" + echo "$USE_DIAG" > $_ccw_status_dir/use_diag + read _ccw_use_diag < $_ccw_status_dir/use_diag + # Set the device online + debug_mesg "Setting device online" + echo "1" > $_ccw_status_dir/online 2>/dev/null + # Re-read device status + read _ccw_dev_status < $_ccw_status_dir/online + if [ "$_ccw_dev_status" -eq 0 ]; then + mesg "Could not activate DIAG access mode for device ${CCW_CHAN_ID}" + USE_DIAG=0 + echo "$USE_DIAG" > $_ccw_status_dir/use_diag + # Set the device online + debug_mesg "Setting device online" + echo "1" > $_ccw_status_dir/online + else + MODULE=dasd_diag_mod + fi + else + debug_mesg "DIAG mode not available" + USE_DIAG=0 + # Set the device online + debug_mesg "Setting device online" + echo "1" > $_ccw_status_dir/online + fi # if [ "$_has_dasd_diag" ]; + else + if [ "$_ccw_use_diag" -eq 1 ] ; then + debug_mesg "Deactivating DIAG access mode" + echo "0" > $_ccw_status_dir/use_diag + read _ccw_use_diag < $_ccw_status_dir/use_diag + fi + # Set the device online + debug_mesg "Setting device online" + echo "1" > $_ccw_status_dir/online + fi # if [ "$USE_DIAG" -eq 1 ] + + # Re-read device status + read _ccw_dev_status < $_ccw_status_dir/online + if [ "$_ccw_dev_status" -eq 0 ]; then + mesg "Could not set device ${CCW_CHAN_ID} online" + exit 4 + fi + + # Wait for the device to come online + read _dasd_state < $_ccw_status_dir/status + i=0 + while [ "$_dasd_state" != "online" ] ; do + if [ "$_dasd_state" = "unformatted" ] ; then + mesg "Device ${CCW_CHAN_ID} is unformatted" + exitcode=8 + break + fi + [ $i -gt 30 ] && break + i=$(expr $i + 1) + sleep .1 + read _dasd_state < $_ccw_status_dir/status + done + else + debug_mesg "Device ${CCW_CHAN_ID} is already online" + fi # if [ "$_ccw_dev_status" -eq 0 ] + + read _dasd_state < $_ccw_status_dir/status + if [ "$_dasd_state" != "online" ] && [ "$_dasd_state" != "unformatted" ] ; then + mesg "Failed to activate device ${CCW_CHAN_ID}, device in state $_dasd_state" + exit 7 + fi + else + if [ "$_ccw_dev_status" -eq 1 ]; then + # Set the device offline + debug_mesg "Setting device offline" + echo "$ONLINE" > $_ccw_status_dir/online + + # Re-read to check whether we have succeeded + _ccw_dev_status=$(cat $_ccw_status_dir/online) + if [ "$?" -ne 0 -o "$_ccw_dev_status" -ne "$ONLINE" ]; then + mesg "Could not set device ${CCW_CHAN_ID} offline" + exit 4 + fi + else + debug_mesg "Device ${CCW_CHAN_ID} is already offline" + fi + + if [ -d "$_ccw_status_dir" ] ; then + # Always disabling DIAG access + echo "0" > $_ccw_status_dir/use_diag + fi + + # Set readonly access if detected + if [ "$_ccw_use_readonly" ]; then + debug_mesg "Setting device read-only" + echo 1 > $_ccw_status_dir/readonly + fi + fi # if [ "$ONLINE" -eq 1 ] + + # Wait until udev is settled + [ -x /sbin/udevadm ] && /sbin/udevadm settle --timeout=30 + +fi # Second instance of if [ $DASD_FORCE -eq 0 ] + +if [ $DEBUG = "no" ]; then + RULES_DIR=/etc/udev/rules.d +else + RULES_DIR=. fi -if [ "${ON_OFF}" == 0 ]; then - debug_mesg "chzdev -d dasd ${CCW_CHAN_ID}" - chzdev -d dasd ${CCW_CHAN_ID} -elif [ "${ON_OFF}" == 1 ]; then - debug_mesg "chzdev -e dasd ${CCW_CHAN_ID} ${PARM_LIST}" - chzdev -e dasd ${CCW_CHAN_ID} ${PARM_LIST} -else mesg "You must specify a 0 or a 1 for the online/offline attribute." - usage - exit 1 -fi +RULES_FILE=51-dasd-${CCW_CHAN_ID}.rules -RC=${?} -if [ ${RC} -ne 0 ]; then - exit ${RC} +if [ -d "$RULES_DIR" ]; then + if [ -f ${RULES_DIR}/${RULES_FILE} ]; then + rm -f ${RULES_DIR}/${RULES_FILE} + fi + remove_channel_for_cio "${CCW_CHAN_ID}" + + if [ "$ONLINE" -eq "1" ]; then + add_channel_for_cio "${CCW_CHAN_ID}" + # Write a new hwcfg file + cat > ${RULES_DIR}/${RULES_FILE} <<EOF +# Configure DASD device at ${CCW_CHAN_ID} (${DISCIPLINE} mode) +ACTION=="add", SUBSYSTEM=="ccw", KERNEL=="${CCW_CHAN_ID}", IMPORT{program}="collect ${CCW_CHAN_ID} %k ${CCW_CHAN_ID} ${CCW_CHAN_NAME}" +ACTION=="add", SUBSYSTEM=="drivers", KERNEL=="${CCW_CHAN_NAME}", IMPORT{program}="collect ${CCW_CHAN_ID} %k ${CCW_CHAN_ID} ${CCW_CHAN_NAME}" +EOF + if [ "$USE_DIAG" -eq 1 ]; then + cat >> ${RULES_DIR}/${RULES_FILE} <<EOF +ACTION=="add", ENV{COLLECT_${CCW_CHAN_ID}}=="0", ATTR{[ccw/$CCW_CHAN_ID]use_diag}="1" +EOF + fi + cat >> ${RULES_DIR}/${RULES_FILE} <<EOF +ACTION=="add", ENV{COLLECT_${CCW_CHAN_ID}}=="0", ATTR{[ccw/$CCW_CHAN_ID]online}="1" +EOF + fi fi -if [ ${ON_OFF} == 1 ]; then - add_cio_channel "${CCW_CHAN_ID}" -else remove_cio_channel "${CCW_CHAN_ID}" -fi +exit $exitcode ++++++ qeth_configure ++++++ --- /var/tmp/diff_new_pack.qwTXCe/_old 2017-11-03 16:21:49.206827661 +0100 +++ /var/tmp/diff_new_pack.qwTXCe/_new 2017-11-03 16:21:49.210827516 +0100 @@ -2,173 +2,451 @@ # # qeth_configure # -# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany. -# -# Configures a qeth device by calling the IBM-provided chzdev command. -# Whereas this script used to validate the parameters provided to it, -# we now rely on chzdev to do that instead. The script is intended only -# as a "translation layer" to provide backward compatability for older -# scripts and tools that invoke it. +# Configures a qeth device # # Usage: # qeth_configure [-i] [-l] [-f -t <CARDTYPE> ] [-o "Values"] -n <portno> -p <portname> <read chan> <write chan> <data chan> <online> # # -i Configure IP takeover # -l Configure Layer2 support -# -f Override safety checks -# -t Valid cardtypes are: qeth, hsi - Deprecated +# -f force creation of udev rules, do not check values in /sys +# -t Valid cardtypes are: qeth, hsi, osn # -o General QETH options, separated by spaces -# -n QETH port number to use, 0 or 1. Only needed for real, not virtual -# devices. -# -p QETH Portname to use - Deprecated. OSAs no longer need a port name. +# -n QETH port number to use, 0 or 1. Only needed for real, not virtual devices. +# -p QETH Portname to use. Only needed if sharing a real OSA with z/OS. # read/write/data chan = x.y.ssss where -# x is always 0 until IBM creates something that -# uses that number -# y is the logical channel subsystem (lcss) -# number. Most often this is 0, but it could -# be non-zero -# ssss is the four digit subchannel address of -# the device, in hexidecimal, with leading -# zeros. +# x is always 0 until IBM creates something that uses that number +# y is the logical channel subsystem (lcss) number. Most often this is 0, but it could be non-zero +# ssss is the four digit subchannel address of the device, in hexidecimal, with leading zeros. # online = 0 to take the device offline # 1 to bring the device online # # Return values: -# Return codes are determined by the chzdev command. +# 1 sysfs not mounted +# 2 Invalid status for <online> +# 3 No device found for read channel +# 4 No device found for write channel +# 5 No device found for data channel +# 6 Invalid device type +# 7 Could not load module +# 8 CCW devices grouped different devices +# 9 Could not group devices +# 10 Could not set device online +# 11 Could not set device offline # +if [ "${DEBUG}" != "yes" ]; then + DEBUG="no" +fi + +QETH_FORCE=0 + mesg () { echo "$@" } -debug_mesg () { - case "${DEBUG}" in - yes) mesg "$@" ;; - *) ;; - esac -} +DATUM=$(date) -add_cio_channel() { - echo "$* # ${DATE}" >> /boot/zipl/active_devices.txt +add_channel_for_cio() { + echo "$* # $DATUM" >> /boot/zipl/active_devices.txt } -remove_cio_channel() { - [ -w /boot/zipl/active_devices.txt ] && sed -i -e "/^${1}/d" /boot/zipl/active_devices.txt +remove_channel_for_cio() { + [ -w /boot/zipl/active_devices.txt ] && sed -i -e "/^$1/d" /boot/zipl/active_devices.txt } -usage(){ - echo "Usage: ${0} [options] <read chan> <write chan> <data chan> <online>" - echo " -i Configure IP takeover" - echo " -l Configure Layer2 support" - echo " -f Override safety checks" - echo " -t Valid cardtypes are: qeth, hsi - Deprecated." - echo " -o General QETH options, separated by spaces" - echo " -n QETH port number to use, 0 or 1. Only needed for real, not virtual" - echo " devices." - echo " -p QETH Portname to use - Deprecated. OSAs no longer need a port name." - echo " read/write/data chan = x.y.ssss where" - echo " x is always 0 until IBM creates something that" - echo " uses that number" - echo " y is the logical channel subsystem (lcss)" - echo " number. Most often this is 0, but it could" - echo " be non-zero" - echo " ssss is the four digit subchannel address of" - echo " the device, in hexidecimal, with leading" - echo " zeros." - echo " online = 0 to take the device offline" - echo " 1 to bring the device online" +debug_mesg () { + case "$DEBUG" in + yes) mesg "$@" ;; + *) ;; + esac } -if [ "${DEBUG}" != "yes" ]; then - DEBUG="no" +while [ $# -gt 0 ] ; do + case "$1" in + -i) + # Configure IP takeover + QETH_IPA_TAKEOVER=1 + ;; + -f) # force creation of udev rules, do not check values in /sys + QETH_FORCE=1 + ;; + -l) + # Configure Layer2 support + QETH_LAYER2_SUPPORT=1 + ;; + -n*) + # QETH port number to use + if [ "$1" = "-n" ] ; then + QETH_PORTNO=$2 + shift + else + QETH_PORTNO=${1#-n} + fi + ;; + -o) + # General QETH options, separated by spaces + QETH_OPTIONS=$2 + shift + ;; + -p*) + # QETH Portname to use + if [ "$1" = "-p" ] ; then + QETH_PORTNAME=$2 + shift + else + QETH_PORTNAME=${1#-p} + fi + ;; + -t*) # Card type. Must be provided if -f is used. + if [ "$1" = "-t" ] ; then + if [ "$2" = "qeth" -o "$2" = "hsi" -o "$2" = "osn" ]; then + QETH_CARD=$2 + shift + else + mesg "Only qeth, hsi and osn are supported." + exit 6 + fi + fi + CCW_DRV="$QETH_CARD" + ;; + *) + break; + ;; + esac + shift +done + +if [ $QETH_FORCE -eq 0 ]; then +# Get the mount point for sysfs + while read MNTPT MNTDIR MNTSYS MNTTYPE; do + if test "$MNTSYS" = "sysfs"; then + SYSFS="$MNTDIR" + break; + fi + done </proc/mounts + + if [ -z "$SYSFS" ]; then + mesg "/sysfs not present" + exit 1 + fi fi -DATE=$(date) +QETH_READ_CHAN=$1 +QETH_WRITE_CHAN=$2 +QETH_DATA_CHAN=$3 +ONLINE=$4 + +if [ $# -lt 4 ] ; then + echo "Usage: $0 [options] <read chan> <write chan> <data chan> <online>" + echo " -i Configure IP takeover" + echo " -l Configure Layer2 support" + echo " -f force creation of udev rules, do not check values in /sys" + echo " -t Valid cardtypes are: qeth, hsi, osn" + echo " -o General QETH options, separated by spaces" + echo " -n QETH port number to use, 0 or 1. Only needed for real, not virtual devices." + echo " -p QETH Portname to use. Only needed if sharing a real OSA with z/OS." + echo " read/write/data chan = x.y.ssss where" + echo " x is always 0 until IBM creates something that uses that number" + echo " y is the logical channel subsystem (lcss) number. Most often this is 0, but it could be non-zero" + echo " ssss is the four digit subchannel address of the device, in hexidecimal, with leading zeros." + echo " online = 0 to take the device offline" + echo " 1 to bring the device online" + exit 1 +fi -############################################################ -# Parse the parameters from the command line -# -ARGS=$(getopt --options ifln:o:p:t: -n "qeth_configure" -- "$@") -if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi +if [ -z "$ONLINE" ] || [ "$ONLINE" -ne "1" -a "$ONLINE" -ne "0" ]; then + mesg "Invalid device status $ONLINE" + exit 2 +fi + +if [ $QETH_FORCE -eq 0 ]; then +_ccw_dir=${SYSFS}/bus/ccw/devices -eval set -- "${ARGS}" -debug_mesg "All the parms passed were ${ARGS}" - -# Set some defaults -LAYER_MODE="layer2=0" - -while true; do - case "${1}" in - -i) debug_mesg "Configure IP takeover" - PARM_LIST="${PARM_LIST} ipa_takeover/enable=1" - shift 1 - ;; - -f) debug_mesg "This used to mean udev rules will always be generated." - debug_mesg "For chzdev, it means safety checks will be overridden." - debug_mesg "Kinda sorta the same thing, really." - PARM_LIST="${PARM_LIST} -f" - shift 1 - ;; - -l) debug_mesg "Configure Layer 2 support" - LAYER_MODE="layer2=1" - shift 1 - ;; - -n) debug_mesg "Set QETH port number to ${2}" - PARM_LIST="${PARM_LIST} portno=${2}" - shift 2 - ;; - -o) debug_mesg "Add the following arbitrary parms: ${2}" - PARM_LIST="${PARM_LIST} ${2}" - shift 2 - ;; - -p) debug_mesg "QETH Port name is no longer used, don't specify it: ${2}" - shift 2 - ;; - -t) debug_mesg "This used to set the card type to ${2}" - debug_mesg "Now it gets ignored." - shift 2 - ;; - --) debug_mesg "Found the end of parms indicator: --" - shift 1 - break - ;; - *) debug_mesg "At the catch-all select entry" - debug_mesg "What was selected was ${1}" - shift 1 - ;; - esac +# Convert any hexidecimal numbers to lower case +QETH_READ_CHAN=$(echo ${QETH_READ_CHAN} | tr "[A-Z]" "[a-z]") +QETH_WRITE_CHAN=$(echo ${QETH_WRITE_CHAN} | tr "[A-Z]" "[a-z]") +QETH_DATA_CHAN=$(echo ${QETH_DATA_CHAN} | tr "[A-Z]" "[a-z]") + +debug_mesg "Configuring QETH device ${QETH_READ_CHAN}/${QETH_WRITE_CHAN}/${QETH_DATA_CHAN}" + + +if test ! -d "$_ccw_dir/$QETH_READ_CHAN" ; then + mesg "No device ${QETH_READ_CHAN}" + exit 3 +fi +if test ! -d "$_ccw_dir/$QETH_WRITE_CHAN" ; then + mesg "No device ${QETH_WRITE_CHAN}" + exit 4 +fi +if test ! -d "$_ccw_dir/$QETH_DATA_CHAN" ; then + mesg "No device ${QETH_DATA_CHAN}" + exit 5 +fi + +CCW_CHAN_GROUP= +for ccw in $_ccw_dir/$QETH_READ_CHAN $_ccw_dir/$QETH_WRITE_CHAN $_ccw_dir/$QETH_DATA_CHAN; do + + read _cu_type < $ccw/cutype + read _dev_type < $ccw/devtype + + case "$_cu_type" in + 1731/01|1731/02) + # OSA/Express / Guest LAN + CCW_DRV="qeth" + QETH_CARD="qeth" + ;; + 1731/05) + # Hipersockets + CCW_DRV="qeth" + QETH_CARD="hsi" + ;; + 1731/06) + # OSA/N + CCW_DRV="qeth" + QETH_CARD="osn" + ;; + *) + CCW_DRV= + ;; + esac + + if [ -z "$CCW_DRV" ]; then + mesg "Not a valid QETH device (cu $_cutype, dev $_devtype)" + exit 6 + fi done +fi # end QETH_FORCE + +# Portname is only required for OSA/Express +if [ -n "$QETH_PORTNAME" -a "$QETH_CARD" != "qeth" ] ; then + debug_mesg "No portname required for $QETH_CARD adapters" + QETH_PORTNAME= +fi -QETH_READ_CHAN=${1} -QETH_WRITE_CHAN=${2} -QETH_DATA_CHAN=${3} -ON_OFF=${4} - -if [ -z "${QETH_READ_CHAN}" ] || [ -z "${QETH_WRITE_CHAN}" ] || [ -z "${QETH_DATA_CHAN}" ] || [ -z "${ON_OFF}" ]; then - mesg "You didn't specify all the needed parameters." - usage - exit 1 -fi - -if [ "${ON_OFF}" == 0 ]; then - debug_mesg "chzdev -d qeth ${QETH_READ_CHAN}" - chzdev -d qeth ${QETH_READ_CHAN} -elif [ "${ON_OFF}" == 1 ]; then - debug_mesg "chzdev -e qeth ${LAYER_MODE} ${PARM_LIST} ${QETH_READ_CHAN}" - chzdev -e qeth ${LAYER_MODE} ${PARM_LIST} ${QETH_READ_CHAN} -else mesg "You must specify a 0 or a 1 for the online/offline attribute." - usage - exit 1 -fi - -RC=${?} -if [ ${RC} -ne 0 ]; then - exit ${RC} -fi - -if [ ${ON_OFF} == 1 ]; then - add_cio_channel "${QETH_READ_CHAN},${QETH_WRITE_CHAN},${QETH_DATA_CHAN}" -else remove_cio_channel "${QETH_READ_CHAN}" - remove_cio_channel "${QETH_WRITE_CHAN}" - remove_cio_channel "${QETH_DATA_CHAN}" +if [ $QETH_FORCE -eq 0 ]; then +_ccw_groupdir=${SYSFS}/bus/ccwgroup + +# Check for modules +if test ! -d "${_ccw_groupdir}/drivers/${CCW_DRV}" ; then + /sbin/modprobe $CCW_DRV + + # Re-check whether module loading has succeeded + if test ! -d "${_ccw_groupdir}/drivers/${CCW_DRV}"; then + mesg "Could not load module ${CCW_DRV}" + exit 7 + fi +fi + +# Check for grouping +_ccwgroup_dir= +if [ -e ${_ccw_dir}/${QETH_READ_CHAN}/group_device ] ; then + _ccwgroup_dir=$(cd -P ${_ccw_dir}/${QETH_READ_CHAN}/group_device; echo $PWD) +fi +if [ -e ${_ccw_dir}/${QETH_WRITE_CHAN}/group_device ] ; then + _tmp_status_dir=$(cd -P ${_ccw_dir}/${QETH_READ_CHAN}/group_device; echo $PWD) + if [ "$_ccwgroup_dir" ] && [ "$_ccwgroup_dir" != "$_tmp_status_dir" ] ; then + mesg "CCW devices grouped to different devices" + exit 8 + fi + _ccwgroup_dir=$_tmp_status_dir +fi +if [ -e ${_ccw_dir}/${QETH_DATA_CHAN}/group_device ] ; then + _tmp_status_dir=$(cd -P ${_ccw_dir}/${QETH_DATA_CHAN}/group_device; echo $PWD) + if [ "$_ccwgroup_dir" ] && [ "$_ccwgroup_dir" != "$_tmp_status_dir" ] ; then + mesg "CCW devices grouped to different devices" + exit 8 + fi + _ccwgroup_dir=$_tmp_status_dir +fi +if [ -z "$_ccwgroup_dir" ] ; then + echo "$QETH_READ_CHAN,$QETH_WRITE_CHAN,$QETH_DATA_CHAN" > ${_ccw_groupdir}/drivers/${CCW_DRV}/group + if [ -e ${_ccw_dir}/${QETH_READ_CHAN}/group_device ] ; then + _ccwgroup_dir=$(cd -P ${_ccw_dir}/${QETH_READ_CHAN}/group_device; echo $PWD) + fi fi + +if [ -z "$_ccwgroup_dir" -o ! -e "$_ccwgroup_dir" ] ; then + mesg "Could not group $CCW_DRV devices $QETH_READ_CHAN/$QETH_WRITE_CHAN/$QETH_DATA_CHAN" + exit 9 +fi + +CCW_CHAN_ID=${_ccwgroup_dir##*/} + +read _online < $_ccwgroup_dir/online + +if [ "$ONLINE" -eq 1 ]; then + # Check whether we need to do something + # We do not check for the value of CCW_CHAN_MODE, since we + # might want to switch back and forth between several modes + if test "$_online" -eq "0" ; then + # Set the portname + if [ "$QETH_PORTNAME" ]; then + mesg "(portname $QETH_PORTNAME) " + echo "$QETH_PORTNAME" > $_ccwgroup_dir/portname + fi + # Activate Layer2 support + if [ -w "$_ccwgroup_dir/layer2" ] ; then + if [ "$QETH_LAYER2_SUPPORT" = "1" ]; then + mesg "(Layer2) " + echo 1 > $_ccwgroup_dir/layer2 + else + echo 0 > $_ccwgroup_dir/layer2 + fi + else + QETH_LAYER2_SUPPORT= + fi + # Enable IP address takeover + if [ "$QETH_IPA_TAKEOVER" ]; then + if [ "$QETH_IPA_TAKEOVER" = "1" ]; then + mesg "(IP takeover) " + echo 1 > $_ccwgroup_dir/ipa_takeover/enable + fi + fi + # Relative port number + if [ -w "$_ccwgroup_dir/portno" ] ; then + if [ -n "$QETH_PORTNO" ]; then + mesg "(Port $QETH_PORTNO) " + # This may fail, but trial and error is the only way to tell. + echo "$QETH_PORTNO" > $_ccwgroup_dir/portno + fi + else + unset QETH_PORTNO + fi + # Set additional options + if [ "$QETH_OPTIONS" ]; then + for opt in $QETH_OPTIONS; do + set -- $(IFS='='; echo $opt) + opt_name=$1 + opt_val=$2 + case "$opt_name" in + portname|ipa_takeover|layer2) + # These options are set above + debug_mesg "Invalid option $opt_name" + ;; + *) + if [ "$opt_name" -a "$opt_val" ]; then + if [ -w "$_ccwgroup_dir/$opt_name" ]; then + mesg "($opt_name) " + echo "$opt_val" > $_ccwgroup_dir/$opt_name + if [ $? -eq 0 ] ; then + cur_opts="$cur_opts ${opt_name}=${opt_val}" + fi + else + # Skip invalid options + debug_mesg "Invalid option $opt_name" + fi + fi + ;; + esac + done + # Update options list + QETH_OPTIONS="$cur_opts" + fi + + echo "1" > $_ccwgroup_dir/online 2> /dev/null + # Re-read device status + read _ccw_dev_status < $_ccwgroup_dir/online + if [ "$_ccw_dev_status" -eq 0 ]; then + mesg "Could not set device ${CCW_CHAN_ID} online" + exit 10 + fi + else + debug_mesg "Device ${CCW_CHAN_ID} is already online" + fi +else + if [ "$_online" -eq 1 ]; then + # Set the device offline + debug_mesg "Setting device offline" + echo "$ONLINE" > $_ccwgroup_dir/online + + # Re-read to check whether we have succeeded + _online=$(cat $_ccwgroup_dir/online) + if [ "$_online" -ne "$ONLINE" ]; then + mesg "Could not set device ${CCW_CHAN_ID} offline" + exit 11 + fi + else + debug_mesg "Device ${CCW_CHAN_ID} is already offline" + fi + echo 1 > $_ccwgroup_dir/ungroup +fi +else + CCW_CHAN_ID=$QETH_READ_CHAN +fi # QETH_FORCE + +if [ $DEBUG = "no" ]; then + RULES_DIR=/etc/udev/rules.d +else + RULES_DIR=. +fi + +RULES_FILE=51-${QETH_CARD}-${CCW_CHAN_ID}.rules + +if [ -d "$RULES_DIR" ]; then + if [ -f ${RULES_DIR}/${RULES_FILE} ]; then + rm -f ${RULES_DIR}/${RULES_FILE} + fi + remove_channel_for_cio "${QETH_READ_CHAN}" + remove_channel_for_cio "${QETH_WRITE_CHAN}" + remove_channel_for_cio "${QETH_DATA_CHAN}" + + if [ "$ONLINE" -eq "1" ]; then + add_channel_for_cio "${QETH_READ_CHAN},${QETH_WRITE_CHAN},${QETH_DATA_CHAN}" + # Write a new udev rules file + cat > ${RULES_DIR}/${RULES_FILE} <<EOF +# Configure ${QETH_CARD} device at ${QETH_READ_CHAN}/${QETH_WRITE_CHAN}/${QETH_DATA_CHAN} +ACTION=="add", SUBSYSTEM=="drivers", KERNEL=="$CCW_DRV", IMPORT{program}="collect $CCW_CHAN_ID %k $QETH_READ_CHAN $QETH_WRITE_CHAN $QETH_DATA_CHAN $CCW_DRV" +ACTION=="add", SUBSYSTEM=="ccw", KERNEL=="$QETH_READ_CHAN", IMPORT{program}="collect $CCW_CHAN_ID %k $QETH_READ_CHAN $QETH_WRITE_CHAN $QETH_DATA_CHAN $CCW_DRV" +ACTION=="add", SUBSYSTEM=="ccw", KERNEL=="$QETH_WRITE_CHAN", IMPORT{program}="collect $CCW_CHAN_ID %k $QETH_READ_CHAN $QETH_WRITE_CHAN $QETH_DATA_CHAN $CCW_DRV" +ACTION=="add", SUBSYSTEM=="ccw", KERNEL=="$QETH_DATA_CHAN", IMPORT{program}="collect $CCW_CHAN_ID %k $QETH_READ_CHAN $QETH_WRITE_CHAN $QETH_DATA_CHAN $CCW_DRV" +ACTION=="remove", SUBSYSTEM=="drivers", KERNEL=="$CCW_DRV", IMPORT{program}="collect --remove $CCW_CHAN_ID %k $QETH_READ_CHAN $QETH_WRITE_CHAN $QETH_DATA_CHAN $CCW_DRV" +ACTION=="remove", SUBSYSTEM=="ccw", KERNEL=="$QETH_READ_CHAN", IMPORT{program}="collect --remove $CCW_CHAN_ID %k $QETH_READ_CHAN $QETH_WRITE_CHAN $QETH_DATA_CHAN $CCW_DRV" +ACTION=="remove", SUBSYSTEM=="ccw", KERNEL=="$QETH_WRITE_CHAN", IMPORT{program}="collect --remove $CCW_CHAN_ID %k $QETH_READ_CHAN $QETH_WRITE_CHAN $QETH_DATA_CHAN $CCW_DRV" +ACTION=="remove", SUBSYSTEM=="ccw", KERNEL=="$QETH_DATA_CHAN", IMPORT{program}="collect --remove $CCW_CHAN_ID %k $QETH_READ_CHAN $QETH_WRITE_CHAN $QETH_DATA_CHAN $CCW_DRV" +TEST=="[ccwgroup/${CCW_CHAN_ID}]", GOTO="${QETH_CARD}-${CCW_CHAN_ID}-end" +ACTION=="add", SUBSYSTEM=="ccw", ENV{COLLECT_$CCW_CHAN_ID}=="0", ATTR{[drivers/ccwgroup:$CCW_DRV]group}="$QETH_READ_CHAN,$QETH_WRITE_CHAN,$QETH_DATA_CHAN" +ACTION=="add", SUBSYSTEM=="drivers", KERNEL=="$CCW_DRV", ENV{COLLECT_$CCW_CHAN_ID}=="0", ATTR{[drivers/ccwgroup:$CCW_DRV]group}="$QETH_READ_CHAN,$QETH_WRITE_CHAN,$QETH_DATA_CHAN" +LABEL="${QETH_CARD}-${CCW_CHAN_ID}-end" +EOF + if [ "$QETH_PORTNAME" ]; then + cat >> ${RULES_DIR}/${RULES_FILE} <<EOF +ACTION=="add", SUBSYSTEM=="ccwgroup", KERNEL=="$CCW_CHAN_ID", ATTR{portname}="$QETH_PORTNAME" +EOF + fi + if [ "$QETH_PORTNO" ]; then + cat >> ${RULES_DIR}/${RULES_FILE} <<EOF +ACTION=="add", SUBSYSTEM=="ccwgroup", KERNEL=="$CCW_CHAN_ID", ATTR{portno}="$QETH_PORTNO" +EOF + fi + if [ "$QETH_LAYER2_SUPPORT" ]; then + cat >> ${RULES_DIR}/${RULES_FILE} <<EOF +ACTION=="add", SUBSYSTEM=="ccwgroup", KERNEL=="$CCW_CHAN_ID", ATTR{layer2}="1" +EOF + elif [ "${QETH_CARD}" != "osn" ]; then + cat >> ${RULES_DIR}/${RULES_FILE} <<EOF +ACTION=="add", SUBSYSTEM=="ccwgroup", KERNEL=="$CCW_CHAN_ID", ATTR{layer2}="0" +EOF + fi + if [ "$QETH_IPA_TAKEOVER" ]; then + cat >> ${RULES_DIR}/${RULES_FILE} <<EOF +ACTION=="add", SUBSYSTEM=="ccwgroup", KERNEL=="$CCW_CHAN_ID", ATTR{ipa_takeover/enable}="1" +EOF + fi + for opt in $QETH_OPTIONS; do + set -- $(IFS='='; echo $opt) + opt_name=$1 + opt_val=$2 + cat >> ${RULES_DIR}/${RULES_FILE} <<EOF +ACTION=="add", SUBSYSTEM=="ccwgroup", KERNEL=="$CCW_CHAN_ID", ATTR{$opt_name}="$opt_val" +EOF + done + cat >> ${RULES_DIR}/${RULES_FILE} <<EOF +ACTION=="add", SUBSYSTEM=="ccwgroup", KERNEL=="$CCW_CHAN_ID", ATTR{online}="1" +EOF + fi +fi + +udevadm settle + +exit 0 ++++++ s390-tools-sles15-Format-devices-in-parallel.patch ++++++ --- /var/tmp/diff_new_pack.qwTXCe/_old 2017-11-03 16:21:49.318823585 +0100 +++ /var/tmp/diff_new_pack.qwTXCe/_new 2017-11-03 16:21:49.318823585 +0100 @@ -124,6 +124,16 @@ case OPT_CHECK: info.check = 1; break; +@@ -1673,6 +1683,9 @@ + break; /* exit loop if finished */ + } + ++ /* Reset the value of rc since we're going to use it again later. */ ++ rc = 0; ++ + CHECK_SPEC_MAX_ONCE(info.blksize_specified, "blocksize"); + CHECK_SPEC_MAX_ONCE(info.labelspec, "label"); + CHECK_SPEC_MAX_ONCE(info.writenolabel, "omit-label-writing flag"); @@ -1707,7 +1717,33 @@ int main(int argc, char *argv[]) ERRMSG_EXIT(EXIT_MISUSE, "%s: No device specified!\n", prog_name); ++++++ zfcp_disk_configure ++++++ --- /var/tmp/diff_new_pack.qwTXCe/_old 2017-11-03 16:21:49.470818054 +0100 +++ /var/tmp/diff_new_pack.qwTXCe/_new 2017-11-03 16:21:49.470818054 +0100 @@ -2,72 +2,318 @@ # # zfcp_disk_configure # -# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany. -# -# Configures a zfcp SCSI disk by calling the IBM-provided chzdev command. -# Whereas this script used to validate the parameters provided to it, -# we now rely on chzdev to do that instead. The script is intended only -# as a "translation layer" to provide backward compatability for older -# scripts and tools that invoke it. +# Configures a zfcp disk # # Usage: # zfcp_disk_configure <ccwid> <wwpn> <lun> <online> # # ccwid = x.y.ssss where # x is always 0 until IBM creates something that uses that number -# y is the logical channel subsystem (lcss) number. Most often -# this is 0, but it could be non-zero -# ssss is the four digit subchannel address of the device, in -# hexidecimal, with leading zeros. +# y is the logical channel subsystem (lcss) number. Most often this is 0, but it could be non-zero +# ssss is the four digit subchannel address of the device, in hexidecimal, with leading zeros. # online = 0 to take the device offline # 1 to bring the device online # -# Return values: -# Return codes are determined by the chzdev command. +# Return codes +# 1 sysfs not mounted +# 2 invalid value for <online> +# 3 device <ccwid> does not exist +# 4 WWPN invalid +# 5 Could not activate WWPN for adapter +# 6 Could not activate zFCP disk +# 7 SCSI disk could not be deactivated +# 8 zFCP LUN could not be deregistered +# 9 zFCP WWPN could not be deregistered # +if [ "${DEBUG}" != "yes" ]; then + DEBUG="no" +fi + mesg () { echo "$@" } debug_mesg () { - case "${DEBUG}" in - yes) mesg "$@" ;; - *) ;; + case "$DEBUG" in + yes) mesg "$@" ;; + *) ;; esac } -usage(){ - echo "Usage: ${0} <ccwid> <wwpn> <lun> <online>" - echo " ccwid = x.y.ssss where" - echo " x is always 0 until IBM creates something that uses that number" - echo " y is the logical channel subsystem (lcss) number. Most often" - echo " this is 0, but it could be non-zero" - echo " ssss is the four digit subchannel address of the device, in" - echo " hexidecimal, with leading zeros." - echo " online = 0 to take the device offline" - echo " 1 to bring the device online" -} +if [ $# -ne 4 ] ; then + echo "Usage: $0 <ccwid> <wwpn> <lun> <online>" + echo " ccwid = x.y.ssss where" + echo " x is always 0 until IBM creates something that uses that number" + echo " y is the logical channel subsystem (lcss) number. Most often this is 0, but it could be non-zero" + echo " ssss is the four digit subchannel address of the device, in hexidecimal, with leading zeros." + echo " online = 0 to take the device offline" + echo " 1 to bring the device online" + exit 1 +fi -if [ "${DEBUG}" != "yes" ]; then - DEBUG="no" +# Get the mount point for sysfs +while read MNTPT MNTDIR MNTSYS MNTTYPE; do + if test "$MNTSYS" = "sysfs"; then + SYSFS="$MNTDIR" + break; + fi +done </proc/mounts + +if [ -z "$SYSFS" ]; then + mesg "/sysfs not present" + exit 1 fi -CCW_CHAN_ID=${1} -FCP_WWPN="${2}" -FCP_LUN="${3}" -ON_OFF=${4} +udev_timeout=30 +CCW_CHAN_ID=$1 +FCP_WWPN=${2#0x*} +FCP_LUN=${3#0x*} +ONLINE=$4 # normalise to lower case -FCP_WWPN=$(echo ${FCP_WWPN} | tr "A-Z" "a-z") -FCP_LUN=$(echo ${FCP_LUN} | tr "A-Z" "a-z") +FCP_WWPN=`echo $FCP_WWPN | sed 's/A/a/g;s/B/b/g;s/C/c/g;s/D/d/g;s/E/e/g;s/F/f/g'` +FCP_LUN=`echo $FCP_LUN | sed 's/A/a/g;s/B/b/g;s/C/c/g;s/D/d/g;s/E/e/g;s/F/f/g'` + +if [ -z "$CCW_CHAN_ID" ] ; then + mesg "No CCW device specified" + exit 1 +fi + +if [ -z "$ONLINE" ] || [ "$ONLINE" -ne "1" -a "$ONLINE" -ne "0" ]; then + mesg "Invalid device status $ONLINE" + exit 2 +fi + +_ccw_dir=${SYSFS}/bus/ccw/devices + +_zfcp_dir="$_ccw_dir/$CCW_CHAN_ID" + +if test ! -d "$_zfcp_dir" ; then + mesg "No device ${CCW_CHAN_ID}" + exit 3 +fi + +RULES_DIR=/etc/udev/rules.d +RULES_FILE=51-zfcp-${CCW_CHAN_ID}.rules -if [ "${ON_OFF}" == 0 ]; then - debug_mesg "chzdev -d zfcp-lun ${CCW_CHAN_ID}:${FCP_WWPN}:${FCP_LUN}" - chzdev -d zfcp-lun ${CCW_CHAN_ID}:${FCP_WWPN}:${FCP_LUN} -elif [ "${ON_OFF}" == 1 ]; then - debug_mesg "chzdev -e zfcp-lun ${CCW_CHAN_ID}:${FCP_WWPN}:${FCP_LUN}" - chzdev -e zfcp-lun ${CCW_CHAN_ID}:${FCP_WWPN}:${FCP_LUN} -else mesg "You must specify a 0 or a 1 for the online/offline attribute." - usage - exit 1 +if [ ! -f ${RULES_DIR}/${RULES_FILE} ]; then + debug_mesg "No configuration file for adapter ${CCW_CHAN_ID}" fi + +# Check whether we need to do something +read allow_lun_scan < /sys/module/zfcp/parameters/allow_lun_scan +if [ "$allow_lun_scan" = "Y" ] ; then + for host in ${_zfcp_dir}/host* ; do + [ -d $host ] || continue + hba_num=${host##*host} + done + read port_type < /sys/class/fc_host/host${hba_num}/port_type + if [ "$port_type" = "NPIV VPORT" ] ; then + auto_lun_scan=1 + fi + + if [ -z "${hba_num}" ] ; then + if [ "$ONLINE" -eq "1" ]; then + debug_mesg "FCP adapter ${CCW_CHAN_ID} not configured" + exit 1 + else + debug_mesg "FCP adapter ${CCH_CHAN_ID} already deconfigured" + exit 0 + fi + fi +elif [ -d ${_zfcp_dir}/0x${FCP_WWPN}/0x${FCP_LUN} ]; then + if [ "$ONLINE" -eq "1" ]; then + debug_mesg "FCP disk ${FCP_WWPN}:${FCP_LUN} already configured" + exit 0 + fi +else + if [ "$ONLINE" -eq "0" ]; then + debug_mesg "FCP disk ${FCP_WWPN}:${FCP_LUN} does not exist" + exit 0 + fi +fi + +if [ "$ONLINE" -eq "1" ]; then + # Configure SCSI disk + debug_mesg "Configuring FCP disk ${FCP_WWPN}:${FCP_LUN}" + + # Check whether the wwpn exists + if [ "$auto_lun_scan" = 1 ] ; then + for rport in /sys/class/fc_remote_ports/rport-${hba_num}:* ; do + [ -f ${rport}/port_name ] || continue + read port_name < ${rport}/port_name + if [ "$port_name" = "0x${FCP_WWPN}" ] ; then + for t in ${rport}/device/target* ; do + _targetid=${t#*target} + done + _zfcp_wwpn_dir=${rport} + break; + fi + done + else + _zfcp_wwpn_dir="${_zfcp_dir}/0x${FCP_WWPN}" + fi + if [ ! -d "${_zfcp_wwpn_dir}" ] ; then + mesg "WWPN ${FCP_WWPN} for adapter ${CCW_CHAN_ID} not found" + exit 5 + fi + # Check and configure the zfcp-lun + if [ "$auto_lun_scan" = 1 ] ; then + if [ -n "${_targetid}" ] ; then + for _lun in /sys/class/scsi_device/${_targetid}:* ; do + [ -f ${_lun}/device/fcp_lun ] || continue + read _lunid < ${_lun}/device/fcp_lun + if [ "${_lunid}" = "0x${FCP_LUN}" ] ; then + _zfcp_lun_dir="${_lun}/device" + break; + fi + done + fi + if [ -z "$_zfcp_lun_dir" ] ; then + mesg "Could not activate FCP disk ${FCP_WWPN}:${FCP_LUN}" + exit 6 + fi + else + # Check whether the WWPN is activated + if [ `cat ${_zfcp_wwpn_dir}/failed` -eq "1" ] ; then + mesg "WWPN ${FCP_WWPN} invalid." + exit 4 + fi + if [ ! -d "${_zfcp_wwpn_dir}/0x${FCP_LUN}" ] ; then + echo "0x${FCP_LUN}" > ${_zfcp_wwpn_dir}/unit_add + /sbin/udevadm settle + fi + # Re-check whether the disk could be activated + if [ ! -d "${_zfcp_wwpn_dir}/0x${FCP_LUN}" ] ; then + mesg "Could not activate FCP disk ${FCP_WWPN}:${FCP_LUN}" + exit 6 + fi + # Check for failed disks + read wwpn_status < ${_zfcp_wwpn_dir}/0x${FCP_LUN}/status + while [ "$wwpn_status" != 0 ] ; do + sleep 1 + read wwpn_status < ${_zfcp_wwpn_dir}/0x${FCP_LUN}/in_recovery + [ "$wwpn_status" = 0 ] && break + done + read wwpn_status < ${_zfcp_wwpn_dir}/0x${FCP_LUN}/failed + if [ "$wwpn_status" = 1 ] ; then + debug_mesg "ERP failed on FCP disk ${FCP_WWPN}:${FCP_LUN}" + exit 7 + fi + fi +else + # Deconfigure SCSI disk + debug_mesg "Deconfiguring FCP disk ${FCP_WWPN}:${FCP_LUN}" + + _zfcp_wwpn_dir="${_zfcp_dir}/0x${FCP_WWPN}" + # Find the correspondig SCSI disk + for host_dir in $_zfcp_dir/host*; do + if [ -d $host_dir ] ; then + _zfcp_scsi_host_dir=$host_dir + break; + fi + done + if [ -d "$_zfcp_scsi_host_dir" ] ; then + # Deregister the disk from SCSI layer + for target in $_zfcp_scsi_host_dir/rport-*/target*/* ; do + [ "$target" != "${target##*/fc_transport}" ] && continue + if [ -d "$target" ] && [ -d "$target/scsi_device" ] ; then + _zfcp_scsi_id=${target##*/} + read _zfcp_tmp_hba < ${target}/hba_id + read _zfcp_tmp_wwpn < ${target}/wwpn + read _zfcp_tmp_lun < ${target}/fcp_lun + if [ "0x${FCP_LUN}" = "$_zfcp_tmp_lun" -a "0x${FCP_WWPN}" = "$_zfcp_tmp_wwpn" ] ; then + if [ "$auto_lun_scan" = 1 ] ; then + mesg "Could not deactivate SCSI disk ${_zfcp_scsi_id}" + exit 7 + else + echo 1 > $target/delete + _zfcp_scsi_dir=$target + fi + break; + fi + fi + done + /sbin/udevadm settle + else + debug_mesg "No SCSI disk found for FCP disk ${FCP_WWPN}:${FCP_LUN}" + fi + + # Re-check whether the SCSI disk is gone + num=$udev_timeout + while [ $num -gt 0 ] ; do + [ -d "${_zfcp_scsi_dir}" ] || break + let num=$num-1 + sleep 1 + done + if [ -d "${_zfcp_scsi_dir}" ]; then + mesg "Could not deactivate SCSI disk ${_zfcp_scsi_id}" + exit 7 + fi + + # Wait for udev to catch up + /sbin/udevadm settle + + # check multipathing + _zfcp_scsi_dev=$(multipathd -k'show paths' 2> /dev/null | sed -n "s/$_zfcp_scsi_id \(sd[a-z]*\).*/\1/p") + [ "$_zfcp_scsi_dev" ] && multipathd -k"del path $_zfcp_scsi_dev" + + # Deconfigure the FCP_LUN + : ${_zfcp_wwpn_dir} + echo "0x${FCP_LUN}" > ${_zfcp_wwpn_dir}/unit_remove + if [ -d "${_zfcp_wwpn_dir}/0x${FCP_LUN}" ]; then + mesg "Could not deregister FCP LUN ${FCP_LUN}" + exit 8 + fi + + # Find all remaining activated disks + ZFCP_LUNS= + for _tmp_wwpn_dir in ${_zfcp_dir}/0x*; do + if [ -d "$_tmp_wwpn_dir" ]; then + tmp_wwpn=$(basename $_tmp_wwpn_dir) + # Find all luns + for _tmp_lun_dir in ${_tmp_wwpn_dir}/0x*; do + if [ -d "$_tmp_lun_dir" ]; then + tmp_lun=$(basename $_tmp_lun_dir) + tmp_port="${tmp_wwpn}:${tmp_lun}" + ZFCP_LUNS="$ZFCP_LUNS +$tmp_port" + fi + done + fi + done +fi + +# And now update the rules file +if test -d ${RULES_DIR}; then + # Find all WWPNs + + read online < ${_zfcp_dir}/online; + if [ $online -eq 0 ] ; then + exit 0 + fi + + for port in ${_zfcp_dir}/0x* ; do + [ -d $port ] || continue; + [ -w $port/unit_remove ] || continue; + port_list="$port_list ${port##*/}" + done + + cat > ${RULES_DIR}/${RULES_FILE} <<EOF +# Configure zFCP device at ${CCW_CHAN_ID} +ACTION=="add", SUBSYSTEM=="ccw", KERNEL=="$CCW_CHAN_ID", IMPORT{program}="collect $CCW_CHAN_ID %k $CCW_CHAN_ID zfcp" +ACTION=="add", SUBSYSTEM=="drivers", KERNEL=="zfcp", IMPORT{program}="collect $CCW_CHAN_ID %k $CCW_CHAN_ID zfcp" +ACTION=="add", ENV{COLLECT_$CCW_CHAN_ID}=="0", ATTR{[ccw/$CCW_CHAN_ID]online}="1" +EOF + for port in $port_list; do + for lun in ${_zfcp_dir}/$port/0x* ; do + [ -d $lun ] || continue; + [ -r $lun/status ] || continue; + cat >> ${RULES_DIR}/${RULES_FILE} <<EOF +ACTION=="add", KERNEL=="rport-*", ATTR{port_name}=="$port", SUBSYSTEMS=="ccw", KERNELS=="$CCW_CHAN_ID", ATTR{[ccw/$CCW_CHAN_ID]$port/unit_add}="${lun##*/}" +EOF + done + done +fi + +# EOF ++++++ zfcp_host_configure ++++++ --- /var/tmp/diff_new_pack.qwTXCe/_old 2017-11-03 16:21:49.502816889 +0100 +++ /var/tmp/diff_new_pack.qwTXCe/_new 2017-11-03 16:21:49.502816889 +0100 @@ -2,94 +2,185 @@ # # zfcp_host_configure # -# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany. -# -# Configures a zfcp host adapter by calling the IBM-provided chzdev command. -# Whereas this script used to validate the parameters provided to it, -# we now rely on chzdev to do that instead. The script is intended only -# as a "translation layer" to provide backward compatability for older -# scripts and tools that invoke it. -# +# Configures a zfcp host adapter # # Usage: # zfcp_host_configure <ccwid> <online> # # ccwid = x.y.ssss where # x is always 0 until IBM creates something that uses that number -# y is the logical channel subsystem (lcss) number. Most often -# this is 0, but it could be non-zero -# ssss is the four digit subchannel address of the device, in -# hexidecimal, with leading zeros. +# y is the logical channel subsystem (lcss) number. Most often this is 0, but it could be non-zero +# ssss is the four digit subchannel address of the device, in hexidecimal, with leading zeros. # online = 0 to take the device offline # 1 to bring the device online # # Return codes -# Return codes are determined by the chzdev command. +# 1 sysfs not mounted +# 2 invalid value for <online> +# 3 device <ccwid> does not exist +# 4 module zfcp could not be loaded +# 5 adapter status could not be changed +# 6 wwpn ports still active +# 10 adapter active but allow_lun_scan active # +if [ "${DEBUG}" != "yes" ]; then + DEBUG="no" +fi + +DATUM=$(date) + +add_channel_for_cio() { + echo "$* # $DATUM" >> /boot/zipl/active_devices.txt +} + +remove_channel_for_cio() { + [ -w /boot/zipl/active_devices.txt ] && sed -i -e "/^$1/d" /boot/zipl/active_devices.txt +} + mesg () { echo "$@" } debug_mesg () { - case "${DEBUG}" in - yes) mesg "$@" ;; - *) ;; + case "$DEBUG" in + yes) mesg "$@" ;; + *) ;; esac } -add_cio_channel() { - echo "$* # ${DATE}" >> /boot/zipl/active_devices.txt -} +if [ $# -ne 2 ] ; then + echo "Usage: $0 <ccwid> <online>" + echo " ccwid = x.y.ssss where" + echo " x is always 0 until IBM creates something that uses that number" + echo " y is the logical channel subsystem (lcss) number. Most often this is 0, but it could be non-zero" + echo " ssss is the four digit subchannel address of the device, in hexidecimal, with leading zeros." + echo " online = 0 to take the device offline" + echo " 1 to bring the device online" + exit 1 +fi -remove_cio_channel() { - [ -w /boot/zipl/active_devices.txt ] && sed -i -e "/^${1}/d" /boot/zipl/active_devices.txt -} +# Get the mount point for sysfs +while read MNTPT MNTDIR MNTSYS MNTTYPE; do + if test "$MNTSYS" = "sysfs"; then + SYSFS="$MNTDIR" + break; + fi +done </proc/mounts + +if [ -z "$SYSFS" ]; then + mesg "/sysfs not present" + exit 1 +fi -usage(){ - echo "Usage: ${0} <ccwid> <online>" - echo " ccwid = x.y.ssss where" - echo " x is always 0 until IBM creates something that uses that number" - echo " y is the logical channel subsystem (lcss) number. Most often" - echo " this is 0, but it could be non-zero" - echo " ssss is the four digit subchannel address of the device, in" - echo " hexidecimal, with leading zeros." - echo " online = 0 to take the device offline" - echo " 1 to bring the device online" -} +CCW_CHAN_ID=$1 +ONLINE=$2 +MODULE=zfcp + +if [ -z "$CCW_CHAN_ID" ] ; then + mesg "No CCW device specified" + exit 1 +fi -if [ "${DEBUG}" != "yes" ]; then - DEBUG="no" +if [ -z "$ONLINE" ] || [ "$ONLINE" != "1" -a "$ONLINE" != "0" ]; then + mesg "Invalid device status $ONLINE" + exit 2 fi -DATE=$(date) +_ccw_dir=${SYSFS}/bus/ccw/devices -CCW_CHAN_ID=${1} -ON_OFF=${2} +_zfcp_dir="$_ccw_dir/$CCW_CHAN_ID" -if [ -z "${CCW_CHAN_ID}" ] || [ -z "${ON_OFF}" ]; then - mesg "You didn't specify all the needed parameters." - usage - exit 1 +if test ! -d "$_zfcp_dir" ; then + mesg "No device ${CCW_CHAN_ID}" + exit 3 fi -if [ "${ON_OFF}" == 0 ]; then - debug_mesg "chzdev -d zfcp-host ${CCW_CHAN_ID}" - chzdev -d zfcp-host ${CCW_CHAN_ID} -elif [ "${ON_OFF}" == 1 ]; then - debug_mesg "chzdev -e zfcp-host ${CCW_CHAN_ID}" - chzdev -e zfcp-host ${CCW_CHAN_ID} -else mesg "You must specify a 0 or a 1 for the online/offline attribute." - usage - exit 1 +# Check whether we need to load the zfcp module +if test ! -d "${SYSFS}/bus/ccw/drivers/zfcp"; then + modprobe ${MODULE} + + # Re-check whether module loading has succeeded + if test ! -d "${SYSFS}/bus/ccw/drivers/zfcp"; then + mesg "Could not load module ${MODULE}" + exit 4 + fi fi -RC=${?} -if [ ${RC} -ne 0 ]; then - exit ${RC} +RULES_DIR=/etc/udev/rules.d +RULES_FILE=51-zfcp-${CCW_CHAN_ID}.rules +ALREADY_ONLINE=0 + +# Check whether we need to do something +_zfcp_dev_status=$(cat $_zfcp_dir/online) +if [ "$_zfcp_dev_status" -eq "$ONLINE" ]; then + debug_mesg "zFCP adapter ${CCW_CHAN_ID} already in status ${ONLINE}" + ALREADY_ONLINE=1 fi -if [ ${ON_OFF} == 1 ]; then - add_cio_channel "${CCW_CHAN_ID}" -else remove_cio_channel "${CCW_CHAN_ID}" +debug_mesg "Configuring device ${CCW_CHAN_ID}" + +if [ -f ${RULES_DIR}/${RULES_FILE} ]; then + rm -f ${RULES_DIR}/${RULES_FILE} +fi + + +if [ "$ONLINE" -eq "1" ]; then + if [ "${ALREADY_ONLINE}" -eq "0" ]; then + # Activate the device + echo "$ONLINE" > $_zfcp_dir/online + + # Now wait for the adapter to initialize + /sbin/udevadm settle + fi + + for loop in 1 2 3 4 5 ; do + read status < /sys/bus/ccw/devices/$CCW_CHAN_ID/status + (( $status & 0x10000000 )) && break; + done + read wwpn_status < /sys/bus/ccw/devices/$CCW_CHAN_ID/status + if !(( $wwpn_status & 0x10000000 )) ; then + echo 0 > /sys/bus/ccw/devices/$CCW_CHAN_ID/online + mesg "Could not activate adapter, status $wwpn_status" + exit 5 + fi + + # Write the configuration file + if test -d ${RULES_DIR}; then + cat > ${RULES_DIR}/${RULES_FILE} <<EOF +# Configuration for the zfcp adapter at CCW ID ${CCW_CHAN_ID} +ACTION=="add", SUBSYSTEM=="ccw", KERNEL=="$CCW_CHAN_ID", IMPORT{program}="collect $CCW_CHAN_ID %k $CCW_CHAN_ID zfcp" +ACTION=="add", SUBSYSTEM=="drivers", KERNEL=="zfcp", IMPORT{program}="collect $CCW_CHAN_ID %k $CCW_CHAN_ID zfcp" +ACTION=="add", ENV{COLLECT_$CCW_CHAN_ID}=="0", ATTR{[ccw/$CCW_CHAN_ID]online}="1" +EOF + fi + add_channel_for_cio "${CCW_CHAN_ID}" + # Check whether we need to do something + read allow_lun_scan < /sys/module/zfcp/parameters/allow_lun_scan + if [ "$allow_lun_scan" = "Y" ] ; then + for host in ${_zfcp_dir}/host* ; do + [ -d $host ] || continue + hba_num=${host##*host} + done + # Automatic LUN scan is only possible on NPIV ports + read port_type < /sys/class/fc_host/host${hba_num}/port_type + if [ "$port_type" = "NPIV VPORT" ] ; then + exit 10; + fi + fi +else + echo "0" > ${_zfcp_dir}/online + # Re-read to check whether we have succeeded + _ccw_dev_status=$(cat $_zfcp_dir/online) + if [ "$_ccw_dev_status" -ne "$ONLINE" ]; then + mesg "Could not change status of device ${CCW_CHAN_ID} to $ONLINE" + exit 5 + fi + echo "${CCW_CHAN_ID}" > /sys/bus/ccw/drivers/zfcp/unbind + echo "${CCW_CHAN_ID}" > /sys/bus/ccw/drivers/zfcp/bind + remove_channel_for_cio "${CCW_CHAN_ID}" + + debug_mesg "zFCP adapter at ${CCW_CHAN_ID} deactivated" fi + +# EOF
