Files
scst/scripts/run-regression-tests
Yan Burman de6aa12e9c Merged revisions 5409-5452,5454 via svnmerge from
svn+ssh://yanb123@svn.code.sf.net/p/scst/svn/trunk

........
  r5409 | bvassche | 2014-04-06 23:13:53 +0300 (Sun, 06 Apr 2014) | 4 lines
  
  scstadmin: Restore LUNs in "scstadmin -list_sessions" output
  
  Signed-off-by: Dave Butler <tears.the@gmail.com>
........
  r5410 | bvassche | 2014-04-06 23:26:08 +0300 (Sun, 06 Apr 2014) | 1 line
  
  scstadmin: List keys alphabetically in the -list_sessions output
........
  r5411 | vlnb | 2014-04-10 02:58:20 +0300 (Thu, 10 Apr 2014) | 10 lines
  
  vdisk_blockio: Specify REQ_SYNC for synchronous I/O requests
  
  Using READ_SYNC instead of READ increases the priority of read requests.
  Using WRITE_SYNC instead of REQ_WRITE increases the priority of write
  requests and avoids that the CFQ scheduler queues such writes waiting
  for further write requests.
  
  Signed-off-by: Bart Van Assche <bvanassche@acm.org>
........
  r5412 | vlnb | 2014-04-10 02:59:02 +0300 (Thu, 10 Apr 2014) | 18 lines
  
  vdisk_blockio: Reenable COMPARE AND WRITE
  
  The COMPARE AND WRITE implementation has been tested as follows against
  an SCST vdisk_blockio device:
  
  lba=7
  bdev=$bdev
  for ((i=0;i<4;i++)); do dd if=/dev/urandom of=b$i bs=8k count=1; done
  for p in "0 1" "1 2" "2 3" "3 0"; do set $p; cat b$1 b$2 >b$1$2; done
  dd if=/dev/urandom of=$bdev
  dd if=b0 of=$bdev seek=$lba
  md5sum $bdev
  for ((i=0;i<10000;i++)); do for f in b01 b12 b23 b30; do sg_compare_and_write -l $lba -i $f -n 16 -x 16384 $bdev; done; done
  md5sum $bdev
  
  Signed-off-by: Bart Van Assche <bvanassche@acm.org>
........
  r5413 | bvassche | 2014-04-15 09:03:59 +0300 (Tue, 15 Apr 2014) | 1 line
  
  ib_srpt: Fix a sparse warning
........
  r5414 | vlnb | 2014-04-16 00:26:06 +0300 (Wed, 16 Apr 2014) | 5 lines
  
  Fix READ(6)/WRITE(6)
  
  LBA in those commands is 3 bytes long, not 2.
........
  r5415 | vlnb | 2014-04-16 00:30:26 +0300 (Wed, 16 Apr 2014) | 3 lines
  
  Add SYNCHRONIZE_CACHE(16)
........
  r5416 | vlnb | 2014-04-16 01:04:54 +0300 (Wed, 16 Apr 2014) | 6 lines
  
  Make HEAD OF QUEUE requests sync
  
  Since the block layer has no way to specify bio as HQ, there's no
  choice, but to use every measure to approximate it as close as possible.
........
  r5417 | vlnb | 2014-04-16 01:17:34 +0300 (Wed, 16 Apr 2014) | 3 lines
  
  Add NULLIO VERIFY
........
  r5418 | vlnb | 2014-04-16 04:02:50 +0300 (Wed, 16 Apr 2014) | 3 lines
  
  REPORT SUPPORTED OPERATION CODES added
........
  r5419 | vlnb | 2014-04-16 04:05:49 +0300 (Wed, 16 Apr 2014) | 3 lines
  
  Cleanup
........
  r5420 | vlnb | 2014-04-16 05:24:44 +0300 (Wed, 16 Apr 2014) | 3 lines
  
  Follow up for r5418: some cleanups and fixes
