Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:13.1:Update
s390-tools
s390-tools-sles11sp3-chccwdev_safe_offline.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File s390-tools-sles11sp3-chccwdev_safe_offline.patch of Package s390-tools
Subject: [PATCH] [FEAT LS1215] dasd: add safe offline interface From: Stefan Haberland <stefan.haberland@de.ibm.com> Summary: dasd: add safe offline interface Description: The regular behavior of the DASD device driver when setting a device offline is to return all outstanding I/O as failed. This behavior is different from that of other System z operating systems and may lead to unexpected data loss. Adding an explicit 'safe' offline function will allow customers to use DASDs in the way they expect them to work. Upstream-ID: - Problem-ID: LS1215 Signed-off-by: Stefan Haberland <stefan.haberland@de.ibm.com> --- zconf/chccwdev | 92 ++++++++++++++++++++++++++++++++++++++----------------- zconf/chccwdev.8 | 32 ++++++++++++++----- 2 files changed, 88 insertions(+), 36 deletions(-) --- a/zconf/chccwdev +++ b/zconf/chccwdev @@ -29,6 +29,8 @@ CMD=$(basename $0) MAX_RETRIES=5 CIO_SETTLE="/proc/cio_settle" +ONLINEATTR="online" +SYSPATH=NULL if [ "$(cat /proc/filesystems|grep sysfs)" = "" ]; then echo "ERROR: $CMD requires sysfs support!" >&2 @@ -52,6 +54,8 @@ function PrintUsage() { driver supports this. -d|--offline Tries to set the given device offline. + -s|--safeoffline + Tries to set the given device offline waiting for all outstanding I/O. May block forever. -v|--version Show tools and command version. @@ -68,6 +72,15 @@ function PrintVersion() EOD } +function CheckOnlineArg() +{ + if [ "$ONLINE" = $1 ] ;then + echo "$CMD: Incompatible argument list." >&2 + echo "Try '$CMD --help' for more information." >&2 + exit 1 + fi +} + function SetAttribute() { local NAME="$1" @@ -81,15 +94,24 @@ function SetAttribute() fi if [ "$NAME" = "online" ]; then if [ "$VAL" = "force" ]; then + CheckOnlineArg 0 ONLINE=1 FORCE="force" elif [ "$VAL" = "1" ]; then + CheckOnlineArg 0 ONLINE=1 else + CheckOnlineArg 1 ONLINE=0 fi ACTIONSET=true return + elif [ "$NAME" = "save_offline" ]; then + CheckOnlineArg 1 + ONLINE=0 + ACTIONSET=true + ONLINEATTR="safe_offline" + return fi while [ $CNT -lt $NUMATTR ]; do @@ -128,26 +150,25 @@ while [ $# -gt 0 ]; do exit 1 ;; -e|--online) - ONLINE=1 - ACTIONSET=true + SetAttribute "online" 1 ;; -f|--forceonline) - ONLINE=1 - FORCE=force - ACTIONSET=true + SetAttribute "online" "force" ;; -d|--offline) - ONLINE=0 - ACTIONSET=true + SetAttribute "online" 0 + ;; + -s|--safeoffline) + SetAttribute "save_offline" 0 ;; -v|--version) PrintVersion exit 0 ;; -*) - echo "$CMD: Invalid option $1" - echo "Try 'chccwdev --help' for more" \ - "information." + echo "$CMD: Invalid option $1" >&2 + echo "Try '$CMD --help' for more" \ + "information." >&2 exit 1 ;; *) @@ -203,6 +224,10 @@ BUSIDLIST=$( return 1 } function ExpandBusID(id) { + if (length(id) < 1) { + print "\"\" is not a valid bus ID." >err + return "" + } split(id, part, ".") if (3 in part) { css = part[1] @@ -359,6 +384,27 @@ function StoreAttribute() return 0 } +function PrintError() +{ + read ERROR + if [ -n "$ERROR" ] ;then + echo "Failed (${ERROR##*: })" >&2 + if [ ! -e $SYSPATH/driver ]; then + read CUTYPE 2>/dev/null < $SYSPATH/cutype + read DEVTYPE 2>/dev/null < $SYSPATH/devtype + if [ $? -ne 0 ] ;then + exit 1 + fi + if [[ $DEVTYPE == "n/a" ]] ;then + DEVTYPE="0000/00" + fi + echo "Note: No driver is attached to this device" \ + "(DevType:$DEVTYPE CU Type:$CUTYPE)." >&2 + fi + exit 1 + fi +} + SAVEDATTRS=("${ATTRVAL[@]}") for BUSID in $BUSIDLIST; do SYSPATH=$SYSFSDIR/bus/ccw/devices/$BUSID @@ -395,27 +441,17 @@ for BUSID in $BUSIDLIST; do else echo "Setting device $BUSID offline" fi + if [ ! -e $SYSPATH/$ONLINEATTR ]; then + echo "$ONLINEATTR attribute not available for" \ + " device[$BUSID]" >&2 + exit 1 + fi if [ "$FORCE" != "" ]; then - ERROR=$(echo $FORCE 2>&1 >$SYSPATH/online) + echo $FORCE 2>&1 >$SYSPATH/$ONLINEATTR | PrintError else - ERROR=$(echo $ONLINE 2>&1 >$SYSPATH/online) - fi - if [ $? -ne 0 ] ;then - echo "Failed (${ERROR##*: })" >&2 - if [ ! -e $SYSPATH/driver ]; then - read CUTYPE 2>/dev/null < $SYSPATH/cutype - read DEVTYPE 2>/dev/null < $SYSPATH/devtype - if [ $? -ne 0 ] ;then - exit 1 - fi - if [[ $DEVTYPE == "n/a" ]] ;then - DEVTYPE="0000/00" - fi - echo "Note: No driver is attached to this device" \ - "(DevType:$DEVTYPE CU Type:$CUTYPE)." >&2 - fi - exit 1 + echo $ONLINE 2>&1 > $SYSPATH/$ONLINEATTR | PrintError fi + # # Workaround for bad drivers which report success but # silently fail or have an asynchronous online processing. --- a/zconf/chccwdev.8 +++ b/zconf/chccwdev.8 @@ -11,7 +11,7 @@ chccwdev \- modify generic attributes of .B chccwdev .RB "[ (" -a .IB <name> = <value> -.RB "| " -e " | " -d " | " -f ") [...]]" +.RB "| " -e " | " -d " | " -s " | " -f ") [...]]" .br .I <range> .RI "[, " "<range>" " [...]]" @@ -28,7 +28,7 @@ special. If the same attribute is given more than one time the value that was set last will be used. This is also true (while not that obvious) when mixing the generic -.BR -a " and the " -e ", " -d " and " -f " arguments." +.BR -a " and the " -e ", " -d ", "-s" and " -f " arguments." .P All attributes will be set in the following order: .RS @@ -38,7 +38,8 @@ All attributes except online. If the dev error if the attribute doesn't exist. .TP 2. -Set the online attribute to the desired value ((forced) online or offline). +Set the online attribute to the desired value ((forced) online or +(safe) offline). .TP 3. Set all the attributes that havn't been set, yet. At this point invalid @@ -65,7 +66,7 @@ the attribute it will be read to check w .TP .BR -e | --online -Try to set the given range of devices online. +Try to set the specified devices offline. .TP .BR -f | --forceonline @@ -74,8 +75,15 @@ be used to bring it online regardless of .TP .BR -d | --offline -Try to set the given range of devices offline. The online and offline -option are exclusive. +Try to set the specified devices offline. The --online, --forceonline, +--offline, and --safeoffline options are mutually exclusive. + +.TP +.BR -s |--safeoffline +DASD only: For each specified device, wait until all outstanding I/O +requests have completed, and then try to set the device offline. The +--online, --forceonline, --offline, and --safeoffline options are +mutually exclusive. .TP \fB<range>\fR = <bus ID>\fB[-\fR<bus ID>\fB]\fR @@ -89,8 +97,9 @@ Example: "0192" becomes "0.0.0192". .SH EXAMPLES \fBchccwdev --online 0.0.0192,0.0.0195-0.0.0198\fR .RS -Will try to set the devices with bus ID 0.0.0192, 0.0.0195, 0.0.0196, -0.0.0197 and 0.0.0198 online +After completing all outstanding I/O requests for the devices with bus +ID 0.0.0192, 0.0.0195, 0.0.0196, 0.0.0197 and 0.0.0198, tries to set +the device offline. .RE .P .B chccwdev --attribute readonly=1 --attribute online=1 0.0.0192 @@ -105,6 +114,13 @@ Set the cmb_enable attribute of the devi 0.0.0198 to one. This would for example activate the usage of the channel measurement block facility. .RE +.P +.B chccwdev --safeoffline 0.0.0192,0.0.0195-0.0.0198 +.RS +Will try to set the devices with bus ID 0.0.0192, 0.0.0195, +0.0.0196, 0.0.0197 and 0.0.0198 offline and finish all outstanding I/O +requests before. +.RE .SH AUTHOR .nf
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor