| #!/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] [-m] [-n] [-p <dir>] [-s] [-u] <kernel version>" | |
| echo "where: " | |
| echo " -d - enable patch specialization debugging" | |
| echo " -h - show this text" | |
| echo " -m - add mpt target driver" | |
| 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) | |
| 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 "$1")" | |
| # Include fcst in the patch for kernel versions 2.6.33 and later. | |
| if kernel_version_le "2.6.37" "${kver}"; then | |
| include_fcst="true" | |
| else | |
| include_fcst="false" | |
| fi | |
| # See also commit 89d9a567952b ("[SCSI] add support for per-host cmd pools"; | |
| # v3.15). | |
| if kernel_version_lt "$kver" 3.15; 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 | |
| # Make sure that for kernel 2.6.26 and later the line | |
| # "#define CONFIG_SCST_PROC" is removed from scst/include/scst.h. | |
| if grep -qw scst_sysfs scst/kernel/in-tree/${scst_makefile} \ | |
| || [ "${generating_upstream_patch}" = "true" ]; | |
| then | |
| specialize_patch_options+=(-v "config_scst_proc_undefined=1") | |
| else | |
| include_proc_impl="true" | |
| 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_module.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_proc="scst/src/scst_proc.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_proc $scst_10_sgv $scst_user $scst_13_vdisk $scst_14_tg" >/dev/null | |
| if [ "$include_proc_impl" = "true" ]; then | |
| separate_patches+=" scst_proc" | |
| fi | |
| 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 [ "${full_kver#2.6.32-}" = "${full_kver}" ] && | |
| [ -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}" | |
| # shellcheck disable=SC2002 | |
| cat "scst/kernel/in-tree/Kconfig.scst" | \ | |
| if [ "${include_fcst}" = true ]; then | |
| cat | |
| else | |
| grep -v '^source "drivers/scst/fcst/Kconfig"$' | |
| fi >"${tmp_Kconfig}" | |
| add_file "${tmp_Kconfig}" "drivers/scst/Kconfig" | |
| tmp_Makefile="${tmpdir}/${scst_makefile}" | |
| # shellcheck disable=SC2002 | |
| cat "scst/kernel/in-tree/${scst_makefile}" | \ | |
| if [ "$include_proc_impl" != "true" ]; then | |
| grep -v 'scst_proc' | |
| else | |
| cat | |
| fi | \ | |
| if [ "${include_fcst}" = true ] && [ "${kver}" != "2.6.37" ] && | |
| [ "${kver}" != "2.6.38" ]; then | |
| cat | |
| else | |
| sed -e 's: fcst/* : :' | |
| fi >"$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 [ "${include_fcst}" = true ]; then | |
| 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 | |
| fi \ | |
| | 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" "$1" ) || exit $? | |
| for f in qla2x00t/in-tree-patches/"$1"/*.patch; do | |
| [ -e "$f" ] || continue | |
| g="${f#qla2x00t/in-tree-patches/$1/}" | |
| 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" "$1" ) || exit $? | |
| for f in qla2x00t-32gbit/in-tree-patches/"$1"/*.patch; do | |
| [ -e "$f" ] || continue | |
| g="${f#qla2x00t-32gbit/in-tree-patches/$1/}" | |
| 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" | |
| # Directory drivers/scsi/ibmvstgt | |
| { | |
| ( cd ibmvstgt 2>/dev/null && ./generate-in-tree-patches "${kver}" ) && | |
| if [ -e "ibmvstgt/in-tree-patches/${kver}" ]; then | |
| if [ "${multiple_patches}" = "true" ]; then | |
| cat <<EOF | |
| [SCSI] ibmvstgt: Port from tgt to SCST | |
| The ibmvstgt and libsrp kernel modules as included in the 2.6.37 kernel are | |
| based on the tgt SCSI target framework. Both kernel modules need the scsi_tgt | |
| kernel module and the tgtd user space process in order to function | |
| properly. This patch modifies the ibmvstgt and libsrp kernel modules such that | |
| both use the SCST storage target framework instead of tgt. As a result, | |
| neither the scsi_tgt kernel module nor the tgtd user space process are any | |
| more necessary when using the ibmvstgt driver. | |
| This patch introduces one backwards-incompatible change, namely that the path | |
| of the ibmvstgt sysfs attributes is modified. This change is unavoidable | |
| because this patch dissociates ibmvstgt SRP sessions from a SCSI host | |
| instance. Since the user space STGT driver ibmvio was the only user of | |
| these attributes, that shouldn't be an issue. | |
| Changes in ibmvstgt compared to kernel 2.6.36: | |
| - Increased maximum data size for a single SRP command from 128 KB to 64 MB | |
| such that an initiator is not forced to split large transfers into | |
| multiple SCSI commands. | |
| - The maximum RDMA transfer size supported by a single H_COPY_RDMA call is | |
| queried at driver initialization time from the open firmware tree / larger | |
| transfers than 128 KB are now supported too. | |
| - If DMA mapping fails while handling a READ or WRITE command, the offending | |
| command is retried until the associated data has been transferred instead of | |
| reporting to the ibmvscsi client that the SCSI command failed. | |
| - VSCSI command/response queue: one element has been reserved for management | |
| datagrams since these fall outside the SRP credit mechanism. Added a compile- | |
| time check whether the size of this queue is a power of two. | |
| - Fixed a race condition which in theory could have caused the VSCSI receive | |
| queue to overflow: srp_iu_put() is now invoked before a response is sent back | |
| to the initiator instead of after. | |
| - Moved enum iue_flags from libsrp to ibmvstgt because it is ibmvstgt-specific. | |
| - Removed a variable that was modified but never read from ibmvstgt_rdma(). | |
| - ibmvstgt_probe(): changed the datatype of the variable "dma" from | |
| unsigned * into const unsigned * such that a cast could be removed. | |
| - Fixed all compiler and sparse warnings (C=2 CF=-D__CHECK_ENDIAN__). | |
| Changes in libsrp compared to kernel 2.6.36: | |
| - Renamed vscsis_data_length() into srp_data_length() and exported | |
| this function. | |
| - All error messages reported via printk() do now have prefix KERN_ERR. | |
| - modified srp_target_alloc() and srp_target_free() such that the | |
| driver-private data reflects whether or not target data has been allocated. | |
| This change was necessary to avoid that ibmvstgt_remove() triggers a | |
| NULL-pointer dereference if ibmvstgt_probe() failed. | |
| - srp_transfer_data(): All three return statements related to DMA mapping | |
| failure do now return -ENOMEM instead of 0, -EIO and -ENOMEM. | |
| - srp_direct_data(): Removed the ext_desc argument since not used. | |
| - srp_direct_data() and srp_indirect_data(): Use DMA_TO/FROM_DEVICE | |
| instead of DMA_BIDIRECTIONAL for the buffers mapped for transferring data | |
| via DMA. | |
| - struct srp_target: eliminated the information unit linked list and also the | |
| V_FLYING flag since both were duplicating information managed by the SCST | |
| core. | |
| - Fixed all compiler and sparse warnings (C=2 CF=-D__CHECK_ENDIAN__). | |
| Tests performed on a backport to kernel version 2.6.18 of this driver with a | |
| Linux initiator system: | |
| - Verified that the kernel module ibmvstgt loads and initializes successfully | |
| and also that the client connects after loading. | |
| - Verified that all virtual disks configured in scst_vdisk were discovered by | |
| the client after rescanning the SCSI bus. | |
| - Verified that after unloading and reloading ibmvstgt and after client | |
| recovery that the initiator devices were functioning normally. | |
| - Verified that after a client reboot ibmvscsic reconnected with the target | |
| and that the target devices were again usable. | |
| - Performed IO stress testing on the device. | |
| - Verified that SCSI task abortion works correctly. | |
| - Performed basic I/O performance testing. With a RAM disk as target linear | |
| direct I/O throughput was above 2 GB/s and a random I/O test resulted in | |
| about 30000 IOPS for all block sizes between 512 bytes and 16 KB. | |
| Both initiator and target were dual core POWER6 LPAR systems. | |
| Note: ibmvstgt is the only user of libsrp. | |
| Signed-off-by: Bart Van Assche <bvanassche@acm.org> | |
| Cc: Fujita Tomonori <fujita.tomonori@lab.ntt.co.jp> | |
| Cc: Brian King <brking@linux.vnet.ibm.com> | |
| Cc: Robert Jennings <rcj@linux.vnet.ibm.com> | |
| EOF | |
| fi | |
| for f in \ | |
| drivers/scsi/ibmvscsi/ibmvstgt.c \ | |
| drivers/scsi/libsrp.c \ | |
| include/scsi/libsrp.h \ | |
| include/scsi/srp.h | |
| do | |
| patch="ibmvstgt/in-tree-patches/${kver}/$(basename $f).patch" | |
| if [ -e "${patch}" ]; then | |
| add_patch "${patch}" $f | |
| fi | |
| done | |
| add_file "ibmvstgt/README.sysfs" "Documentation/powerpc/ibmvstgt.txt" | |
| fi | |
| } \ | |
| | process_patch "scst_18_ibmvstgt.diff" | |
| { | |
| ( cd ibmvstgt 2>/dev/null && ./generate-in-tree-patches "${kver}" ) && | |
| if [ -e "ibmvstgt/in-tree-patches/${kver}" ]; then | |
| if [ "${multiple_patches}" = "true" ]; then | |
| cat <<EOF | |
| [SCSI] tgt: Removal | |
| Because of the conversion of the ibmvstgt driver from tgt to SCST, and because | |
| the ibmvstgt driver was the only user of scsi_tgt, the scsi_tgt kernel module, | |
| the CONFIG_SCSI_TGT, CONFIG_SCSI_SRP_TGT_ATTRS and CONFIG_SCSI_FC_TGT_ATTRS | |
| kbuild variable, the scsi_host_template member variables transfer_response, | |
| supportedmode and active_mode and the constants MODE_UNKNOWN, MODE_INITIATOR | |
| and MODE_TARGET are no longer needed. | |
| Note: this patch applies cleanly on a 2.6.35 kernel tree. The patch tool | |
| however complains about the defconfig changes when trying to apply this patch | |
| on a 2.6.36 kernel tree. | |
| Signed-off-by: Bart Van Assche <bvanassche@acm.org> | |
| EOF | |
| fi | |
| for f in \ | |
| arch/arm/configs/at572d940hfek_defconfig \ | |
| arch/arm/configs/cam60_defconfig \ | |
| arch/arm/configs/s3c2410_defconfig \ | |
| arch/m68k/configs/amiga_defconfig \ | |
| arch/m68k/configs/apollo_defconfig \ | |
| arch/m68k/configs/atari_defconfig \ | |
| arch/m68k/configs/bvme6000_defconfig \ | |
| arch/m68k/configs/hp300_defconfig \ | |
| arch/m68k/configs/mac_defconfig \ | |
| arch/m68k/configs/multi_defconfig \ | |
| arch/m68k/configs/mvme147_defconfig \ | |
| arch/m68k/configs/mvme16x_defconfig \ | |
| arch/m68k/configs/q40_defconfig \ | |
| arch/m68k/configs/sun3_defconfig \ | |
| arch/m68k/configs/sun3x_defconfig \ | |
| arch/mips/configs/bcm47xx_defconfig \ | |
| arch/mips/configs/decstation_defconfig \ | |
| arch/mips/configs/ip22_defconfig \ | |
| arch/mips/configs/ip27_defconfig \ | |
| arch/mips/configs/ip32_defconfig \ | |
| arch/mips/configs/jazz_defconfig \ | |
| arch/mips/configs/malta_defconfig \ | |
| arch/mips/configs/markeins_defconfig \ | |
| arch/mips/configs/pnx8550-jbs_defconfig \ | |
| arch/mips/configs/pnx8550-stb810_defconfig \ | |
| arch/mips/configs/rm200_defconfig \ | |
| arch/mips/configs/tb0226_defconfig \ | |
| arch/mips/configs/tb0287_defconfig \ | |
| arch/powerpc/configs/52xx/motionpro_defconfig \ | |
| arch/powerpc/configs/86xx/mpc8610_hpcd_defconfig \ | |
| arch/powerpc/configs/mpc5200_defconfig \ | |
| drivers/scsi/Kconfig \ | |
| drivers/scsi/Makefile \ | |
| drivers/scsi/hosts.c \ | |
| drivers/scsi/scsi_sysfs.c \ | |
| drivers/scsi/scsi_tgt_if.c \ | |
| drivers/scsi/scsi_tgt_lib.c \ | |
| drivers/scsi/scsi_tgt_priv.h \ | |
| drivers/scsi/scsi_transport_fc.c \ | |
| drivers/scsi/scsi_transport_fc_internal.h \ | |
| drivers/scsi/scsi_transport_srp.c \ | |
| drivers/scsi/scsi_transport_srp_internal.h \ | |
| include/scsi/scsi_host.h \ | |
| include/scsi/scsi_tgt.h \ | |
| include/scsi/scsi_tgt_if.h | |
| do | |
| add_patch "ibmvstgt/in-tree-patches/${kver}/$(basename $f).patch" $f | |
| done | |
| fi | |
| } \ | |
| | process_patch "scst_19_scsi_tgt.diff" |