........
  r5421 | bvassche | 2014-04-16 09:17:19 +0300 (Wed, 16 Apr 2014) | 6 lines
  
  scst_targ: Fix a checkpatch complaint
  
  Avoid that checkpatch reports the following message:
  
  ERROR: space required before the open parenthesis '('
........
  r5422 | bvassche | 2014-04-16 09:35:19 +0300 (Wed, 16 Apr 2014) | 1 line
  
  scst_vdisk: Build fix for kernels < 2.6.36 (see also r5416)
........
  r5423 | bvassche | 2014-04-16 10:30:34 +0300 (Wed, 16 Apr 2014) | 6 lines
  
  ib_srpt: Disable RDMA access by the initiator
  
  With the SRP protocol all RDMA operations are initiated by the target.
  Since no RDMA operations are initiated by the initiator, do not grant
  the initiator permission to submit RDMA reads or writes to the target.
........
  r5424 | bvassche | 2014-04-16 11:01:58 +0300 (Wed, 16 Apr 2014) | 1 line
  
  ib_srpt: Constify two arguments of srpt_get_nexus()
........
  r5425 | bvassche | 2014-04-16 11:08:50 +0300 (Wed, 16 Apr 2014) | 1 line
  
  ib_srpt: Clean up the code that prints the dgid during login
........
  r5426 | bvassche | 2014-04-16 11:23:11 +0300 (Wed, 16 Apr 2014) | 1 line
  
  ib_srpt: Cache P_Key lookups
........
  r5427 | bvassche | 2014-04-16 12:14:31 +0300 (Wed, 16 Apr 2014) | 1 line
  
  ib_srpt: Remove a superfluous assignment
........
  r5428 | bvassche | 2014-04-16 12:31:56 +0300 (Wed, 16 Apr 2014) | 1 line
  
  scst_vdisk: Avoid that checkpatch complains about unnecessary line continuations
........
  r5429 | bvassche | 2014-04-16 12:35:18 +0300 (Wed, 16 Apr 2014) | 1 line
  
  scst_lib: Avoid that checkpatch complains about unnecessary line continuations
........
  r5430 | bvassche | 2014-04-17 09:09:41 +0300 (Thu, 17 Apr 2014) | 1 line
  
  scst_vdisk: Kernel 2.6.27 build fix
........
  r5431 | bvassche | 2014-04-17 09:12:07 +0300 (Thu, 17 Apr 2014) | 5 lines
  
  scst_vdisk: Fix a kernel 2.6.27 compiler warning
  
  Avoid that the compiler reports that variables 'start_sector' and 'nr_sects'
  are set but not used when building against kernel 2.6.27.
........
  r5432 | vlnb | 2014-04-18 03:32:51 +0300 (Fri, 18 Apr 2014) | 3 lines
  
  Update to kernels 3.14
........
  r5433 | bvassche | 2014-04-18 08:50:04 +0300 (Fri, 18 Apr 2014) | 1 line
  
  nightly build: Add kernel 3.14 build infrastructure
........
  r5434 | bvassche | 2014-04-18 08:54:29 +0300 (Fri, 18 Apr 2014) | 1 line
  
  nightly build: Add kernel version 3.14.1 and update other kernel versions
........
  r5435 | bvassche | 2014-04-18 08:56:35 +0300 (Fri, 18 Apr 2014) | 6 lines
  
  iscsi-scst: Fix a checkpatch warning
  
  Fix the following checkpatch 3.14 warning:
  
  Unnecessary parentheses - maybe == should be = ?
........
  r5436 | bvassche | 2014-04-18 09:03:34 +0300 (Fri, 18 Apr 2014) | 6 lines
  
  scst.h: Fix a checkpatch warning
  
  Fix the following checkpatch 3.14 warning:
  
  Unnecessary space after function pointer name
........
  r5437 | bvassche | 2014-04-18 09:08:07 +0300 (Fri, 18 Apr 2014) | 6 lines
  
  scst: Fix a checkpatch warning
  
  Fix the following checkpatch 3.14 warning:
      
  Unnecessary space after function pointer name
