#!/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] [-m] [-p ] , where: " 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." } # 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 <"${patchdir}/$1" else # echo "Discarded $(wc -l) lines." true fi else "$(dirname $0)/specialize-patch" \ ${specialize_patch_options} \ -v kernel_version="${kernel_version}" \ -v SCSI_EXEC_REQ_FIFO_DEFINED="${scsi_exec_req_fifo_defined}" \ -v SCST_IO_CONTEXT="${scst_io_context}" 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 # ######################### qla2x00t="true" srpt="true" mpt_scst="false" multiple_patches="false" patchdir="" specialize_patch_options="-v delete_disabled_code=1" replace_sbug_by_bug="true" if [ ! -e scst -o ! -e iscsi-scst -o ! -e srpt -o ! -e scst_local ]; then echo "Please run this script from inside the SCST subversion source tree." exit 1 fi set -- $(/usr/bin/getopt hlmnp: "$@") while [ "$1" != "${1#-}" ] do case "$1" in '-h') usage; exit 1;; '-l') shift;; '-m') mpt_scst="true"; shift;; '-n') specialize_patch_options="-v delete_disabled_code=0" replace_sbug_by_bug="false" shift ;; '-p') multiple_patches="true"; patchdir="$2"; shift; shift;; '--') shift;; *) usage; exit 1;; esac done if [ $# != 1 ]; then usage exit 1 fi if [ "${multiple_patches}" = "" ]; then if [ -e "${patchdir}" ]; then echo "Patch output directory ${patchdir} already exists." fi if [ ! -d "${patchdir}" ]; then echo "Error: ${patchdir} is not a directory." fi fi #################### # Patch Generation # #################### # Strip patch level from the kernel version number. if [ "${1#[0-9]*.[0-9]*.[0-9]*.[0-9]*}" != "$1" ]; then kernel_version="${1%.[0-9]*}" else kernel_version="$1" fi if [ "${multiple_patches}" = "false" ]; then echo "Signed-off-by: ${SIGNED_OFF_BY}" echo "" fi # General kernel patches. scsi_exec_req_fifo_defined=0 scst_io_context=0 for p in scst/kernel/*-${kernel_version}.patch \ iscsi-scst/kernel/patches/*-${kernel_version}.patch do if grep -q '^\+#define SCSI_EXEC_REQ_FIFO_DEFINED$' "${p}"; then scsi_exec_req_fifo_defined=1 fi if grep -q '^\+#define SCST_IO_CONTEXT$' "${p}"; then scst_io_context=1 fi diffname="${p#scst/kernel/}" diffname="${p%-${kernel_version}.patch}.diff" process_patch < "$p" "${diffname}" done scst_debug="scst/include/scst_debug.h scst/src/scst_debug.c" scst_proc="scst/src/scst_proc.c" scst_sgv="scst/include/scst_sgv.h scst/src/scst_mem.h scst/src/scst_mem.c" scst_user="scst/include/scst_user.h scst/src/dev_handlers/scst_user.c" scst_vdisk="scst/src/dev_handlers/scst_vdisk.c" separate_patches="scst_debug scst_proc scst_sgv scst_user scst_vdisk" source_files_in_separate_patch="${scst_debug} ${scst_proc} ${scst_sgv} ${scst_user} ${scst_vdisk}" # Directory include/scst/ for f in $(ls scst/include/*h) do if ! in_separate_patch "${f}"; then add_file "${f}" "include/scst/${f#scst/include/}" fi done \ | process_patch "scst_public_headers.diff" # 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" ) \ | process_patch "misc.diff" # 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" for f in $(ls scst/src/*.[ch]) do if ! in_separate_patch "${f}"; then add_file "${f}" "drivers/scst/${f#scst/src/}" fi done ) \ | process_patch "scst_core.diff" for s in ${separate_patches} do fileset=$s for f in $(set | grep "^$s=" | sed -e "s/^$s='\(.*\)'\$/\1/" -e "s/^$s=\(.*\)\$/\1/") do if [ "${f#scst/include}" != "${f}" ]; then add_file "${f}" "include/scst/${f#scst/include/}" else add_file "${f}" "drivers/scst/${f#scst/src/}" fi done \ | process_patch "${s}.diff" done add_file "scst/README_in-tree" "Documentation/scst/README.scst" \ | process_patch "scst_core_doc.diff" # Directory drivers/scst/dev_handlers/ ( add_file "scst/kernel/in-tree/Makefile.dev_handlers" \ "drivers/scst/dev_handlers/Makefile" \ | process_patch "dev_handlers_makefile.diff" for f in $(ls scst/src/dev_handlers/*.[ch]) do if ! in_separate_patch "${f}"; then add_file "${f}" "drivers/scst/dev_handlers/${f#scst/src/dev_handlers/}" fi done ) \ | process_patch "scst_passthrough.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 $(ls iscsi-scst/include/*h) do if [ "${f}" != "iscsi-scst/include/iscsi_scst_itf_ver.h" ]; then add_file "${f}" "include/scst/${f#iscsi-scst/include/}" fi done add_file "iscsi-scst/include/iscsi_scst_itf_ver.h" "include/scst/iscsi_scst_itf_ver.h" | process_patch "" 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 ) \ | process_patch "iscsi-scst.diff" add_file "iscsi-scst/README_in-tree" "Documentation/scst/README.iscsi" \ | process_patch "iscsi-scst-doc.diff" # 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" for f in $(ls qla2x00t/qla2x00-target/*.[ch]) do add_file "${f}" "drivers/scst/qla2xxx-target/${f#qla2x00t/qla2x00-target/}" done add_file "qla2x00t/qla2x00-target/README" \ "Documentation/scst/README.qla2x00t" \ | process_patch "qla2x00t-doc.diff" else add_empty_file "drivers/scst/qla2xxx-target/Makefile" add_empty_file "drivers/scst/qla2xxx-target/Kconfig" fi \ | process_patch "qla2x00t.diff" # 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" 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 \ | process_patch "srpt.diff" add_file "srpt/README_in-tree" "Documentation/scst/README.srpt" \ | process_patch "srpt-doc.diff" # 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 ) \ | process_patch "mpt_scst.diff" fi # Directory drivers/scst/scst_local ( 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" ) \ | process_patch "scst_local.diff" add_file "scst_local/README" "Documentation/scst/README.scst_local" \ | process_patch "scst_local-doc.diff"