#!/bin/bash ############################################################################ # # Script for converting the SCST source tree as it exists in the Subversion # repository to a Linux kernel patch. # # Copyright (C) 2008 Bart Van Assche # # 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 # ######################## function usage { echo "Usage: $0 [-h] [-l] [-m] [-q] [-s] , where: " echo " -h - show this text" echo " -l - add scst_local target driver" echo " -m - add mpt target driver" echo " -q - add qla2x00t driver" } # 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:^--- [^ ]*:--- orig/linux-${kernel_version}/$2:" \ -e "s:^+++ [^ ]*:+++ linux-${kernel_version}/$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}" -a "$1" ]; then cat <" echo "" kpatch=( \ "scst/kernel/scst_exec_req_fifo-${kernel_version}.patch" \ "iscsi-scst/kernel/patches/put_page_callback-${kernel_version}.patch" \ ) for p in "${kpatch[@]}" do if [ ! -e "$p" ]; then echo "Error: kernel version ${kernel_version} is not supported by SCST." echo "(could not find file $p)." exit 1 fi >&2 done # Redirect the output of all subsequent commands to the specialize-patch script trap "rm -f ${fifo}" EXIT fifo=/tmp/generate-kernel-patch-fifo.$$ rm -f "${fifo}" mkfifo "${fifo}" "$(dirname $0)/specialize-patch" -v kernel_version="${kernel_version}" \ < "${fifo}" & exec >"${fifo}" # General kernel patches. cat "${kpatch[@]}" # Directory include/scst/ for f in $(ls scst/include/*h) do add_file "${f}" "include/scst/${f#scst/include/}" done # Directory drivers/ add_patch "scst/kernel/in-tree/Kconfig.drivers.Linux-${kernel_version}.patch" \ "drivers/Kconfig" add_patch "scst/kernel/in-tree/Makefile.drivers.Linux-${kernel_version}.patch"\ "drivers/Makefile" # Directory drivers/scst/ add_file "scst/kernel/in-tree/Kconfig.scst" "drivers/scst/Kconfig" add_file "scst/kernel/in-tree/Makefile.scst" "drivers/scst/Makefile" add_file "scst/README_in-tree" "Documentation/scst/README.scst" for f in $(ls scst/src/*.[ch]) do add_file "${f}" "drivers/scst/${f#scst/src/}" done # Directory drivers/scst/dev_handlers/ add_file "scst/kernel/in-tree/Makefile.dev_handlers" \ "drivers/scst/dev_handlers/Makefile" for f in $(ls scst/src/dev_handlers/*.[ch]) do add_file "${f}" "drivers/scst/dev_handlers/${f#scst/src/dev_handlers/}" done # 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 $(ls iscsi-scst/include/*h) do add_file "${f}" "include/scst/${f#iscsi-scst/include/}" done 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 $(ls iscsi-scst/kernel/*.[ch]) do add_file "${f}" "drivers/scst/iscsi-scst/${f#iscsi-scst/kernel/}" done # Directory drivers/scst/qla2x00-target/ if [ "${qla2x00t}" = "true" ]; then add_file "qla2x00t/qla2x00-target/Makefile_in-tree" \ "drivers/scst/qla2xxx-target/Makefile" add_file "qla2x00t/qla2x00-target/Kconfig" \ "drivers/scst/qla2xxx-target/Kconfig" add_file "qla2x00t/qla2x_tgt_def.h" \ "drivers/scst/qla2x00-target/qla2x_tgt_def.h" add_file "qla2x00t/qla2x00-target/README" \ "Documentation/scst/README.qla2x00t" for f in $(ls qla2x00t/qla2x00-target/*.[ch]) do add_file "${f}" "drivers/scst/qla2xxx-target/${f#qla2x00t/qla2x00-target/}" done else add_empty_file "drivers/scst/qla2xxx-target/Makefile" add_empty_file "drivers/scst/qla2xxx-target/Kconfig" fi # Directory drivers/scst/srpt if [ "$srpt" = "true" ]; then add_file "srpt/src/Kconfig" "drivers/scst/srpt/Kconfig" add_file "srpt/src/Makefile.in_kernel" "drivers/scst/srpt/Makefile" add_file "srpt/README" "Documentation/scst/README.srpt" for f in $(ls srpt/src/*.[ch]) do 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 # Directory drivers/message/fusion/mpt_scst if [ "$mpt_scst" = "true" ]; then add_patch "mpt/in-tree/Kconfig-2.6.24.diff" "drivers/message/fusion/Kconfig" add_patch "mpt/in-tree/Makefile.diff" "drivers/message/fusion/Makefile" add_file "mpt/in-tree/Makefile" "drivers/message/fusion/mpt_scst/Makefile" add_file "mpt/in-tree/Kconfig" "drivers/message/fusion/mpt_scst/Kconfig" for f in $(ls mpt/*.[ch]) do add_file "${f}" "drivers/message/fusion/mpt_scst/${f#mpt/}" done else add_empty_file "drivers/message/fusion/Kconfig" add_empty_file "drivers/message/fusion/Makefile" fi # Directory drivers/scst/scst-local if [ "$scst_local" = "true" ]; then add_file "scst_local/in-tree/Kconfig" "drivers/scst/scst_local/Kconfig" add_file "scst_local/in-tree/Makefile" "drivers/scst/scst_local/Makefile" add_file "scst_local/scst_local.c" "drivers/scst/scst_local/scst_local.c" else add_empty_file "drivers/scst/scst_local/Kconfig" add_empty_file "drivers/scst/scst_local/Makefile" fi