3 ############################################################################
5 # Script for converting the SCST source tree as it exists in the Subversion
6 # repository to a Linux kernel patch.
8 # Copyright (C) 2008 Bart Van Assche <bart.vanassche@gmail.com>
10 # This program is free software; you can redistribute it and/or
11 # modify it under the terms of the GNU General Public License
12 # as published by the Free Software Foundation, version 2
15 # This program is distributed in the hope that it will be useful,
16 # but WITHOUT ANY WARRANTY; without even the implied warranty of
17 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 # GNU General Public License for more details.
20 ############################################################################
22 ########################
23 # Function definitions #
24 ########################
27 echo "Usage: $0 [-h] [-m] [-p <dir>] [-q] <kernel version>, where: "
28 echo " -h - show this text"
29 echo " -m - add mpt target driver"
30 echo " -p - generate multiple patches instead of one big patch into"\
31 "the specified directory."
32 echo " -q - add qla2x00t driver"
35 # Convert an existing patch.
36 # $1: path of patch to be added.
37 # $2: path in kernel tree of file to be patched.
39 if [ ! -e "$1" ]; then
40 echo "Error: could not find $1." >&2
44 sed -e "s:^--- [^ ]*:--- orig/linux-${kernel_version}/$2:" \
45 -e "s:^+++ [^ ]*:+++ linux-${kernel_version}/$2:" \
49 # Generate a patch for a file to be added to the kernel source tree, and strip
50 # trailing whitespace from C source files while converting the file to patch
52 # $1: path of file to be added.
53 # $2: path in kernel tree where file should be added.
57 if [ ! -e "$1" ]; then
58 echo "Error: could not find $1." >&2
62 # Only include files that were not generated by the build process
64 if [ "$1" = "${1%.mod.c}" -a "$1" ]; then
66 diff -uprN orig/linux-${kernel_version}/$2 linux-${kernel_version}/$2
67 --- orig/linux-${kernel_version}/$2
68 +++ linux-${kernel_version}/$2
69 @@ -0,0 +1,$(wc -l "$1" | { read a b; echo $a; }) @@
71 if [ "${2%.[ch]}" != "$2" ]; then
72 sed -e 's/sBUG(/BUG(/g' -e 's/sBUG_ON(/BUG_ON(/g' -e 's/^/+/' \
73 -e 's/^ \([^ ]*:\)$/\1/' < "$1"
75 sed -e 's/sBUG(/BUG(/g' -e 's/sBUG_ON(/BUG_ON(/g' -e 's/^/+/' < "$1"
80 function add_empty_file {
84 diff -uprN orig/linux-${kernel_version}/$1 linux-${kernel_version}/$1
85 --- orig/linux-${kernel_version}/$1
86 +++ linux-${kernel_version}/$1
92 # Read a patch from stdin, specialize it for kernel version ${kernel_version}
93 # and write the output either to stdout or to the file $1 (if not empty),
94 # depending on the value of the variable ${multiple_patches}.
95 function process_patch {
96 if [ "${multiple_patches}" = "true" ]; then
97 if [ "$1" != "" ]; then
98 if [ -e "${patchdir}/$1" ]; then
99 echo "Warning: overwriting ${patchdir}/$1"
102 echo "Signed-off-by: ${SIGNED_OFF_BY}"
104 "$(dirname $0)/specialize-patch" -v kernel_version="${kernel_version}"
107 # echo "Discarded $(wc -l) lines."
111 "$(dirname $0)/specialize-patch" -v kernel_version="${kernel_version}"
115 # Returns 0 (true) if SCST core file "$1" should be added in a separate patch,
116 # and 1 (false) if not.
117 function in_separate_patch {
118 echo "${source_files_in_separate_patch}" | grep -qE "^$1 | $1 | $1\$"
122 #########################
123 # Argument verification #
124 #########################
129 multiple_patches="false"
132 if [ ! -e scst -o ! -e iscsi-scst -o ! -e srpt -o ! -e scst_local ]; then
133 echo "Please run this script from inside the SCST subversion source tree."
137 set -- $(/usr/bin/getopt hlmp:q "$@")
138 while [ "$1" != "${1#-}" ]
141 '-h') usage; exit 1;;
143 '-m') mpt_scst="true"; shift;;
144 '-p') multiple_patches="true"; patchdir="$2"; shift; shift;;
145 '-q') qla2x00t="true"; shift;;
156 if [ "${multiple_patches}" = "" ]; then
157 if [ -e "${patchdir}" ]; then
158 echo "Patch output directory ${patchdir} already exists."
160 if [ ! -d "${patchdir}" ]; then
161 echo "Error: ${patchdir} is not a directory."
170 # Strip patch level from the kernel version number.
171 if [ "${1#[0-9]*.[0-9]*.[0-9]*.[0-9]*}" != "$1" ]; then
172 kernel_version="${1%.[0-9]*}"
177 if [ "${multiple_patches}" = "false" ]; then
178 echo "Signed-off-by: ${SIGNED_OFF_BY}"
183 # General kernel patches.
185 process_patch < "scst/kernel/scst_exec_req_fifo-${kernel_version}.patch" \
186 "scst_exec_req_fifo.diff"
187 process_patch < "scst/kernel/export_alloc_io_context-${kernel_version}.patch" \
188 "export_alloc_io_context.diff"
189 process_patch < "iscsi-scst/kernel/patches/put_page_callback-${kernel_version}.patch" \
190 "put_page_callback.diff"
193 scst_debug="scst/include/scst_debug.h scst/src/scst_debug.c"
194 scst_sgv="scst/include/scst_sgv.h scst/src/scst_mem.h scst/src/scst_mem.c"
195 scst_user="scst/include/scst_user.h scst/src/dev_handlers/scst_user.c"
196 source_files_in_separate_patch="${scst_debug} ${scst_sgv} ${scst_user}"
199 # Directory include/scst/
201 for f in $(ls scst/include/*h)
203 if ! in_separate_patch "${f}"; then
204 add_file "${f}" "include/scst/${f#scst/include/}"
207 | process_patch "scst_public_headers.diff"
213 add_patch "scst/kernel/in-tree/Kconfig.drivers.Linux-${kernel_version}.patch" \
216 add_patch "scst/kernel/in-tree/Makefile.drivers.Linux-${kernel_version}.patch"\
219 | process_patch "misc.diff"
222 # Directory drivers/scst/
225 add_file "scst/kernel/in-tree/Kconfig.scst" "drivers/scst/Kconfig"
227 add_file "scst/kernel/in-tree/Makefile.scst" "drivers/scst/Makefile"
229 for f in $(ls scst/src/*.[ch])
231 if ! in_separate_patch "${f}"; then
232 add_file "${f}" "drivers/scst/${f#scst/src/}"
236 | process_patch "scst_core.diff"
238 for s in scst_debug scst_sgv scst_user
241 for f in $(set | sed -n -e "s/^$s='\(.*\)'\$/\1/p")
243 if [ "${f#scst/include}" != "${f}" ]; then
244 add_file "${f}" "include/scst/${f#scst/include/}"
246 add_file "${f}" "drivers/scst/${f#scst/src/}"
249 | process_patch "${s}.diff"
252 add_file "scst/README_in-tree" "Documentation/scst/README.scst" \
253 | process_patch "scst_core_doc.diff"
257 # Directory drivers/scst/dev_handlers/
260 add_file "scst/kernel/in-tree/Makefile.dev_handlers" \
261 "drivers/scst/dev_handlers/Makefile" \
262 | process_patch "dev_handlers_makefile.diff"
264 for f in $(ls scst/src/dev_handlers/*.[ch])
266 if ! in_separate_patch "${f}"; then
267 add_file "${f}" "drivers/scst/dev_handlers/${f#scst/src/dev_handlers/}"
271 | process_patch "scst_dev_handlers.diff"
274 # Directory drivers/scst/iscsi-scst/
276 # Make sure the file iscsi-scst/iscsi_scst_itf_ver.h is up to date.
277 make -s -C iscsi-scst include/iscsi_scst_itf_ver.h
280 for f in $(ls iscsi-scst/include/*h)
282 add_file "${f}" "include/scst/${f#iscsi-scst/include/}"
285 add_file "iscsi-scst/kernel/Makefile.in-kernel" \
286 "drivers/scst/iscsi-scst/Makefile"
288 add_file "iscsi-scst/kernel/Kconfig" "drivers/scst/iscsi-scst/Kconfig"
290 for f in $(ls iscsi-scst/kernel/*.[ch])
292 add_file "${f}" "drivers/scst/iscsi-scst/${f#iscsi-scst/kernel/}"
295 | process_patch "iscsi-scst.diff"
297 add_file "iscsi-scst/README_in-tree" "Documentation/scst/README.iscsi" \
298 | process_patch "iscsi-scst-doc.diff"
301 # Directory drivers/scst/qla2x00-target/
303 if [ "${qla2x00t}" = "true" ]; then
305 add_file "qla2x00t/qla2x00-target/Makefile_in-tree" \
306 "drivers/scst/qla2xxx-target/Makefile"
308 add_file "qla2x00t/qla2x00-target/Kconfig" \
309 "drivers/scst/qla2xxx-target/Kconfig"
311 # add_file "qla2x00t/qla2x_tgt_def.h" \
312 # "drivers/scst/qla2x00-target/qla2x_tgt_def.h"
314 add_file "qla2x00t/qla2x00-target/README" \
315 "Documentation/scst/README.qla2x00t"
317 for f in $(ls qla2x00t/qla2x00-target/*.[ch])
319 add_file "${f}" "drivers/scst/qla2xxx-target/${f#qla2x00t/qla2x00-target/}"
324 add_empty_file "drivers/scst/qla2xxx-target/Makefile"
326 add_empty_file "drivers/scst/qla2xxx-target/Kconfig"
329 | process_patch "qla2x00t.diff"
332 # Directory drivers/scst/srpt
334 if [ "$srpt" = "true" ]; then
336 add_file "srpt/src/Kconfig" "drivers/scst/srpt/Kconfig"
338 add_file "srpt/src/Makefile.in_kernel" "drivers/scst/srpt/Makefile"
340 for f in $(ls srpt/src/*.[ch])
342 add_file "${f}" "drivers/scst/srpt/${f#srpt/src/}"
347 add_empty_file "drivers/scst/srpt/Kconfig"
349 add_empty_file "drivers/scst/srpt/Makefile"
352 | process_patch "srpt.diff"
354 add_file "srpt/README" "Documentation/scst/README.srpt" \
355 | process_patch "srpt-doc.diff"
358 # Directory drivers/message/fusion/mpt_scst
360 if [ "$mpt_scst" = "true" ]; then
363 add_patch "mpt/in-tree/Kconfig-2.6.24.diff" "drivers/message/fusion/Kconfig"
365 add_patch "mpt/in-tree/Makefile.diff" "drivers/message/fusion/Makefile"
367 add_file "mpt/in-tree/Makefile" "drivers/message/fusion/mpt_scst/Makefile"
369 add_file "mpt/in-tree/Kconfig" "drivers/message/fusion/mpt_scst/Kconfig"
371 for f in $(ls mpt/*.[ch])
373 add_file "${f}" "drivers/message/fusion/mpt_scst/${f#mpt/}"
376 | process_patch "mpt_scst.diff"
381 add_empty_file "drivers/message/fusion/Kconfig"
383 add_empty_file "drivers/message/fusion/Makefile"
390 # Directory drivers/scst/scst_local
393 add_file "scst_local/in-tree/Kconfig" "drivers/scst/scst_local/Kconfig"
395 add_file "scst_local/in-tree/Makefile" "drivers/scst/scst_local/Makefile"
397 add_file "scst_local/scst_local.c" "drivers/scst/scst_local/scst_local.c"
399 | process_patch "scst_local.diff"
401 add_file "scst_local/README" "Documentation/scst/README.scst_local" \
402 | process_patch "scst_local-doc.diff"