........
  r5438 | bvassche | 2014-04-18 09:13:03 +0300 (Fri, 18 Apr 2014) | 6 lines
  
  scst: Fix a checkpatch 3.14 warning about whitespace
  
  Fix the following checkpatch 3.14 warning:
  
  missing space after return type
........
  r5439 | bvassche | 2014-04-18 14:09:55 +0300 (Fri, 18 Apr 2014) | 1 line
  
  ib_srpt: Update README
........
  r5440 | bvassche | 2014-04-18 15:04:05 +0300 (Fri, 18 Apr 2014) | 2 lines
  
  ib_srpt: Move IB/CM knowledge out of srpt_cm_req_recv()
........
  r5441 | bvassche | 2014-04-18 15:08:00 +0300 (Fri, 18 Apr 2014) | 6 lines
  
  ib_srpt: Remove a superfluous check from the REQ handler
  
  ib_send_cm_rep() checks the connection state before sending a response.
  Hence checking ch->state before calling ib_send_cm_rep() is superfluous,
  so remove that check and also the locking that is no longer needed.
........
  r5442 | bvassche | 2014-04-18 15:09:33 +0300 (Fri, 18 Apr 2014) | 5 lines
  
  ib_srpt: Prepare RDMA/CM support
      
  Move IB/CM members into a new struct. Report channel pointer instead of CM ID
  pointer in diagnostic messages.
........
  r5443 | bvassche | 2014-04-18 15:10:47 +0300 (Fri, 18 Apr 2014) | 5 lines
  
  ib_srpt: Use a mutex instead of a spinlock to protect the channel list
      
  This is allowed because all CM callback functions are invoked from thread
  context.
........
  r5444 | bvassche | 2014-04-18 15:11:18 +0300 (Fri, 18 Apr 2014) | 2 lines
  
  ib_srpt: Move the code for checking the QP timeout
........
  r5445 | bvassche | 2014-04-18 15:22:30 +0300 (Fri, 18 Apr 2014) | 4 lines
  
  ib_srpt: Add RDMA/CM support
  
  Or in other words, add RoCE and iWARP support.
........
  r5446 | bvassche | 2014-04-18 15:38:39 +0300 (Fri, 18 Apr 2014) | 1 line
  
  ib_srpt: Build fix for kernel versions < 3.0
........
  r5447 | bvassche | 2014-04-18 15:44:48 +0300 (Fri, 18 Apr 2014) | 1 line
  
  ib_srpt: RHEL 6.5 build fix
........
  r5448 | bvassche | 2014-04-19 14:48:33 +0300 (Sat, 19 Apr 2014) | 1 line
  
  scst_vdisk, COMPARE AND WRITE: Convert a kernel warning into a SCSI sense code
