1*44704f69SBart Van Assche#! /bin/bash 2*44704f69SBart Van Assche############################################################################### 3*44704f69SBart Van Assche# Conveniently create and set scsi logging level, show SCSI_LOG fields in human 4*44704f69SBart Van Assche# readable form. 5*44704f69SBart Van Assche# 6*44704f69SBart Van Assche# (C) Copyright IBM Corp. 2006 7*44704f69SBart Van Assche# 8*44704f69SBart Van Assche# Modified by D. Gilbert to replace the use of sysctl [20080218] 9*44704f69SBart Van Assche# Lat change: D. Gilbert 20150219 10*44704f69SBart Van Assche############################################################################### 11*44704f69SBart Van Assche 12*44704f69SBart Van Assche 13*44704f69SBart Van AsscheREVISION="1.0" 14*44704f69SBart Van AsscheSCRIPTNAME="scsi_logging_level" 15*44704f69SBart Van Assche 16*44704f69SBart Van Asschedeclare -i LOG_ERROR=0 17*44704f69SBart Van Asschedeclare -i LOG_TIMEOUT=0 18*44704f69SBart Van Asschedeclare -i LOG_SCAN=0 19*44704f69SBart Van Asschedeclare -i LOG_MLQUEUE=0 20*44704f69SBart Van Asschedeclare -i LOG_MLCOMPLETE=0 21*44704f69SBart Van Asschedeclare -i LOG_LLQUEUE=0 22*44704f69SBart Van Asschedeclare -i LOG_LLCOMPLETE=0 23*44704f69SBart Van Asschedeclare -i LOG_HLQUEUE=0 24*44704f69SBart Van Asschedeclare -i LOG_HLCOMPLETE=0 25*44704f69SBart Van Asschedeclare -i LOG_IOCTL=0 26*44704f69SBart Van Assche 27*44704f69SBart Van Asschedeclare -i LEVEL=0 28*44704f69SBart Van Assche 29*44704f69SBart Van AsscheSET=0 30*44704f69SBart Van AsscheGET=0 31*44704f69SBart Van AsscheCREATE=0 32*44704f69SBart Van Assche 33*44704f69SBart Van AsscheOPTS=$(getopt -o hvcgsa:E:T:S:I:M:L:H: --long \ 34*44704f69SBart Van Asschehelp,version,create,get,set,all:,error:,timeout:,scan:,ioctl:,\ 35*44704f69SBart Van Asschemidlevel:,mlqueue:,mlcomplete:,lowlevel:,llqueue:,llcomplete:,\ 36*44704f69SBart Van Asschehighlevel:,hlqueue:,hlcomplete: -n \'$SCRIPTNAME\' -- "$@") 37*44704f69SBart Van Asscheeval set -- "$OPTS" 38*44704f69SBart Van Assche 39*44704f69SBart Van Assche# print version info 40*44704f69SBart Van Asscheprintversion() 41*44704f69SBart Van Assche{ 42*44704f69SBart Van Assche cat <<EOF 43*44704f69SBart Van Assche%S390_TOOLS_VERSION% ($SCRIPTNAME $REVISION) 44*44704f69SBart Van Assche(C) Copyright IBM Corp. 2006 45*44704f69SBart Van AsscheEOF 46*44704f69SBart Van Assche} 47*44704f69SBart Van Assche 48*44704f69SBart Van Assche# print usage and help 49*44704f69SBart Van Asscheprinthelp() 50*44704f69SBart Van Assche{ 51*44704f69SBart Van Assche cat <<EOF 52*44704f69SBart Van AsscheUsage: $SCRIPTNAME [OPTIONS] 53*44704f69SBart Van Assche 54*44704f69SBart Van AsscheCreate, get or set scsi logging level. 55*44704f69SBart Van Assche 56*44704f69SBart Van AsscheOptions: 57*44704f69SBart Van Assche 58*44704f69SBart Van Assche -h, --help print this help 59*44704f69SBart Van Assche -v, --version print version information 60*44704f69SBart Van Assche -s, --set create and set logging level as specified on 61*44704f69SBart Van Assche command line 62*44704f69SBart Van Assche -g, --get get current logging level and display it 63*44704f69SBart Van Assche -c, --create create logging level as specified on command line 64*44704f69SBart Van Assche -a, --all specify value for all SCSI_LOG fields 65*44704f69SBart Van Assche -E, --error specify SCSI_LOG_ERROR 66*44704f69SBart Van Assche -T, --timeout specify SCSI_LOG_TIMEOUT 67*44704f69SBart Van Assche -S, --scan specify SCSI_LOG_SCAN 68*44704f69SBart Van Assche -M, --midlevel specify SCSI_LOG_MLQUEUE and SCSI_LOG_MLCOMPLETE 69*44704f69SBart Van Assche --mlqueue specify SCSI_LOG_MLQUEUE 70*44704f69SBart Van Assche --mlcomplete specify SCSI_LOG_MLCOMPLETE 71*44704f69SBart Van Assche -L, --lowlevel specify SCSI_LOG_LLQUEUE and SCSI_LOG_LLCOMPLETE 72*44704f69SBart Van Assche --llqueue specify SCSI_LOG_LLQUEUE 73*44704f69SBart Van Assche --llcomplete specify SCSI_LOG_LLCOMPLETE 74*44704f69SBart Van Assche -H, --highlevel specify SCSI_LOG_HLQUEUE and SCSI_LOG_HLCOMPLETE 75*44704f69SBart Van Assche --hlqueue specify SCSI_LOG_HLQUEUE 76*44704f69SBart Van Assche --hlcomplete specify SCSI_LOG_HLCOMPLETE 77*44704f69SBart Van Assche -I, --ioctl specify SCSI_LOG_IOCTL 78*44704f69SBart Van Assche 79*44704f69SBart Van AsscheExactly one of the options "-c", "-g" and "-s" has to be specified. 80*44704f69SBart Van AsscheValid values for SCSI_LOG fields are integers from 0 to 7. 81*44704f69SBart Van Assche 82*44704f69SBart Van AsscheNote: Several SCSI_LOG fields can be specified using several options. 83*44704f69SBart Van AsscheWhen multiple options specify same SCSI_LOG field the most specific 84*44704f69SBart Van Asscheoption has precedence. 85*44704f69SBart Van Assche 86*44704f69SBart Van AsscheExample: "scsi_logging_level --hlqueue 3 --highlevel 2 --all 1 -s" sets 87*44704f69SBart Van AsscheSCSI_LOG_HLQUEUE=3, SCSI_LOG_HLCOMPLETE=2 and assigns all other SCSI_LOG 88*44704f69SBart Van Asschefields the value 1. 89*44704f69SBart Van AsscheEOF 90*44704f69SBart Van Assche} 91*44704f69SBart Van Assche 92*44704f69SBart Van Asschecheck_level() 93*44704f69SBart Van Assche{ 94*44704f69SBart Van Assche num=$(($1)) 95*44704f69SBart Van Assche if [ $num != "$1" ] ; then 96*44704f69SBart Van Assche invalid_cmdline "log level '$1' not a number" 97*44704f69SBart Van Assche elif [ $num -lt 0 ] || [ $num -gt 7 ] ; then 98*44704f69SBart Van Assche invalid_cmdline "log level '$1' out of range, expect '0' to '7'" 99*44704f69SBart Van Assche fi 100*44704f69SBart Van Assche} 101*44704f69SBart Van Assche 102*44704f69SBart Van Assche# check cmd line arguments 103*44704f69SBart Van Asschecheck_cmdline() 104*44704f69SBart Van Assche{ 105*44704f69SBart Van Assche while true ; do 106*44704f69SBart Van Assche case "$1" in 107*44704f69SBart Van Assche -a|--all) _ALL="$2"; check_level "$2" 108*44704f69SBart Van Assche shift 2;; 109*44704f69SBart Van Assche -c|--create) CREATE=1; 110*44704f69SBart Van Assche shift 1;; 111*44704f69SBart Van Assche -g|--get) GET=1 112*44704f69SBart Van Assche shift 1;; 113*44704f69SBart Van Assche -h|--help) printhelp 114*44704f69SBart Van Assche exit 0;; 115*44704f69SBart Van Assche -s|--set) SET=1 116*44704f69SBart Van Assche shift 1;; 117*44704f69SBart Van Assche -v|--version) printversion 118*44704f69SBart Van Assche exit 0;; 119*44704f69SBart Van Assche -E|--error) _ERROR="$2"; check_level "$2" 120*44704f69SBart Van Assche shift 2;; 121*44704f69SBart Van Assche -T|--timeout) _TIMEOUT="$2"; check_level "$2" 122*44704f69SBart Van Assche shift 2;; 123*44704f69SBart Van Assche -S|--scan) _SCAN="$2"; check_level "$2" 124*44704f69SBart Van Assche shift 2;; 125*44704f69SBart Van Assche -M|--midlevel) _ML="$2"; check_level "$2" 126*44704f69SBart Van Assche shift 2;; 127*44704f69SBart Van Assche --mlqueue) _MLQUEUE="$2"; check_level "$2" 128*44704f69SBart Van Assche shift 2;; 129*44704f69SBart Van Assche --mlcomplete) _MLCOMPLETE="$2"; check_level "$2" 130*44704f69SBart Van Assche shift 2;; 131*44704f69SBart Van Assche -L|--lowlevel) _LL="$2"; check_level "$2" 132*44704f69SBart Van Assche shift 2;; 133*44704f69SBart Van Assche --llqueue) _LLQUEUE="$2"; check_level "$2" 134*44704f69SBart Van Assche shift 2;; 135*44704f69SBart Van Assche --llcomplete) _LLCOMPLETE="$2"; check_level "$2" 136*44704f69SBart Van Assche shift 2;; 137*44704f69SBart Van Assche -H|--highlevel) _HL="$2"; check_level "$2" 138*44704f69SBart Van Assche shift 2;; 139*44704f69SBart Van Assche --hlqueue) _HLQUEUE="$2"; check_level "$2" 140*44704f69SBart Van Assche shift 2;; 141*44704f69SBart Van Assche --hlcomplete) _HLCOMPLETE="$2"; check_level "$2" 142*44704f69SBart Van Assche shift 2;; 143*44704f69SBart Van Assche -I|--ioctl) _IOCTL="$2"; check_level "$2" 144*44704f69SBart Van Assche shift 2;; 145*44704f69SBart Van Assche --) shift; break;; 146*44704f69SBart Van Assche *) echo "Internal error!" ; exit 1;; 147*44704f69SBart Van Assche esac 148*44704f69SBart Van Assche done 149*44704f69SBart Van Assche 150*44704f69SBart Van Assche if [ -n "$*" ] 151*44704f69SBart Van Assche then 152*44704f69SBart Van Assche invalid_cmdline invalid parameter "$@" 153*44704f69SBart Van Assche fi 154*44704f69SBart Van Assche 155*44704f69SBart Van Assche if [ $GET = "1" -a $SET = "1" ] 156*44704f69SBart Van Assche then 157*44704f69SBart Van Assche invalid_cmdline options \'-c\', \'-g\' and \'-s\' are mutual exclusive 158*44704f69SBart Van Assche elif [ $GET = "1" -a $CREATE = "1" ] 159*44704f69SBart Van Assche then 160*44704f69SBart Van Assche invalid_cmdline options \'-c\', \'-g\' and \'-s\' are mutual exclusive 161*44704f69SBart Van Assche elif [ $SET = "1" -a $CREATE = "1" ] 162*44704f69SBart Van Assche then 163*44704f69SBart Van Assche invalid_cmdline options \'-c\', \'-g\' and \'-s\' are mutual exclusive 164*44704f69SBart Van Assche fi 165*44704f69SBart Van Assche 166*44704f69SBart Van Assche LOG_ERROR=${_ERROR:-${_ALL:-0}} 167*44704f69SBart Van Assche LOG_TIMEOUT=${_TIMEOUT:-${_ALL:-0}} 168*44704f69SBart Van Assche LOG_SCAN=${_SCAN:-${_ALL:-0}} 169*44704f69SBart Van Assche LOG_MLQUEUE=${_MLQUEUE:-${_ML:-${_ALL:-0}}} 170*44704f69SBart Van Assche LOG_MLCOMPLETE=${_MLCOMPLETE:-${_ML:-${_ALL:-0}}} 171*44704f69SBart Van Assche LOG_LLQUEUE=${_LLQUEUE:-${_LL:-${_ALL:-0}}} 172*44704f69SBart Van Assche LOG_LLCOMPLETE=${_LLCOMPLETE:-${_LL:-${_ALL:-0}}} 173*44704f69SBart Van Assche LOG_HLQUEUE=${_HLQUEUE:-${_HL:-${_ALL:-0}}} 174*44704f69SBart Van Assche LOG_HLCOMPLETE=${_HLCOMPLETE:-${_HL:-${_ALL:-0}}} 175*44704f69SBart Van Assche LOG_IOCTL=${_IOCTL:-${_ALL:-0}} 176*44704f69SBart Van Assche} 177*44704f69SBart Van Assche 178*44704f69SBart Van Asscheinvalid_cmdline() 179*44704f69SBart Van Assche{ 180*44704f69SBart Van Assche echo "$SCRIPTNAME: $*" 181*44704f69SBart Van Assche echo "$SCRIPTNAME: Try '$SCRIPTNAME --help' for more information." 182*44704f69SBart Van Assche exit 1 183*44704f69SBart Van Assche} 184*44704f69SBart Van Assche 185*44704f69SBart Van Asscheget_logging_level() 186*44704f69SBart Van Assche{ 187*44704f69SBart Van Assche echo "Current scsi logging level:" 188*44704f69SBart Van Assche# LEVEL=$(sysctl -n dev.scsi.logging_level) 189*44704f69SBart Van Assche LEVEL=$(cat /proc/sys/dev/scsi/logging_level) 190*44704f69SBart Van Assche if [ $? != 0 ] 191*44704f69SBart Van Assche then 192*44704f69SBart Van Assche echo "$SCRIPTNAME: could not read scsi logging level" \ 193*44704f69SBart Van Assche "(kernel probably without SCSI_LOGGING support)" 194*44704f69SBart Van Assche exit 1 195*44704f69SBart Van Assche fi 196*44704f69SBart Van Assche} 197*44704f69SBart Van Assche 198*44704f69SBart Van Asscheshow_logging_level() 199*44704f69SBart Van Assche{ 200*44704f69SBart Van Assche echo "/proc/sys/dev/scsi/logging_level = $LEVEL" 201*44704f69SBart Van Assche 202*44704f69SBart Van Assche LOG_ERROR=$((LEVEL & 7)); LEVEL=$((LEVEL>>3)) 203*44704f69SBart Van Assche LOG_TIMEOUT=$((LEVEL & 7)); LEVEL=$((LEVEL>>3)) 204*44704f69SBart Van Assche LOG_SCAN=$((LEVEL & 7)); LEVEL=$((LEVEL>>3)) 205*44704f69SBart Van Assche LOG_MLQUEUE=$((LEVEL & 7)); LEVEL=$((LEVEL>>3)) 206*44704f69SBart Van Assche LOG_MLCOMPLETE=$((LEVEL & 7)); LEVEL=$((LEVEL>>3)) 207*44704f69SBart Van Assche LOG_LLQUEUE=$((LEVEL & 7)); LEVEL=$((LEVEL>>3)) 208*44704f69SBart Van Assche LOG_LLCOMPLETE=$((LEVEL & 7)); LEVEL=$((LEVEL>>3)) 209*44704f69SBart Van Assche LOG_HLQUEUE=$((LEVEL & 7)); LEVEL=$((LEVEL>>3)); 210*44704f69SBart Van Assche LOG_HLCOMPLETE=$((LEVEL & 7)); LEVEL=$((LEVEL>>3)); 211*44704f69SBart Van Assche LOG_IOCTL=$((LEVEL & 7)) 212*44704f69SBart Van Assche 213*44704f69SBart Van Assche echo "SCSI_LOG_ERROR=$LOG_ERROR" 214*44704f69SBart Van Assche echo "SCSI_LOG_TIMEOUT=$LOG_TIMEOUT" 215*44704f69SBart Van Assche echo "SCSI_LOG_SCAN=$LOG_SCAN" 216*44704f69SBart Van Assche echo "SCSI_LOG_MLQUEUE=$LOG_MLQUEUE" 217*44704f69SBart Van Assche echo "SCSI_LOG_MLCOMPLETE=$LOG_MLCOMPLETE" 218*44704f69SBart Van Assche echo "SCSI_LOG_LLQUEUE=$LOG_LLQUEUE" 219*44704f69SBart Van Assche echo "SCSI_LOG_LLCOMPLETE=$LOG_LLCOMPLETE" 220*44704f69SBart Van Assche echo "SCSI_LOG_HLQUEUE=$LOG_HLQUEUE" 221*44704f69SBart Van Assche echo "SCSI_LOG_HLCOMPLETE=$LOG_HLCOMPLETE" 222*44704f69SBart Van Assche echo "SCSI_LOG_IOCTL=$LOG_IOCTL" 223*44704f69SBart Van Assche} 224*44704f69SBart Van Assche 225*44704f69SBart Van Asscheset_logging_level() 226*44704f69SBart Van Assche{ 227*44704f69SBart Van Assche echo "New scsi logging level:" 228*44704f69SBart Van Assche# sysctl -q -w dev.scsi.logging_level=$LEVEL 229*44704f69SBart Van Assche echo $LEVEL > /proc/sys/dev/scsi/logging_level 230*44704f69SBart Van Assche if [ $? != 0 ] 231*44704f69SBart Van Assche then 232*44704f69SBart Van Assche echo "$SCRIPTNAME: could not write scsi logging level $LEVEL" 233*44704f69SBart Van Assche echo " kernel does not have SCSI_LOGGING support or needs superuser" 234*44704f69SBart Van Assche exit 1 235*44704f69SBart Van Assche fi 236*44704f69SBart Van Assche} 237*44704f69SBart Van Asschecreate_logging_level() 238*44704f69SBart Van Assche{ 239*44704f69SBart Van Assche LEVEL=$((LOG_IOCTL & 7)); LEVEL=$((LEVEL<<3)) 240*44704f69SBart Van Assche LEVEL=$((LEVEL|(LOG_HLCOMPLETE & 7))); LEVEL=$((LEVEL<<3)) 241*44704f69SBart Van Assche LEVEL=$((LEVEL|(LOG_HLQUEUE & 7))); LEVEL=$((LEVEL<<3)) 242*44704f69SBart Van Assche LEVEL=$((LEVEL|(LOG_LLCOMPLETE & 7))); LEVEL=$((LEVEL<<3)) 243*44704f69SBart Van Assche LEVEL=$((LEVEL|(LOG_LLQUEUE & 7))); LEVEL=$((LEVEL<<3)) 244*44704f69SBart Van Assche LEVEL=$((LEVEL|(LOG_MLCOMPLETE & 7))); LEVEL=$((LEVEL<<3)) 245*44704f69SBart Van Assche LEVEL=$((LEVEL|(LOG_MLQUEUE & 7))); LEVEL=$((LEVEL<<3)) 246*44704f69SBart Van Assche LEVEL=$((LEVEL|(LOG_SCAN & 7))); LEVEL=$((LEVEL<<3)) 247*44704f69SBart Van Assche LEVEL=$((LEVEL|(LOG_TIMEOUT & 7))); LEVEL=$((LEVEL<<3)) 248*44704f69SBart Van Assche LEVEL=$((LEVEL|(LOG_ERROR & 7))) 249*44704f69SBart Van Assche} 250*44704f69SBart Van Assche 251*44704f69SBart Van Asschecheck_cmdline "$@" 252*44704f69SBart Van Assche 253*44704f69SBart Van Asscheif [ $SET = "1" ] 254*44704f69SBart Van Asschethen 255*44704f69SBart Van Assche create_logging_level 256*44704f69SBart Van Assche set_logging_level 257*44704f69SBart Van Assche show_logging_level 258*44704f69SBart Van Asscheelif [ $GET = "1" ] 259*44704f69SBart Van Asschethen 260*44704f69SBart Van Assche get_logging_level 261*44704f69SBart Van Assche show_logging_level 262*44704f69SBart Van Asscheelif [ $CREATE = "1" ] 263*44704f69SBart Van Asschethen 264*44704f69SBart Van Assche create_logging_level 265*44704f69SBart Van Assche show_logging_level 266*44704f69SBart Van Asscheelse 267*44704f69SBart Van Assche invalid_cmdline missing option \'-g\', \'-s\' or \'-c\' 268*44704f69SBart Van Asschefi 269