xref: /aosp_15_r20/external/sg3_utils/scripts/scsi_logging_level (revision 44704f698541f6367e81f991ef8bb54ccbf3fc18)
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