........
  r5449 | bvassche | 2014-04-19 14:52:34 +0300 (Sat, 19 Apr 2014) | 33 lines
  
  vdisk_blockio: Make COMPARE AND WRITE compatible with the scsi_debug driver
  
  This patch fixes the following kernel oops:
  
  BUG: unable to handle kernel paging request at ffffeae380000690
  Call Trace:
   [<ffffffff812f69f9>] sg_miter_next+0x9/0xd0
   [<ffffffff812f6b60>] sg_copy_buffer+0xa0/0x100
   [<ffffffffa0507fc6>] do_device_access.isra.8+0xa6/0x150 [scsi_debug]
   [<ffffffffa05085f4>] resp_read+0xe4/0x240 [scsi_debug]
   [<ffffffffa050b285>] scsi_debug_queuecommand_lck+0x11e5/0x2060 [scsi_debug]
   [<ffffffffa050c130>] scsi_debug_queuecommand+0x30/0x48 [scsi_debug]
   [<ffffffff813fe23f>] scsi_dispatch_cmd+0xaf/0x260
   [<ffffffff814068ed>] scsi_request_fn+0x32d/0x540
   [<ffffffff812bda2a>] __blk_run_queue+0x2a/0x40
   [<ffffffff812c25a4>] blk_queue_bio+0x274/0x350
   [<ffffffff812bd878>] generic_make_request+0xa8/0xf0
   [<ffffffff812bd92c>] submit_bio+0x6c/0x140
   [<ffffffffa06247f6>] blockio_rw_sync.isra.29+0x106/0x170 [scst_vdisk]
   [<ffffffffa0629bf9>] vdisk_exec_caw+0xd9/0x3c0 [scst_vdisk]
   [<ffffffffa061ff5e>] vdev_do_job+0x9e/0x320 [scst_vdisk]
   [<ffffffffa0622c47>] non_fileio_exec+0x57/0xd0 [scst_vdisk]
   [<ffffffffa054cde2>] scst_do_real_exec+0x92/0x3b0 [scst]
   [<ffffffffa05502d2>] scst_exec_check_blocking+0xe2/0x300 [scst]
   [<ffffffffa055066b>] scst_exec_check_sn+0x17b/0x2d0 [scst]
   [<ffffffffa0553231>] scst_process_active_cmd+0x431/0x770 [scst]
   [<ffffffffa0554a0a>] scst_do_job_active+0xea/0x180 [scst]
   [<ffffffffa0554bc6>] scst_cmd_thread+0x126/0x290 [scst]
   [<ffffffff81075241>] kthread+0xc1/0xe0
   [<ffffffff81598ccc>] ret_from_fork+0x7c/0xb0
  
  Reported-by: Sebastian Herbszt <herbszt@gmx.de>
........
  r5450 | bvassche | 2014-04-20 09:24:23 +0300 (Sun, 20 Apr 2014) | 1 line
  
  iscsi-scst/kernel/patches/put_page_callback-3.2.57.patch: Add
........
  r5451 | bvassche | 2014-04-22 09:56:37 +0300 (Tue, 22 Apr 2014) | 1 line
  
  scst: Revert r5438, a whitespace-only change
........
  r5452 | bvassche | 2014-04-22 10:05:21 +0300 (Tue, 22 Apr 2014) | 1 line
  
  scripts/run-regression-tests: Suppress the checkpatch warning "missing space after return type"
........
  r5454 | bvassche | 2014-04-22 10:32:44 +0300 (Tue, 22 Apr 2014) | 1 line
  
  scst/README: Update the section about Linux initiator ALUA support
........


git-svn-id: http://svn.code.sf.net/p/scst/svn/branches/iser@5455 d57e44dd-8a1f-0410-8b47-8ef2f437770f
2014-04-22 07:50:34 +00:00

650 lines
20 KiB
Bash
Executable File

