Files
scst/scripts/run-regression-tests
T
Gleb Chesnokov 114d44cd51 scripts/run-regression-tests: Fix failure handling
Propagate patch, source-copy, and patch-generation failures instead
of continuing with incomplete regression inputs. Stop immediately
when the output directory cannot be created.

Also correct the documented options and keep Debian package output
in its intended log file.
2026-08-21 19:58:59 +03:00

746 lines
22 KiB
Bash
Executable File

#!/bin/bash
############################################################################
#
# Script for running those SCST regression tests that can be run automatically.
#
# Copyright (C) 2008-2020 Bart Van Assche <bvanassche@acm.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation, version 2
# of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
############################################################################
############################################################################
# This script performs the following actions:
# - Creates a temporary directory for storing the output of the regression
# tests. No existing files are modified by this script.
# - Verifies whether the top-level *.patch files apply cleanly to the SCST
# tree.
# - Duplicates the entire source tree to the temporary directory and
# compiles the SCST source code.
# - Duplicates the entire source tree to the temporary directory, runs
# 'make 2release' and again compiles the SCST source code.
# - Checks whether the specified kernel version is present
# in the directory specified through option -c.
# - If the source code of the specified kernel version is not present,
# download it.
# - Convert the SCST source code into a kernel patch.
# - Extract the kernel sources.
# - Run checkpatch on the SCST kernel patch.
# - Apply the SCST kernel patch to the kernel tree.
# - Run 'make allmodconfig'.
# - Run the sparse source code checker on the SCST directory.
# - Run 'make headers_check'.
# - Compile the kernel tree.
# - Run 'make checkstack'.
# - Run 'make namespacecheck'.
# - Run 'make htmldocs'.
#
# Note: the results of the individual steps are not verified by this script
# -- the output generated by the individual steps has to be verified by
# reviewing the output files written into the temporary directory.
############################################################################
########################
# Function definitions #
########################
# shellcheck source=./kernel-functions
source "$(dirname "$0")/kernel-functions"
function usage {
echo "Usage: $0 [-c <dir>] [-d <dir>] [-h] [-j <jobs>] [-k] [-l]" \
"[-p] [-q] <kver1> <kver2> ..."
echo " -c - cache directory for Linux kernel tarballs."
echo " -d - directory for temporary regression test files."
echo " -h - display this help information."
echo " -j - number of jobs that 'make' should run simultaneously."
echo " -k - remove temporary files before exiting."
echo " -l - skip local SCST compilation."
echo " -p - generate separate kernel patches."
echo " -q - download kernel sources silently."
echo " <kver1> <kver2> ... - kernel versions to test."
}
# Test whether the *.patch files in the SCST top-level directory apply cleanly
# to the SCST tree. Does not modify any files nor produce any output files.
function test_scst_tree_patches {
local rc=0
echo "Testing whether the SCST patches apply cleanly to the SCST tree ..."
for p in *.patch srpt/patches/scst*.patch
do
if [ -e "$p" ] && ! patch -p0 -f --dry-run -s <"$p" &>/dev/null; then
echo "ERROR: patch $p does not apply cleanly."
rc=1
fi
done
if [ "${rc}" = 0 ]; then
echo "OK"
fi
return "${rc}"
}
# Copy the entire SCST source code tree from "$1" into the current directory.
# Only copy those files which are administered by Subversion.
function duplicate_scst_source_tree {
if [ -e "$1/AskingQuestions" ]; then
( set -o pipefail
"${scriptsdir}"/list-source-files "$1" |
tar -C "$1" --files-from=- -c -f - |
tar -x -f -
)
else
return 1
fi
}
function make_rpm {
local outputfile t
for t in rpm scst-dkms-rpm; do
outputfile="${outputdir}/make-${t}-output.txt"
echo "Testing whether 'make ${t}' works fine ..."
if make ${t} > "${outputfile}" 2>&1; then
echo "OK"
else
echo "FAILED"
fi
done
}
function make_dpkg {
local outputfile="${outputdir}/make-dpkg-output.txt"
echo "Testing whether 'make dpkg' works fine ..."
if make dpkg > "${outputfile}" 2>&1; then
echo "OK"
else
echo "FAILED"
fi
}
function compile_scst {
(
for d in scst iscsi-scst qla2x00t qla2x00t-32gbit srpt scst_local fcst usr; do
if [[ $d = qla2x00t || $d = qla2x00t-32gbit ]]; then
BUILD_2X_MODULE=y CONFIG_SCSI_QLA_FC=y CONFIG_SCSI_QLA2XXX_TARGET=y \
make -j"$(nproc)" -C "$d" || return $?
else
make -j"$(nproc)" -C "$d" || return $?
fi
done
)
}
# Compile the unpatched SCST source code.
function compile_scst_unpatched {
local scst="$PWD"
local outputfile="${outputdir}/compilation-output-unpatched.txt"
local workingdirectory="${outputdir}/scst-unpatched"
echo "Testing whether the SCST tree compiles fine ..."
(
if mkdir -p "${workingdirectory}" \
&& cd "${workingdirectory}" \
&& duplicate_scst_source_tree "${scst}" \
&& compile_scst &> "${outputfile}"
then
echo "OK"
else
echo "FAILED"
fi
)
}
# Compile the unpatched SCST source code without DLM.
function compile_scst_no_dlm {
local scst="$PWD"
local outputfile="${outputdir}/compilation-output-no-dlm.txt"
local workingdirectory="${outputdir}/scst-no-dlm"
echo "Testing whether the SCST tree compiles fine without DLM support ..."
(
if mkdir -p "${workingdirectory}" \
&& cd "${workingdirectory}" \
&& duplicate_scst_source_tree "${scst}" \
&& CONFIG_SCST_NO_DLM=y compile_scst &> "${outputfile}"
then
echo "OK"
else
echo "FAILED"
fi
)
}
# Test out-of-tree compilation against the kernel header files in
# /lib/modules/$(uname -r)/build.
function compile_scst_patched {
local scst="$PWD"
local outputfile="${outputdir}/compilation-output-$1.txt"
local workingdirectory="${outputdir}/scst-$1"
echo "Testing whether the $1 SCST tree compiles fine ..."
(
if mkdir -p "${workingdirectory}" \
&& cd "${workingdirectory}" \
&& duplicate_scst_source_tree "${scst}" \
&& make -s "$1" \
&& compile_scst &> "${outputfile}"
then
echo "OK"
else
echo "FAILED"
fi
)
}
# Generate a kernel patch from the SCST source tree for kernel version $1
# and with generate-kernel-patch options $2. $1 may be a
# ${kver}^${distro}^${release} triplet.
function generate_kernel_patch {
local kver
local patchfile="${outputdir}/scst-${1/^*}-kernel.patch"
local patchfile_m="${outputdir}/scst-${1/^*}-kernel-matching-line-numbers.patch"
local driver_options=""
kver="$(kernel_version "${1/^*}")"
driver_options=(-l)
"${scriptsdir}"/generate-kernel-patch "${driver_options[@]}" "$2" "$1" \
> "${patchfile}" || return $?
"${scriptsdir}"/generate-kernel-patch "${driver_options[@]}" -n "$2" "$1" \
> "${patchfile_m}" || return $?
"${scriptsdir}"/generate-kernel-patch "${driver_options[@]}" -p "${outputdir}/${patchdir}" "$2" "$1"
}
# Run checkpatch on the generated kernel patch. Assumes that there is a
# vanilla kernel tree present in directory "${outputdir}/linux-$1", and leaves
# this kernel tree clean.
function run_checkpatch {
local kver plevel errors warnings
local outputfile="${outputdir}/checkpatch-$1-output.txt"
local patchfile="${outputdir}/scst-$1-kernel.patch"
kver="$(kernel_version "$1")"
plevel="$(patchlevel "$1")"
if [ -e "${outputdir}/linux-$1/scripts/checkpatch.pl" ]; then
if [ "${multiple_patches}" = "false" ]; then
echo "Running checkpatch on the SCST kernel patch ..."
( cd "${outputdir}/linux-$1" \
&& scripts/checkpatch.pl --no-tree --no-signoff --strict - < "${patchfile}" &> "${outputfile}")
else
echo "Running checkpatch on the SCST kernel patches ..."
rm -f "${outputfile}"
( cd "${outputdir}/linux-$1" \
&& for p in "${outputdir}/${patchdir}"/*
do
echo "==== $p" >>"${outputfile}"
scripts/checkpatch.pl --no-tree --no-signoff --strict - < "$p" >> "${outputfile}" 2>&1
done
)
fi
errors=$(grep -c '^ERROR' "${outputfile}")
warnings=$(grep -c '^WARNING' "${outputfile}")
checks=$(grep -c '^CHECK' "${outputfile}")
echo "${errors} errors / ${warnings} warnings / ${checks} checks."
grep -E '^WARNING|^ERROR|^CHECK' "${outputfile}" |
sort |
grep -v 'WARNING: missing space after return type' |
sed 's/^CHECK: Avoid CamelCase:.*/CHECK: Avoid CamelCase/' |
uniq -c
else
echo "Skipping checkpatch step for kernel $1."
fi
return 0
}
function patch_and_configure_kernel {
local kver
kver="$(kernel_version "$1")"
local patchfile="${outputdir}/scst-$1-kernel-matching-line-numbers.patch"
local patchoutput="${outputdir}/patch-command-output-$1.txt"
local configureoutput="${outputdir}/configure-output.txt"
local disable=" \
CONFIG_BINARY_PRINTF \
CONFIG_BLK_DEV_IO_TRACE \
CONFIG_BRANCH_PROFILE_NONE \
CONFIG_CONTEXT_SWITCH_TRACER \
CONFIG_CTF \
CONFIG_DEBUG_SECTION_MISMATCH \
CONFIG_DEBUG_STRICT_USER_COPY_CHECKS \
CONFIG_DTRACE \
CONFIG_DT_CORE \
CONFIG_DYNAMIC_FTRACE \
CONFIG_EVENT_TRACE_TEST_SYSCALLS \
CONFIG_FTRACE \
CONFIG_FTRACE_MCOUNT_RECORD \
CONFIG_FTRACE_NMI_ENTER \
CONFIG_FTRACE_SELFTEST \
CONFIG_FTRACE_STARTUP_TEST \
CONFIG_FTRACE_SYSCALLS \
CONFIG_FUNCTION_GRAPH_TRACER \
CONFIG_FUNCTION_PROFILER \
CONFIG_FUNCTION_TRACER \
CONFIG_GENERIC_TRACER \
CONFIG_HAVE_FTRACE_NMI_ENTER \
CONFIG_HEADERS_CHECK \
CONFIG_IRQSOFF_TRACER \
CONFIG_IWLWIFI_DEVICE_TRACING \
CONFIG_IWM_TRACING \
CONFIG_KALLMODSYMS \
CONFIG_KCOV \
CONFIG_KVM_MMU_AUDIT \
CONFIG_MAC80211_DRIVER_API_TRACER \
CONFIG_MMIOTRACE \
CONFIG_NET_DROP_MONITOR \
CONFIG_NOP_TRACER \
CONFIG_RETPOLINE \
CONFIG_RH_KABI_SIZE_ALIGN_CHECKS \
CONFIG_UEK_KABI_SIZE_ALIGN_CHECKS \
CONFIG_SCHED_TRACER \
CONFIG_SECURITY_SELINUX \
CONFIG_STACK_TRACER \
CONFIG_STACK_VALIDATION \
CONFIG_TARGET_CORE \
CONFIG_TRACEPOINTS \
CONFIG_TRACER_MAX_TRACE \
CONFIG_TRACE_BRANCH_PROFILING \
CONFIG_TRACING \
CONFIG_UNWINDER_ORC \
CONFIG_X86_32 \
CONFIG_X86_X32 \
CONFIG_X86_KERNEL_IBT \
CONFIG_LTO_CLANG \
"
local enable="CONFIG_UNWINDER_FRAME_POINTER"
# SCST does not need event tracing on supported kernels
disable="$disable CONFIG_EVENT_TRACING"
echo "Patching and configuring kernel ..."
if [ "$ipv6" = "false" ]; then
disable="$disable CONFIG_IPV6"
fi
(
cd "${outputdir}/linux-$1" &&
if [ "${multiple_patches}" = "false" ]; then
if ! patch -p1 -f -s <"${patchfile}" >"${patchoutput}"; then
echo "Error: applying ${patchfile} failed."
exit 1
fi
else
rm -f "${patchoutput}"
for p in "${outputdir}/${patchdir}"/*; do
echo "==== $p" >>"${patchoutput}"
patch -p1 -f -s <"${p}" >>"${patchoutput}" 2>&1 ||
exit $?
done
fi &&
make -s allmodconfig &>"${outputdir}/make-config-output.txt" &&
for c in $disable; do sed -i.tmp "s/^$c=[ym]\$/$c=n/" .config; done &&
for c in $enable; do sed -i.tmp "s/^\(# \)*$c\(=.*\| is not set\)\$/$c=y/" .config; done &&
make -s oldconfig </dev/null &>"${configureoutput}" &&
for c in $enable; do
grep -q "^$c=[ym]" .config ||
echo "Enabling $c failed."
done
)
}
# Patches and compiles a kernel tree. Assumes that there is a vanilla kernel
# tree present in directory "${outputdir}/linux-$1".
function compile_patched_kernel {
local kver plevel
kver="$(kernel_version "$1")"
plevel="$(patchlevel "$1")"
local outputfile="${outputdir}/kernel-$1-compilation-output.txt"
echo "Compiling kernel $1 ..."
(
(
cd "${outputdir}/linux-$1" \
&& LC_ALL=C make -s -k bzImage modules
)
) &> "${outputfile}"
echo "See also ${outputfile}."
return 0
}
# Compile subdirectories $2..$n of the patched kernel tree linux-$1.
function compile_kernel {
local kver plevel
local k=$1
kver="$(kernel_version "$1")"
plevel="$(patchlevel "$1")"
local outputfile="${outputdir}/compilation-$1-output.txt"
shift
echo "Compiling the patched kernel ..."
if (cd "${outputdir}/linux-$k" \
&& make -s modules_prepare \
&& make -s scripts \
&& for subdir; do LC_ALL=C KBUILD_MODPOST_WARN=1 make -j"$(nproc)" -k M="${subdir}"; done
) &> "${outputfile}"
then
local errors warnings
errors=$(grep -c ' error:' "${outputfile}")
warnings=$(grep -c ' warning:' "${outputfile}")
echo "${errors} errors / ${warnings} warnings."
else
echo FAILED
fi
grep -E 'warning:|error:' < "${outputfile}" | sort | uniq -c
return 0
}
# Run the source code verification tool 'sparse' on the SCST code. Assumes that
# there is a patched kernel tree present in directory "${outputdir}/linux-$1".
# For more information about endianness annotations, see also
# http://lwn.net/Articles/205624/.
function run_sparse {
local k="$1"
local kver plevel
kver="$(kernel_version "$1")"
plevel="$(patchlevel "$1")"
local outputfile="${outputdir}/sparse-$1-output.txt"
shift
echo "Running sparse on the patched kernel in $* ..."
if (cd "${outputdir}/linux-$k" \
&& make -s modules_prepare \
&& make -s scripts \
&& if grep -q '^CONFIG_PPC=y$' .config; then LC_ALL=C KBUILD_MODPOST_WARN=1 make -k M=arch/powerpc/lib; fi \
&& for subdir; do
LC_ALL=C KBUILD_MODPOST_WARN=1 make -k C=2 CF="-D__CHECK_ENDIAN__ -DCONFIG_SPARSE_RCU_POINTER" M="${subdir}"
done
) &> "${outputfile}"
then
local errors warnings
errors=$(grep -c ' error:' "${outputfile}")
warnings=$(grep -c ' warning:' "${outputfile}")
echo "${errors} errors / ${warnings} warnings."
grep -E ' warning:| error:' < "${outputfile}" \
| sed -e 's/^[^:]*:[0-9:]* //' \
-e "s/context imbalance in '[^']*':/context imbalance in <function>:/g" \
-e "s/context problem in '[^']*': '[^']*'/context problem in <function>: <function>/g" \
-e "s/function '[^']*'/function/g" \
-e "s/symbol '[^']*'/symbol/g" \
| sort \
| uniq -c
else
echo FAILED
fi
return 0
}
# Run smatch for kernel version $1 on directories $2..$n
function run_smatch {
local k="$1"
local kver plevel
kver="$(kernel_version "$1")"
plevel="$(patchlevel "$1")"
local outputfile="${outputdir}/smatch-$1-output.txt"
local disable="" # "CONFIG_DYNAMIC_DEBUG"
shift
echo "Running smatch on the patched kernel in $* ..."
if (cd "${outputdir}/linux-$k" &&
for c in $disable; do sed -i.tmp "s/^$c=y\$/$c=n/" .config; done &&
make -s oldconfig </dev/null &&
make -s modules_prepare &&
make -s scripts &&
if grep -q '^CONFIG_PPC=y$' .config; then LC_ALL=C KBUILD_MODPOST_WARN=1 make -k M=arch/powerpc/lib; fi &&
for subdir; do
LC_ALL=C KBUILD_MODPOST_WARN=1 make -k CHECK="smatch -p=kernel" C=2 CF=-D__CHECK_ENDIAN__ M="${subdir}"
done
) &> "${outputfile}"
then
local errors warnings
errors=$(grep -c ' error:' "${outputfile}")
warnings=$(grep -c ' warn:' "${outputfile}")
echo "${errors} errors / ${warnings} warnings."
grep -E ' info:| warn:| error:' < "${outputfile}" |
sed 's/^\([^:]*\):[0-9:]* /\1: /;s/\((see line \)[0-9]*\()\)/\1...\2/' |
sort |
uniq -c
else
echo FAILED
fi
return 0
}
function run_checkstack {
local kver plevel
kver="$(kernel_version "$1")"
plevel="$(patchlevel "$1")"
local outputfile="${outputdir}/checkstack-$1-output.txt"
echo "Running checkstack on the patched $1 kernel ..."
(
cd "${outputdir}/linux-$1" \
&& make -s modules_prepare \
&& make -s scripts \
&& LC_ALL=C KBUILD_MODPOST_WARN=1 make -k checkstack
) &> "${outputfile}"
echo "See also ${outputfile}."
return 0
}
function run_namespacecheck {
local kver plevel
kver="$(kernel_version "$1")"
plevel="$(patchlevel "$1")"
local outputfile="${outputdir}/namespacecheck-$1-output.txt"
echo "Running namespacecheck on the patched $1 kernel ..."
(
cd "${outputdir}/linux-$1" \
&& make -s modules_prepare \
&& make -s scripts \
&& LC_ALL=C KBUILD_MODPOST_WARN=1 make -k namespacecheck
) &> "${outputfile}"
echo "See also ${outputfile}."
return 0
}
function run_headers_check {
local kver plevel
kver="$(kernel_version "$1")"
plevel="$(patchlevel "$1")"
local outputfile="${outputdir}/headers_check-$1-output.txt"
echo "Running headers check on the patched $1 kernel ..."
(
cd "${outputdir}/linux-$1" \
&& make -s modules_prepare \
&& make -s scripts \
&& LC_ALL=C KBUILD_MODPOST_WARN=1 make -k headers_check
) &> "${outputfile}"
local errors
errors=$(grep -c '^[^ ]' "${outputfile}")
echo "${errors} errors."
grep '^[^ ]' "${outputfile}" | sed 's/.*: //' | sort | uniq -c
return 0
}
function run_make_htmldocs {
local kver plevel
kver="$(kernel_version "$1")"
plevel="$(patchlevel "$1")"
local outputfile="${outputdir}/htmldocs-$1-output.txt"
echo "Generating HTML documentation for the patched $1 kernel ..."
(
cd "${outputdir}/linux-$1" \
&& make -s modules_prepare \
&& make -s scripts \
&& LC_ALL=C KBUILD_MODPOST_WARN=1 make -k htmldocs
) &> "${outputfile}"
echo "See also ${outputfile}."
return 0
}
#########################
# Argument verification #
#########################
export LC_ALL=C
if [ ! -e scst ] || [ ! -e iscsi-scst ] || [ ! -e srpt ]; then
echo "Please run this script from inside the SCST subversion source tree."
exit 1
fi
scriptsdir="$(dirname "$0")"
if [ "${scriptsdir:0:1}" != "/" ]; then
scriptsdir="$PWD/${scriptsdir}"
fi
# Where to store persistently downloaded kernel tarballs and kernel patches.
kernel_downloads="$HOME/software/downloads"
kernel_versions=""
# Directory in which the regression test output files will be stored. Must be
# an absolute path.
outputdir="${PWD}/regression-test-output-$(date +%Y-%m-%d_%Hh%Mm%Ss)"
# Driver configuration.
multiple_patches="false"
remove_temporary_files_at_end="false"
run_local_compilation="true"
quiet_download="false"
{
# shellcheck disable=SC2046
set -- $(/usr/bin/getopt "c:d:j:hklpq" "$@")
}
while [ "$1" != "${1#-}" ]
do
case "$1" in
'-c') kernel_downloads="$2"; shift; shift;;
'-d') outputdir="$2"; shift; shift;;
'-h') usage; exit 1;;
'-j') export MAKEFLAGS="-j$2"; shift; shift;;
'-k') remove_temporary_files_at_end="true"; shift;;
'-l') run_local_compilation="false"; shift;;
'-p') multiple_patches="true"; shift;;
'-q') quiet_download="true"; shift;;
'--') shift;;
*) usage; exit 1;;
esac
done
kernel_versions="$*"
if [ "${kernel_versions}" = "" ]; then
usage
exit 1
fi
####################
# Regression tests #
####################
if [ "$(type -p sparse)" = "" ]; then
echo "Error: sparse has not yet been installed."
echo "See also http://www.kernel.org/pub/software/devel/sparse/."
fi
if [ "$(type -p smatch)" = "" ]; then
echo "Error: smatch has not yet been installed."
echo "See also http://smatch.sourceforge.net/."
fi
if ! mkdir -p "${outputdir}"; then
if [ -e "${outputdir}" ]; then
echo "Error: path ${outputdir} exists and is not a directory."
else
echo "Error: could not create directory ${outputdir}."
fi
exit 1
fi
test_scst_tree_patches || exit $?
if [ "${run_local_compilation}" = "true" ]; then
compile_scst_unpatched || exit $?
compile_scst_no_dlm || exit $?
compile_scst_patched 2release || exit $?
compile_scst_patched 2perf || exit $?
if type rpmbuild >/dev/null 2>&1; then
make_rpm || exit $?
fi
if type debuild >/dev/null 2>&1; then
make_dpkg || exit $?
fi
fi
global_multiple_patches="${multiple_patches}"
for kv in ${kernel_versions}
do
multiple_patches="${global_multiple_patches}"
echo "=========================="
printf "= kernel %-15s =\n" "${kv}"
echo "=========================="
full_check="false"
generate_kernel_patch_options=""
ibmvio="false"
run_checkpatch="true"
run_sparse="true"
run_smatch="true"
ipv6="true"
while true; do
kv_without_opt="${kv%-?}"
if [ "${kv_without_opt}" = "${kv}" ]; then
kv_without_opt="${kv%-??}"
fi
kopt="${kv#"${kv_without_opt}"}"
case "${kopt}" in
'-4') ipv6="false";;
'-f') full_check="true";;
'-i') ibmvio="true";;
'-nc') run_checkpatch="false";;
'-ns') run_sparse="false";;
'-nm') run_smatch="false";;
'-u') generate_kernel_patch_options="-u";;
'-p') multiple_patches="true";;
*) break;;
esac
kv="${kv_without_opt}"
done
patchdir="patchdir-${kv}"
k="${kv}"
generate_kernel_patch "$k" "${generate_kernel_patch_options}" || continue
if ! (
cd "${outputdir}" &&
download_and_extract_kernel_tree "$k"
); then
echo "Error: download_and_extract_kernel_tree $k failed"
continue
fi
k="${k/^*}"
if [ "${run_checkpatch}" = "true" ]; then
run_checkpatch "$k"
fi
patch_and_configure_kernel "$k" || continue
case "$k" in
3.10.0-*)
# Make the CentOS 7.x build less noisy.
KCFLAGS+=" -Wno-deprecated-declarations";
esac
# See also commit bd664f6b3e37 ("disable new gcc-7.1.1 warnings for now";
# v4.13) and commit 6f303d60534c ("gcc-9: silence 'address-of-packed-member'
# warning"; v5.1).
for w in -Wno-format-truncation -Wno-format-overflow -Wno-int-in-bool-context -Wno-address-of-packed-member; do
if gcc -c -xc -E - "$w" </dev/null >&/dev/null; then
KCFLAGS+=" $w"
fi
done
export KCFLAGS
subdirs=(drivers/scst drivers/scsi/qla2xxx)
if [ "${run_sparse}" = "true" ]; then
run_sparse "$k" "${subdirs[@]}"
mv "${outputdir}/sparse-$k-output.txt" \
"${outputdir}/sparse-$k-scst-output.txt"
if [ "${ibmvio}" = "true" ]; then
run_sparse "$k" drivers/scsi libsrp.ko scsi_sysfs.ko \
scsi_transport_fc.ko scsi_transport_srp.ko
mv "${outputdir}/sparse-$k-output.txt" \
"${outputdir}/sparse-$k-scsi-output.txt"
fi
fi
if [ "${run_smatch}" = "true" ]; then
run_smatch "$k" "${subdirs[@]}"
fi
compile_kernel "$k" "${subdirs[@]}"
if [ "${full_check}" = "true" ]; then
run_headers_check "$k"
compile_patched_kernel "$k"
run_checkstack "$k"
run_namespacecheck "$k"
run_make_htmldocs "$k"
fi
if [ "${remove_temporary_files_at_end}" = "true" ]; then
rm -rf "${outputdir}"
mkdir -p "${outputdir}"
fi
multiple_patches="${global_multiple_patches}"
done