mirror of
https://github.com/SCST-project/scst.git
synced 2026-08-26 09:06:38 +00:00
Quote scalar arguments and use arrays for command option lists so paths and options retain their boundaries. Preserve intentional version-field splitting with narrow documented suppressions. Also handle GNU getopt output without losing quoted arguments and remove warnings about masked statuses, unused values and ambiguous test expressions.
620 lines
18 KiB
Bash
Executable File
620 lines
18 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
set -o pipefail
|
|
|
|
############################################################################
|
|
#
|
|
# Script for converting the SCST source tree as it exists in the Git
|
|
# 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
|
|
# Split the kernel^distro^release triplet into positional parameters.
|
|
# shellcheck disable=SC2086
|
|
set -- ${1//^/ }
|
|
local kver=$1
|
|
local distro=$2
|
|
local release=$3
|
|
# Split the distribution release into major and minor components.
|
|
# shellcheck disable=SC2086
|
|
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
|
|
# Split the kernel release into numeric components.
|
|
# shellcheck disable=SC2086
|
|
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 status tmppatch
|
|
if [ "${multiple_patches}" = "true" ]; then
|
|
if [ "$1" != "" ]; then
|
|
if [ -e "${patchdir}/$1" ]; then
|
|
echo "Warning: overwriting ${patchdir}/$1"
|
|
fi
|
|
tmppatch="$(/bin/mktemp)" || return $?
|
|
specialize_patch "${full_kver}" >"${tmppatch}"
|
|
status=$?
|
|
if [ "${status}" -ne 0 ]; then
|
|
rm -f "${tmppatch}"
|
|
return "${status}"
|
|
fi
|
|
{
|
|
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}"
|
|
else
|
|
cat "${tmppatch}"
|
|
fi
|
|
} \
|
|
> "${patchdir}/$(basename "$1")"
|
|
status=$?
|
|
rm -f "${tmppatch}"
|
|
return "${status}"
|
|
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 Git 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"
|
|
check_kernel_version "$full_kver" || exit $?
|
|
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."
|
|
exit 1
|
|
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" || exit $?
|
|
|
|
|
|
# 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" || exit $?
|
|
|
|
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" || exit $?
|
|
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" || exit $?
|
|
|
|
|
|
# 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" || exit $?
|
|
else
|
|
add_file "scst/kernel/in-tree/Makefile.dev_handlers" \
|
|
"drivers/scst/dev_handlers/Makefile" \
|
|
| process_patch "scst_11_dev_handlers_makefile.diff" || exit $?
|
|
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" || exit $?
|
|
|
|
|
|
# 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" || exit $?
|
|
|
|
add_file "fcst/README" "Documentation/scst/README.fcst" \
|
|
| process_patch "fcst-doc.diff" || exit $?
|
|
|
|
|
|
# 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 || exit $?
|
|
|
|
(
|
|
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" || exit $?
|
|
|
|
add_file "iscsi-scst/README_in-tree" "Documentation/scst/README.iscsi" \
|
|
| process_patch "iscsi-scst-doc.diff" || exit $?
|
|
|
|
|
|
# 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" || exit $?
|
|
|
|
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" || exit $?
|
|
|
|
fi | process_patch "qla2x00t.diff" || exit $?
|
|
|
|
|
|
# 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" || exit $?
|
|
|
|
|
|
# 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" || exit $?
|