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