diff --git a/normalize_dasd_arg b/normalize_dasd_arg new file mode 100644 index 0000000..2f622e3 --- /dev/null +++ b/normalize_dasd_arg @@ -0,0 +1,112 @@ +#!/bin/sh +# +# Copyright 2012 Red Hat, Inc. +# License: GPLv2 +# Author: Jesse Keating +# +# Normalize DASD data into valid dasd.conf format +# +# Standard input should be the DASD argument +# Standard otuput is the properly formatted content +# +# it is used in +# dracut generated initramfs +# +# Much of this code was salvaged from linuxrc.s390 from Anaconda: +# +# License GPLv2+ +# +# Copyright (C) 2000-2004 by +# Bernhard Rosenkraenzer +# Oliver Paukstadt +# Karsten Hopp +# Florian La Roche +# Nils Philippsen +# Helge Deller +# David Sainty +# Copyright (C) IBM Corp. 2008,2009 +# Author: Steffen Maier + + +function canonicalize_devno() +{ + case ${#1} in + 3) echo "0.0.0${1}" ;; + 4) echo "0.0.${1}" ;; + *) echo "${1}" ;; + esac + return 0 +} + +read DASD +for dasditem in $(echo $DASD |sed 's/,/ /g') + do + unset range features lo hi attrs devno lodevno hidevno devbusid sys + case $dasditem in + autodetect|probeonly|nopav|nofcx|"") continue ;; # these don't gen a config + *) + IFS='(' + read range features <<< "$dasditem" + unset IFS + lo=${range%%-*} + [[ "$lo" =~ (^[[:xdigit:]]+\.[0-3]\.[[:xdigit:]]{4}$)|(^[[:xdigit:]]{3,4}$) ]] + case $? in + 0) # string matched the pattern + lo=$(canonicalize_devno $lo) ;; + 1) # string did not match the pattern + echo $"Incorrect format for lower bound of DASD range $range: $lo" + exit 1 + ;; + 2) echo "l.$LINENO: syntax error in regex of match operator =~, code needs to be fixed" 1>&2 ;; + *) echo "l.$LINENO: unexpected return code of regex match operator =~, code needs to be fixed" 1>&2 ;; + esac + if [ "${range//*-*/}" = "" ]; then + hi=${range##*-} + [[ "$hi" =~ (^[[:xdigit:]]+\.[0-3]\.[[:xdigit:]]{4}$)|(^[[:xdigit:]]{3,4}$) ]] + case $? in + 0) # string matched the pattern + hi=$(canonicalize_devno $hi) + if [ "${lo%.*}" != "${hi%.*}" ]; then + echo $"Prefixes of DASD range $range do not match: ${lo%.*} != ${hi%.*}" + exit 1 + fi + ;; + 1) # string did not match the pattern + echo $"Incorrect format for upper bound of DASD range $range: $hi" + exit 1 + ;; + 2) echo "l.$LINENO: syntax error in regex of match operator =~, code needs to be fixed" 1>&2 ;; + *) echo "l.$LINENO: unexpected return code of regex match operator =~, code needs to be fixed" 1>&2 ;; + esac + fi + if [ "${features//*)/}" != "" ]; then + echo $"Missing closing parenthesis at features of DASD range $range: ($features" + exit 1 + fi + if [ -n "$features" ]; then + attrs="" + features="${features%)}" + for feature in $(echo $features |sed 's/:/\n/g'); do + case $feature in + ro) attrs=$attrs" readonly" ;; + diag) attrs=$attrs" use_diag" ;; + erplog|failfast) attrs=$attrs" "$feature ;; + *) echo $"Unknown DASD feature for device range $range: $feature" + exit 1 + ;; + esac + done + fi + [ -z "$hi" ] && hi=$lo + lodevno=$((0x${lo##*.})) + hidevno=$((0x${hi##*.})) + for ((devno=$lodevno; $devno <= $hidevno; ++devno)); do + devbusid=$(printf "%s.%04x" ${lo%.*} $devno) + echo -n "$devbusid" + for attr in $attrs; do + echo -n " $attr=1" + done + echo + done + esac +done diff --git a/s390utils.spec b/s390utils.spec index 62c5ae4..463d374 100644 --- a/s390utils.spec +++ b/s390utils.spec @@ -8,7 +8,7 @@ Name: s390utils Summary: Utilities and daemons for IBM System/z Group: System Environment/Base Version: 1.16.0 -Release: 7%{?dist} +Release: 8%{?dist} Epoch: 2 License: GPLv2 and GPLv2+ and CPL Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) @@ -38,6 +38,7 @@ Source17: ccw.udev Source18: cpuplugd.initd Source19: mon_statd.initd Source20: 40-z90crypt.rules +Source21: normalize_dasd_arg Patch1: s390-tools-1.16.0-fedora.patch @@ -172,6 +173,7 @@ install -p -m 644 %{SOURCE2} $RPM_BUILD_ROOT%{_sysconfdir}/profile.d install -p -m 644 %{SOURCE3} $RPM_BUILD_ROOT%{_sysconfdir}/profile.d install -p -m 755 %{SOURCE5} $RPM_BUILD_ROOT/sbin install -p -m 755 %{SOURCE13} $RPM_BUILD_ROOT/sbin +install -p -m 755 %{SOURCE21} $RPM_BUILD_ROOT/sbin install -p -m 644 %{SOURCE7} $RPM_BUILD_ROOT%{_sysconfdir}/udev/rules.d/56-zfcp.rules install -p -m 644 %{SOURCE12} $RPM_BUILD_ROOT%{_sysconfdir}/udev/rules.d/56-dasd.rules @@ -528,6 +530,7 @@ fi /sbin/device_cio_free /sbin/zfcp_cio_free /sbin/znet_cio_free +/sbin/normalize_dasd_arg /lib/systemd/system/device_cio_free.service %{_sysconfdir}/systemd/system/sysinit.target.wants/device_cio_free.service /lib/udev/ccw_init @@ -864,6 +867,9 @@ User-space development files for the s390/s390x architecture. %changelog +* Wed May 23 2012 Dan Horák 2:1.16.0-8 +- add normalize_dasd_arg script (#823078) + * Mon May 14 2012 Dan Horák 2:1.16.0-7 - ethtool is required by lsqeth (#821421)