#!/bin/bash
############################################################################
#
# Script for running those SCST regression tests that can be run automatically.
#
# Copyright (C) 2008-2009 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 #
########################
source $(dirname $0)/kernel-functions
function usage {
echo "Usage: $0 [-c <dir>] [-d <dir>] [-f] [-h] [-j <jobs>] [-p <patchdir>] [-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 " -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
}
# 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
"${scriptsdir}"/list-source-files "$1" |
tar -C "$1" --files-from=- -c -f - |
tar -x -f -
else
return 1
fi
}
function make_rpm {
local outputfile="${outputdir}/make-rpm-output.txt"
echo "Testing whether 'make rpm' works fine ..."
if make rpm > "${outputfile}" 2>&1; then
echo "OK"
else
echo "FAILED"
fi
}
function compile_scst {
(
export KCFLAGS=-DCONFIG_SCST_MEASURE_LATENCY
for p in scst scst_local iscsi-scst srpt qla2x00t $(if [ "${mpt_scst}" = "true" ]; then echo mpt; fi); do
if [ "${p%qla2x00t}" != "$p" ]; then
BUILD_2X_MODULE=y CONFIG_SCSI_QLA_FC=y CONFIG_SCSI_QLA2XXX_TARGET=y \
make -C $p/qla2x00-target || return $?
else
make -C $p || 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
)
}
# Test out-of-tree compilation agains 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.
function generate_kernel_patch {
local scst_dir="${PWD}"
local kver="$(kernel_version $1)"
local patchfile="${outputdir}/scst-$1-kernel.patch"
local patchfile_m="${outputdir}/scst-$1-kernel-matching-line-numbers.patch"
local driver_options=""
driver_options="-l \
$([ "${mpt_scst}" = "true" ] && echo "-m") \
$([ "${qla2x00t}" = "true" ] && echo "-q")"
"${scriptsdir}"/generate-kernel-patch ${driver_options} $2 $1 > "${patchfile}"
"${scriptsdir}"/generate-kernel-patch ${driver_options} -n $2 $1 > "${patchfile_m}"
"${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="$(kernel_version $1)"
local plevel="$(patchlevel $1)"
local outputfile="${outputdir}/checkpatch-$1-output.txt"
local patchfile="${outputdir}/scst-$1-kernel.patch"
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 - < "${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 - < "$p" >> "${outputfile}" 2>&1
done
)
fi
local errors=$(grep -c '^ERROR' "${outputfile}")
local warnings=$(grep -c '^WARNING' "${outputfile}")
echo "${errors} errors / ${warnings} warnings."
grep -E '^WARNING|^ERROR' "${outputfile}" |
sort |
grep -v 'WARNING: missing space after return type' |
sed 's/^WARNING: Avoid CamelCase:.*/WARNING: Avoid CamelCase/' |
uniq -c
else
echo "Skipping checkpatch step for kernel $1."
fi
return 0
}
function patch_and_configure_kernel {
local kver="$(kernel_version $1)"
local patchfile="${outputdir}/scst-$1-kernel-matching-line-numbers.patch"
local patchoutput="${outputdir}/patch-command-output-$1.txt"
local disable=" \
CONFIG_BINARY_PRINTF \
CONFIG_BLK_DEV_IO_TRACE \
CONFIG_BRANCH_PROFILE_NONE \
CONFIG_CONTEXT_SWITCH_TRACER \
CONFIG_DEBUG_STRICT_USER_COPY_CHECKS \
CONFIG_DYNAMIC_FTRACE \
CONFIG_EVENT_TRACE_TEST_SYSCALLS \
CONFIG_EVENT_TRACING \
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_KVM_MMU_AUDIT \
CONFIG_MAC80211_DRIVER_API_TRACER \
CONFIG_MMIOTRACE \
CONFIG_NET_DROP_MONITOR \
CONFIG_NOP_TRACER \
CONFIG_SCHED_TRACER \
CONFIG_STACK_TRACER \
CONFIG_TRACEPOINTS \
CONFIG_TRACER_MAX_TRACE \
CONFIG_TRACING CONFIG_X86_32 \
"
echo "Patching and configuring kernel ..."
(
local srcdir="$PWD"
cd "${outputdir}/linux-$1" \
&& if [ "${multiple_patches}" = "false" ]; then
patch -p1 -f -s <"${patchfile}" >"${patchoutput}"
else
rm -f "${patchoutput}"
for p in "${outputdir}/${patchdir}"/*
do
echo "==== $p" >>"${patchoutput}"
patch -p1 -f -s <"${p}" >>"${patchoutput}" 2>&1
done
fi \
&& if [ -e $srcdir/srpt/patches/kernel-${kver}-pre-cflags.patch ]; then
echo "$srcdir/srpt/patches/kernel-${kver}-pre-cflags.patch ..." \
>>"${patchoutput}"
patch -p1 -f -s <$srcdir/srpt/patches/kernel-${kver}-pre-cflags.patch \
>>"${patchoutput}";
else
echo "srpt/patches/kernel-${kver}-pre-cflags.patch not found."; \
fi \
&& make -s allmodconfig &>"${outputdir}/make-config-output.txt" \
&& for c in $disable; do sed -i.tmp "s/^$c=y\$/$c=n/" .config; done \
&& make -s oldconfig &>/dev/null
)
}
# 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="$(kernel_version $1)"
local 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 subdirectory $2 of the patched kernel tree linux-$1.
function compile_kernel {
local kver="$(kernel_version $1)"
local plevel="$(patchlevel $1)"
local outputfile="${outputdir}/compilation-$1-output.txt"
local subdir="$2"
echo "Compiling the patched kernel ..."
if (cd "${outputdir}/linux-$1" \
&& make -s prepare \
&& make -s scripts \
&& LC_ALL=C make -k M="${subdir}"
) &> "${outputfile}"
then
local errors=$(grep -c ' error:' "${outputfile}")
local warnings=$(grep -c ' warning:' "${outputfile}")
echo "${errors} errors / ${warnings} warnings."
else
echo FAILED
fi
cat "${outputfile}" | grep -E 'warning:|error:' | 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="$(kernel_version $1)"
local plevel="$(patchlevel $1)"
local outputfile="${outputdir}/sparse-$1-output.txt"
local subdir="$2"
shift
shift
echo "Running sparse on the patched kernel in ${subdir} $@ ..."
if (cd "${outputdir}/linux-$k" \
&& make -s prepare \
&& make -s scripts \
&& if grep -q '^CONFIG_PPC=y$' .config; then LC_ALL=C make -k M=arch/powerpc/lib; fi \
&& LC_ALL=C make -k C=2 CF="-D__CHECK_ENDIAN__ -DCONFIG_SPARSE_RCU_POINTER" M="${subdir}" "$@"
) &> "${outputfile}"
then
local errors=$(grep -c ' error:' "${outputfile}")
local warnings=$(grep -c ' warning:' "${outputfile}")
echo "${errors} errors / ${warnings} warnings."
cat "${outputfile}" \
| grep -E ' warning:| error:' \
| 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
}
function run_smatch {
local k="$1"
local kver="$(kernel_version $1)"
local plevel="$(patchlevel $1)"
local outputfile="${outputdir}/smatch-$1-output.txt"
local subdir="$2"
local disable="CONFIG_DYNAMIC_DEBUG"
shift
shift
echo "Running smatch on the patched kernel in ${subdir} $@ ..."
if (cd "${outputdir}/linux-$k" &&
for c in $disable; do sed -i.tmp "s/^$c=y\$/$c=n/" .config; done &&
make -s oldconfig &&
make -s prepare &&
make -s scripts &&
if grep -q '^CONFIG_PPC=y$' .config; then LC_ALL=C make -k M=arch/powerpc/lib; fi &&
LC_ALL=C make -k CHECK="smatch -p=kernel" C=2 CF=-D__CHECK_ENDIAN__ M="${subdir}" "$@"
) &> "${outputfile}"
then
local errors=$(grep -c ' error:' "${outputfile}")
local warnings=$(grep -c ' warning:' "${outputfile}")
echo "${errors} errors / ${warnings} warnings."
cat "${outputfile}" |
grep -E ' info:| warning:| error:' |
sed 's/^\([^:]*\):[0-9:]* /\1: /' |
sort |
uniq -c
else
echo FAILED
fi
return 0
}
function run_checkstack {
local kver="$(kernel_version $1)"
local plevel="$(patchlevel $1)"
local outputfile="${outputdir}/checkstack-$1-output.txt"
echo "Running checkstack on the patched $1 kernel ..."
(
cd "${outputdir}/linux-$1" \
&& make -s prepare \
&& make -s scripts \
&& LC_ALL=C make -k checkstack
) &> "${outputfile}"
echo "See also ${outputfile}."
return 0
}
function run_namespacecheck {
local kver="$(kernel_version $1)"
local plevel="$(patchlevel $1)"
local outputfile="${outputdir}/namespacecheck-$1-output.txt"
echo "Running namespacecheck on the patched $1 kernel ..."
(
cd "${outputdir}/linux-$1" \
&& make -s prepare \
&& make -s scripts \
&& LC_ALL=C make -k namespacecheck
) &> "${outputfile}"
echo "See also ${outputfile}."
return 0
}
function run_headers_check {
local kver="$(kernel_version $1)"
local 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 prepare \
&& make -s scripts \
&& LC_ALL=C make -k headers_check
) &> "${outputfile}"
local errors=$(grep -c '^[^ ]' "${outputfile}")
echo "${errors} errors."
grep '^[^ ]' "${outputfile}" | sed 's/.*: //' | sort | uniq -c
return 0
}
function run_make_htmldocs {
local kver="$(kernel_version $1)"
local 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 prepare \
&& make -s scripts \
&& LC_ALL=C make -k htmldocs
) &> "${outputfile}"
echo "See also ${outputfile}."
return 0
}
#########################
# Argument verification #
#########################
export LC_ALL=C
if [ ! -e scst -o ! -e iscsi-scst -o ! -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 persistenly downloaded kernel tarballs and kernel patches.
kernel_sources="$HOME/software/downloads"
# URL for downloading kernel tarballs and kernel patches.
kernel_mirror="ftp://ftp.kernel.org/pub/linux/kernel"
kernel_longterm="http://www.kernel.org/pub/linux/kernel"
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.
mpt_scst="false"
multiple_patches="false"
qla2x00t="false"
remove_temporary_files_at_end="false"
run_local_compilation="true"
quiet_download="false"
set -- $(/usr/bin/getopt "c:d:j:hklpq" "$@")
while [ "$1" != "${1#-}" ]
do
case "$1" in
'-c') kernel_sources="$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="$*"
# RHEL 4.x / CentOS 4.x has a kernel based on version 2.6.9.
# RHEL 5.x / CentOS 5.x has a kernel based on version 2.6.18.
# Ubuntu 8.04 (Hardy Heron) has a kernel based on version 2.6.24.
# Ubuntu 8.10 (Intrepid Ibex) has a kernel based on version 2.6.27.
# openSUSE 11.0 has a kernel based on version 2.6.25.
# openSUSE 11.1 has a kernel based on version 2.6.27.
#kernel_versions="2.6.23.17 2.6.24.7 2.6.25.20 2.6.26.8 2.6.27.21 2.6.28.9 2.6.29.1"
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: directory ${outputdir} already exists."
else
echo "Error: could not create directory ${outputdir}."
fi
fi
test_scst_tree_patches || exit $?
if [ "${run_local_compilation}" = "true" ]; then
compile_scst_unpatched || exit $?
compile_scst_patched 2release || exit $?
compile_scst_patched 2perf || exit $?
compile_scst_patched enable_proc || exit $?
if type rpmbuild >/dev/null 2>&1; then
make_rpm || exit $?
fi
fi
first_iteration="true"
for kv in ${kernel_versions}
do
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"
global_multiple_patches="${multiple_patches}"
while [ "${kv%-?}" != "${kv}" -o "${kv%-??}" != "${kv}" ]; do
kv_without_opt="${kv%-?}"
if [ "${kv_without_opt}" = "${kv}" ]; then
kv_without_opt="${kv%-??}"
fi
kopt="${kv#${kv_without_opt}}"
case "${kopt}" in
'-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";;
*) echo "Error: unknown option ${kopt}."; exit 1;;
esac
kv="${kv_without_opt}"
done
patchdir="patchdir-${kv}"
k="${kv}"
download_kernel $k || continue
generate_kernel_patch $k "${generate_kernel_patch_options}" || continue
( cd "${outputdir}" && extract_kernel_tree $k ) || continue
if [ "${run_checkpatch}" = "true" ]; then
run_checkpatch $k
fi
patch_and_configure_kernel $k
if [ "${run_sparse}" = "true" ]; then
run_sparse $k drivers/scst
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
if [ $(uname -m) = "ppc32" -o $(uname -m) = "ppc64" ]; then
run_sparse $k drivers/scsi/ibmvscsi ibmvstgt.ko
mv ${outputdir}/sparse-$k-output.txt \
${outputdir}/sparse-$k-ibmvstgt-output.txt
fi
fi
fi
if [ "${run_smatch}" = "true" ]; then
run_smatch $k drivers/scst
fi
compile_kernel $k drivers/scst
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