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