Files
scst/scripts/generate-kernel-patch
T
Gleb Chesnokov 3a6fb66c83 scst: Remove residual procfs code
Procfs support was removed in 2019, but dead configuration guards,
patch specialization logic and unused declarations remained. Remove these
remnants and simplify paths that can no longer receive procfs-only objects.
2026-08-21 19:58:59 +03:00

604 lines
17 KiB
Bash
Executable File

#!/bin/bash
############################################################################
#
# Script for converting the SCST source tree as it exists in the Subversion
# repository to a Linux kernel patch.
#
# 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.
#
############################################################################
########################
# Function definitions #
########################
# shellcheck source=./kernel-functions
source "$(dirname "$0")/kernel-functions"
function usage {
echo "Usage: $0 [-d] [-h] [-n] [-p <dir>] [-s] [-u] <kernel version>"
echo "where: "
echo " -d - enable patch specialization debugging"
echo " -h - show this text"
echo " -n - do not delete code disabled via preprocessor statements"
echo " -p - generate multiple patches instead of one big patch into"\
"the specified directory."
echo " -s - disable patch specialization."
echo " -u - enables #define GENERATING_UPSTREAM_PATCH."
}
# Convert an existing patch.
# $1: path of patch to be added.
# $2: path in kernel tree of file to be patched.
function add_patch {
if [ ! -e "$1" ]; then
echo "Error: could not find $1." >&2
exit 1
fi
sed -e "s:^--- [^ ]*:--- linux-${kver}/$2:" \
-e "s:^+++ [^ ]*:+++ linux-${kver}/$2:" \
< "$1"
}
# Generate a patch for a file to be added to the kernel source tree, and strip
# trailing whitespace from C source files while converting the file to patch
# format.
# $1: path of file to be added.
# $2: path in kernel tree where file should be added.
function add_file {
local a b
if [ ! -e "$1" ]; then
echo "Error: could not find $1." >&2
exit 1
fi
# Only include files that were not generated by the build process
# -- skip *.mod.c.
if [ "$1" = "${1%.mod.c}" ] && [ "$1" ]; then
cat <<EOF
diff -uprN linux-${kver}/$2 linux-${kver}/$2
--- linux-${kver}/$2
+++ linux-${kver}/$2
@@ -0,0 +1,$(wc -l "$1" | { read -r a b; echo "$a"; echo "$b" >/dev/null; }) @@
EOF
# Insert a '+'-sign at the start of each line.
sed -e 's/^/+/' < "$1" | \
if [ "${replace_sbug_by_bug}" = "true" ]; then
sed -e 's/sBUG(\([^)]*\)/BUG(\1/g' -e 's/sBUG_ON(\([^)]*\)/BUG_ON(\1/g'
else
cat
fi \
| \
if [ "${2%.[ch]}" != "$2" ]; then
# Make sure that labels (goto-targets) are left-aligned.
sed -e 's/^ \([^ ]*:\)$/\1/'
else
cat
fi
fi
}
function add_empty_file {
cat <<EOF
diff -uprN linux-${kver}/$1 linux-${kver}/$1
--- linux-${kver}/$1
+++ linux-${kver}/$1
@@ -0,0 +1,1 @@
+
EOF
}
# Run the script specialize_patch with appropriate options on the patch
# passed via stdin and send the specialized patch to stdout.
function specialize_patch {
local ao
set -- ${1//^/ }
local kver=$1
local distro=$2
local release=$3
set -- ${release//./ }
local releasevermajor="$1"
local releaseverminor="$2"
case "$distro" in
CentOS|AlmaLinux|RockyLinux|Rocky)
if [ -n "$releasevermajor" ]; then
ao=(
-v "RHEL_MAJOR=$releasevermajor"
-v "RHEL_MINOR=$releaseverminor"
-v "RHEL_RELEASE_CODE=$((releasevermajor * 256 +
releaseverminor))"
)
fi
;;
UEK)
ao=(-v UEK_KABI_RENAME=1)
;;
esac
local kver3
set -- ${kver//[.-]/ }
if [ -n "$3" ]; then
kver3=$1.$2.$3
else
kver3=$1.$2
fi
if [ "${enable_specialize}" = "true" ]; then
if [ "${generating_upstream_patch}" = "true" ]; then
scripts/filter-trace-entry-exit
else
cat
fi |
"$(dirname "$0")/specialize-patch" \
"${specialize_patch_options[@]}" \
-v kernel_version="${kver3}" \
-v SCST_IO_CONTEXT="${scst_io_context}" "${ao[@]}"
else
cat
fi
}
# Read a patch from stdin, specialize it for kernel version ${full_kver}
# and write the output either to stdout or to the file $1 (if not empty),
# depending on the value of the variable ${multiple_patches}.
function process_patch {
local tmppatch
if [ "${multiple_patches}" = "true" ]; then
if [ "$1" != "" ]; then
if [ -e "${patchdir}/$1" ]; then
echo "Warning: overwriting ${patchdir}/$1"
fi
tmppatch="$(/bin/mktemp)"
(
specialize_patch "${full_kver}"
) >"${tmppatch}"
touch "${tmppatch}"
{
if [ -e /usr/bin/diffstat ]; then
awk 'BEGIN{h=1}/^diff/{h=0}/^---/{h=0}h!=0{print}' < "${tmppatch}"
echo "---"
diffstat "${tmppatch}"
echo ""
awk 'BEGIN{h=1}/^diff/{h=0}/^---/{h=0}h==0{print}' < "${tmppatch}"
fi
} \
> "${patchdir}/$(basename "$1")"
rm -f "${tmppatch}"
else
# echo "Discarded $(wc -l) lines."
true
fi
else
specialize_patch "${full_kver}"
fi
}
# Returns 0 (true) if SCST core file "$1" should be added in a separate patch,
# and 1 (false) if not.
function in_separate_patch {
echo "${source_files_in_separate_patch}" | grep -qE "^$1 | $1 | $1\$|^$1\$"
}
#########################
# Argument verification #
#########################
debug_specialize="false"
enable_specialize="true"
generating_upstream_patch="false"
multiple_patches="false"
patchdir=""
replace_sbug_by_bug="true"
specialize_patch_options=(-v "delete_disabled_code=1")
srpt="true"
if [ ! -e scst ] || [ ! -e iscsi-scst ] || [ ! -e srpt ] ||
[ ! -e scst_local ]; then
echo "Please run this script from inside the SCST subversion source tree."
exit 1
fi
# shellcheck disable=SC2046
set -- $(/usr/bin/getopt dhlmnp:su "$@")
while [ "$1" != "${1#-}" ]
do
case "$1" in
'-d') debug_specialize="true"; shift;;
'-h') usage; exit 1;;
'-l') shift;;
'-n') specialize_patch_options=(-v "blank_deleted_code=1")
shift
;;
'-p') multiple_patches="true"; patchdir="$2"; shift; shift;;
'-s') enable_specialize="false"; shift;;
'-u') generating_upstream_patch="true"; shift;;
'--') shift;;
*) usage; exit 1;;
esac
done
if [ $# != 1 ]; then
usage
exit 1
fi
# Strip patch level from the kernel version number.
full_kver="$1"
kver="$(kernel_version "${full_kver}")"
krel=${full_kver/^*}
# See also commit 89d9a567952b ("[SCSI] add support for per-host cmd pools";
# v3.15).
if kernel_version_lt "$kver" 3.18; then
qla2x00t="true"
qla2x00t_32gbit="false"
else
qla2x00t="false"
qla2x00t_32gbit="true"
fi
if [ -e "scst/kernel/in-tree/Makefile.scst-${kver}" ]; then
scst_makefile="Makefile.scst-${kver}"
else
scst_makefile="Makefile.scst"
fi
if [ "${debug_specialize}" = "true" ]; then
specialize_patch_options+=(-v "debug=1")
fi
if [ "${generating_upstream_patch}" = "true" ]; then
specialize_patch_options+=(-v "generating_upstream_patch_defined=1"
-v "config_tcp_zero_copy_transfer_completion_notification_undefined=1")
fi
if [ "${multiple_patches}" = "true" ]; then
if [ -e "${patchdir}" ]; then
echo "Patch output directory ${patchdir} already exists."
fi
mkdir -p "${patchdir}"
if [ ! -d "${patchdir}" ]; then
echo "Error: ${patchdir} is not a directory."
fi
fi
####################
# Patch Generation #
####################
for f in fcst/linux-patches/series-"${kver}"*
do
if [ -e "$f" ]; then
fcst_patch_series="$f"
fi
done
# General kernel patches.
scst_io_context=0
scst_03_public_headers="scst/include/scst.h scst/include/scst_const.h \
scst/include/scst_event.h scst/include/backport.h"
scst_04_main="scst/src/scst_main.c scst/src/scst_priv.h \
scst/src/scst_copy_mgr.c scst/src/scst_dlm.c scst/src/scst_dlm.h \
scst/src/scst_event.c scst/src/scst_no_dlm.c"
scst_05_targ="scst/src/scst_targ.c scst/src/scst_local_cmd.c \
scst/src/scst_local_cmd.h"
scst_06_lib="scst/src/scst_lib.c"
scst_07_pres="scst/src/scst_pres.h scst/src/scst_pres.c"
scst_08_sysfs="scst/src/scst_sysfs.c"
scst_09_debug="scst/include/scst_debug.h scst/src/scst_debug.c"
scst_10_sgv="scst/include/scst_sgv.h scst/src/scst_mem.h scst/src/scst_mem.c doc/scst_pg.sgml"
scst_user="scst/include/scst_user.h scst/src/dev_handlers/scst_user.c"
scst_13_vdisk="scst/src/dev_handlers/scst_vdisk.c"
scst_14_tg="scst/src/scst_tg.c"
separate_patches="scst_03_public_headers scst_04_main scst_05_targ scst_06_lib scst_07_pres scst_08_sysfs scst_09_debug scst_10_sgv scst_user scst_13_vdisk scst_14_tg"
# Suppress shellcheck warnings about unused variables.
echo "$scst_03_public_headers $scst_04_main $scst_05_targ $scst_06_lib $scst_07_pres $scst_08_sysfs $scst_09_debug $scst_10_sgv $scst_user $scst_13_vdisk $scst_14_tg" >/dev/null
source_files_in_separate_patch=""
for s in ${separate_patches}
do
source_files_in_separate_patch+=" $(set | \
sed -n -e "s/^$s='\(.*\)'$/\1/p" -e "s/^$s=\(.*\)$/\1/p")"
done
# Directory drivers/
(
if [ -e "scst/kernel/in-tree/Kconfig.drivers.Linux-${kver}.patch" ]; then
add_patch "scst/kernel/in-tree/Kconfig.drivers.Linux-${kver}.patch" \
"drivers/Kconfig"
else
add_patch "scst/kernel/in-tree/Kconfig.drivers.Linux.patch" \
"drivers/Kconfig"
fi
if [ -e "scst/kernel/in-tree/Makefile.drivers.Linux-${kver}.patch" ]; then
add_patch "scst/kernel/in-tree/Makefile.drivers.Linux-${kver}.patch"\
"drivers/Makefile"
else
add_patch "scst/kernel/in-tree/Makefile.drivers.Linux.patch"\
"drivers/Makefile"
fi
) \
| process_patch "scst_01_drivers_kbuild.diff"
# Directory drivers/scst/
(
tmpdir="/tmp/scst-$$"
mkdir -p "${tmpdir}"
tmp_Kconfig="${tmpdir}/Kconfig.scst-${kver}"
cat "scst/kernel/in-tree/Kconfig.scst" >"${tmp_Kconfig}"
add_file "${tmp_Kconfig}" "drivers/scst/Kconfig"
tmp_Makefile="${tmpdir}/${scst_makefile}"
cat "scst/kernel/in-tree/${scst_makefile}" >"${tmp_Makefile}"
add_file "$tmp_Makefile" "drivers/scst/Makefile"
rm -rf "${tmpdir}"
) \
| process_patch "scst_02_scst_kbuild.diff"
for s in ${separate_patches}
do
{
for f in $(eval 'echo "$'"{$s}"'"')
do
if [ "${f#scst/include}" != "${f}" ]; then
add_file "${f}" "include/scst/${f#scst/include/}"
elif [ "${f#doc}" != "${f}" ]; then
add_file "${f}" "Documentation/scst/${f#doc/}"
else
add_file "${f}" "drivers/scst/${f#scst/src/}"
fi
done
if grep -q /scst_itf_ver.h scst/src/Makefile &&
[ "$s" = "scst_03_public_headers" ]; then
tmp_itf_ver="$(mktemp /tmp/scst-itf-ver.h.XXXXXXXXXX)"
cat <<"EOF" >"$tmp_itf_ver"
/* Autogenerated, don't edit */
#define SCST_INTF_VER "SCST_INTF_VER"
#define SCST_CONST_INTF_VER "SCST_CONST_INTF_VER"
#define DEV_USER_INTF_VER "DEV_USER_INTF_VER"
EOF
add_file "$tmp_itf_ver" "include/scst/scst_itf_ver.h"
rm -f "$tmp_itf_ver"
fi
} |
process_patch "${s}.diff"
done
{
if [ -e scst/README_in-tree ]; then
add_file "scst/README_in-tree" "Documentation/scst/README.scst"
fi
add_file "scst/SysfsRules" "Documentation/scst/SysfsRules"
} | process_patch "scst_11_core_doc.diff"
# Directory drivers/scst/dev_handlers/
if [ -e "scst/kernel/in-tree/Makefile.dev_handlers-${kver}" ]; then
add_file "scst/kernel/in-tree/Makefile.dev_handlers-${kver}" \
"drivers/scst/dev_handlers/Makefile" \
| process_patch "scst_11_dev_handlers_makefile.diff"
else
add_file "scst/kernel/in-tree/Makefile.dev_handlers" \
"drivers/scst/dev_handlers/Makefile" \
| process_patch "scst_11_dev_handlers_makefile.diff"
fi
for f in scst/src/dev_handlers/*.[ch]; do
[ -e "$f" ] || continue
if ! in_separate_patch "${f}"; then
add_file "${f}" "drivers/scst/dev_handlers/${f#scst/src/dev_handlers/}"
fi
done \
| process_patch "scst_14_passthrough.diff"
# Directory drivers/scst/fcst/
(
if [ -e "${fcst_patch_series}" ]; then
grep -v '^#' "${fcst_patch_series}" |
while read -r f; do
cat "fcst/linux-patches/${f}"
done
fi
for f in fcst/Kbuild fcst/Makefile_in-tree; do
[ -e "$f" ] && add_file "$f" "drivers/scst/fcst/Makefile"
done
add_file "fcst/Kconfig" "drivers/scst/fcst/Kconfig"
for f in fcst/*.[ch]; do
[ -e "$f" ] || continue
add_file "${f}" "drivers/scst/fcst/${f#fcst/}"
done
) | process_patch "fcst.diff"
add_file "fcst/README" "Documentation/scst/README.fcst" \
| process_patch "fcst-doc.diff"
# Directory drivers/scst/iscsi-scst/
# Make sure the file iscsi-scst/iscsi_scst_itf_ver.h is up to date.
make -s -C iscsi-scst include/iscsi_scst_itf_ver.h
(
for f in iscsi-scst/include/*h; do
[ -e "$f" ] || continue
case "${f}" in
"iscsi-scst/include/iscsi_scst_itf_ver.h")
;;
"iscsi-scst/include/iscsit_transport.h")
add_file "${f}" "include/scst/${f#iscsi-scst/include/}"
;;
*)
add_file "${f}" "include/scst/${f#iscsi-scst/include/}"
;;
esac
done
add_file "iscsi-scst/include/iscsi_scst_itf_ver.h" "include/scst/iscsi_scst_itf_ver.h"
add_file "iscsi-scst/kernel/Makefile.in-kernel" \
"drivers/scst/iscsi-scst/Makefile"
add_file "iscsi-scst/kernel/Kconfig" "drivers/scst/iscsi-scst/Kconfig"
for f in iscsi-scst/kernel/*.[ch]; do
[ -e "$f" ] || continue
add_file "${f}" "drivers/scst/iscsi-scst/${f#iscsi-scst/kernel/}"
done
for f in iscsi-scst/kernel/isert-scst/*.[ch]; do
[ -e "$f" ] || continue
add_file "${f}" "drivers/scst/iscsi-scst/isert-scst/${f#iscsi-scst/kernel/isert-scst/}"
done
add_file "iscsi-scst/kernel/isert-scst/Makefile.in-kernel" "drivers/scst/iscsi-scst/isert-scst/Makefile"
add_file "iscsi-scst/kernel/isert-scst/Kconfig" "drivers/scst/iscsi-scst/isert-scst/Kconfig"
) | process_patch "iscsi-scst.diff"
add_file "iscsi-scst/README_in-tree" "Documentation/scst/README.iscsi" \
| process_patch "iscsi-scst-doc.diff"
# Directory drivers/scsi/qla2xxx/
if [ "${qla2x00t}" = "true" ]; then
( cd qla2x00t && "$PWD/generate-in-tree-patches" "${full_kver}" ) || exit $?
for f in qla2x00t/in-tree-patches/"${krel}"/*.patch; do
[ -e "$f" ] || continue
g="${f#qla2x00t/in-tree-patches/"${krel}"/}"
g="${g%.patch}"
add_patch "${f}" "drivers/scsi/qla2xxx/${g}"
done
add_file "qla2x00t/qla2x_tgt.h" \
"drivers/scsi/qla2xxx/qla2x_tgt.h"
add_file "qla2x00t/qla2x_tgt_def.h" \
"drivers/scsi/qla2xxx/qla2x_tgt_def.h"
for f in qla2x00t/qla2x00-target/*.[ch]; do
[ -e "$f" ] &&
add_file "${f}" "drivers/scsi/qla2xxx/${f#qla2x00t/qla2x00-target/}"
done
add_file "qla2x00t/qla2x00-target/README" \
"Documentation/scst/README.qla2x00t" \
| process_patch "qla2x00t-doc.diff"
elif [ "${qla2x00t_32gbit}" = "true" ]; then
( cd qla2x00t-32gbit && "$PWD/generate-in-tree-patches" "${full_kver}" ) || exit $?
for f in qla2x00t-32gbit/in-tree-patches/"${krel}"/*.patch; do
[ -e "$f" ] || continue
g="${f#qla2x00t-32gbit/in-tree-patches/"${krel}"/}"
g="${g%.patch}"
if [ "$g" = "qla.h" ]; then
add_patch "${f}" "include/trace/events/${g}"
else
add_patch "${f}" "drivers/scsi/qla2xxx/${g}"
fi
done
for f in qla2x00t-32gbit/qla2x00-target/*.[ch]; do
[ -e "$f" ] || continue
add_file "${f}" "drivers/scsi/qla2xxx/${f#qla2x00t-32gbit/qla2x00-target/}"
done
add_file "qla2x00t-32gbit/qla2x00-target/README" \
"Documentation/scst/README.qla2x00t" \
| process_patch "qla2x00t-doc.diff"
fi | process_patch "qla2x00t.diff"
# Directory drivers/scst/srpt
{
cat <<EOF
This patch adds the kernel module ib_srpt, which is a SCSI RDMA Protocol (SRP)
target implementation. This driver uses the InfiniBand stack and the SCST core.
It is a high performance driver capable of handling 600K+ 4K random write
IOPS by a single target as well as 2.5+ GB/s sequential throughput over
a single QDR IB port.
It was originally developed by Vu Pham (Mellanox) and has been optimized by
Bart Van Assche.
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Cc: Vu Pham <vu@mellanox.com>
Cc: Roland Dreier <rdreier@cisco.com>
Cc: David Dillow <dillowda@ornl.gov>
EOF
if [ "$srpt" = "true" ]; then
add_file "srpt/README_in-tree" "Documentation/scst/README.srpt"
add_file "srpt/src/Kconfig" "drivers/scst/srpt/Kconfig"
add_file "srpt/src/Makefile.in_kernel" "drivers/scst/srpt/Makefile"
for f in srpt/src/*.[ch]; do
[ -e "$f" ] || continue
add_file "${f}" "drivers/scst/srpt/${f#srpt/src/}"
done
else
add_empty_file "drivers/scst/srpt/Kconfig"
add_empty_file "drivers/scst/srpt/Makefile"
fi \
} | process_patch "scst_17_srpt.diff"
# Directory drivers/scst/scst_local
(
add_file "scst_local/README" "Documentation/scst/README.scst_local"
add_file "scst_local/in-tree/Kconfig" "drivers/scst/scst_local/Kconfig"
if [ -e "scst_local/in-tree/Makefile-${kver}" ]; then
add_file "scst_local/in-tree/Makefile-${kver}" "drivers/scst/scst_local/Makefile"
else
add_file "scst_local/in-tree/Makefile" "drivers/scst/scst_local/Makefile"
fi
add_file "scst_local/scst_local.c" "drivers/scst/scst_local/scst_local.c"
) | process_patch "scst_16_local.diff"