yaffs direct: Check paths for length
[yaffs2.git] / patch-ker.sh
1 #!/bin/sh
2 #
3 # YAFFS: Yet another FFS. A NAND-flash specific file system.
4 #
5 # Copyright (C) 2002-2010 Aleph One Ltd.
6 #
7 # Created by Charles Manning <charles@aleph1.co.uk>
8 #
9 # This program is free software; you can redistribute it and/or modify
10 # it under the terms of the GNU General Public License version 2 as
11 # published by the Free Software Foundation.
12 #
13 # Patch YAFFS into the kernel
14 #
15 #  args:  l/c : link or copy
16 #         kpath  : Full path to kernel sources to be patched
17 #
18 #  Somewhat "inspired by" the mtd patchin script
19 #
20
21 VERSION=0
22 PATCHLEVEL=0
23 SUBLEVEL=0
24 COPYORLINK=$1
25 MULTIORSINGLE=$2
26 LINUXDIR=$3
27
28 # To be a Linux directory, it must have a Makefile
29
30
31 # Display usage of this script
32 usage () {
33         echo "usage:  $0  c/l m/s kernelpath"
34         echo " if c/l is c, then copy. If l then link"
35         echo " if m/s is m, then use multi version code. If s then use single version code"
36         exit 1
37 }
38
39
40
41 if [ -z $LINUXDIR ]
42 then
43     usage;
44 fi
45
46 if [ $COPYORLINK = l ]; then
47    CPY="ln -s"
48 elif [ $COPYORLINK = c ]; then
49    CPY="cp"
50 else
51    echo "unknown copy or link type"
52    usage;
53 fi
54
55 if [ $MULTIORSINGLE = m ]; then
56    VFS_CODE="yaffs_vfs_multi.c"
57    MTD1_CODE="yaffs_mtdif1_multi.c"
58    MTD2_CODE="yaffs_mtdif2_multi.c"
59    YPORTENV="yportenv_multi.h"
60 elif [ $MULTIORSINGLE = s ]; then
61    VFS_CODE="yaffs_vfs_single.c"
62    MTD1_CODE="yaffs_mtdif1_single.c"
63    MTD2_CODE="yaffs_mtdif2_single.c"
64    YPORTENV="yportenv_single.h"
65
66    echo ""
67    echo "*** Warning ***"
68    echo "You have chosen to use the single kernel variant of the yaffs VFS glue code"
69    echo "that only works with the latest Linux kernel tree. If you are using an older"
70    echo "version of Linux then you probably wanted to use the multi-version variant by"
71    echo "re-running the patch-ker.sh script using m as a the second argument."
72    echo " ie $0 $COPYORLINK m $LINUXDIR"
73    echo ""
74 else
75    echo "unknown multi/single version selection"
76    usage;
77 fi
78
79
80 # Check if kerneldir contains a Makefile
81 if [ ! -f $LINUXDIR/Makefile ]
82 then
83         echo "Directory $LINUXDIR does not exist or is not a kernel source directory";
84         exit 1;
85 fi
86
87 # Get kernel version
88 VERSION=`grep -s VERSION <$LINUXDIR/Makefile | head -n 1 | sed s/'VERSION = '//`
89 PATCHLEVEL=`grep -s PATCHLEVEL <$LINUXDIR/Makefile | head -n 1 | sed s/'PATCHLEVEL = '//`
90 SUBLEVEL=`grep -s SUBLEVEL <$LINUXDIR/Makefile | head -n 1 | sed s/'SUBLEVEL = '//`
91
92 # Can we handle this version?
93 if [ $VERSION -ne 2  -o $PATCHLEVEL -lt 6  ]
94 then
95         echo "Cannot patch kernel version $VERSION.$PATCHLEVEL.$SUBLEVEL, must be 2.6.x or higher"
96         exit 1;
97 fi
98
99
100 KCONFIG=$LINUXDIR/fs/Kconfig
101 KCONFIGOLD=$LINUXDIR/fs/Kconfig.pre.yaffs
102 YAFFS_PATCHED_STRING=`grep -s yaffs <$KCONFIG | head -n 1`
103
104 MAKEFILE=$LINUXDIR/fs/Makefile
105 MAKEFILEOLD=$LINUXDIR/fs/Makefile.pre.yaffs
106
107 if [ ! -z "$YAFFS_PATCHED_STRING" ]
108 then
109     YAFFS_PATCHED=0
110     echo "$KCONFIG already mentions YAFFS, so we will not change it"
111 else
112    # Change the fs/Kconfig file
113    # Save the old Kconfig
114    # Copy all stuff up to JFFS
115    # Insert some YAFFS stuff
116    # Copy all the rest of the stuff
117
118     YAFFS_PATCHED=1
119     echo "Updating $KCONFIG"
120     mv -f $KCONFIG  $KCONFIGOLD
121     sed -n -e "/[Jj][Ff][Ff][Ss]/,99999 ! p" $KCONFIGOLD >$KCONFIG
122     # echo "">>$KCONFIG
123     # echo "# Patched by YAFFS" >>$KCONFIG
124     echo "source \"fs/yaffs2/Kconfig\"">>$KCONFIG
125     # echo "">>$KCONFIG
126     sed -n -e "/[Jj][Ff][Ff][Ss]/,99999 p" $KCONFIGOLD >>$KCONFIG
127
128    # now do fs/Makefile -- simply add the target at the end
129     echo "Updating $MAKEFILE"
130     cp -f $MAKEFILE $MAKEFILEOLD
131     # echo "">>$MAKEFILE
132     # echo "# Patched by YAFFS" >>$MAKEFILE
133     echo "obj-\$(CONFIG_YAFFS_FS)               += yaffs2/" >>$MAKEFILE
134
135 fi
136
137 YAFFSDIR=$LINUXDIR/fs/yaffs2
138
139 if [ -e $YAFFSDIR ]
140 then
141    echo "$YAFFSDIR exists, so not patching. If you want to replace what is"
142    echo "already there then delete $YAFFSDIR and re-run this script"
143    echo " eg.  \"rm -rf $YAFFSDIR\" "
144 else
145    rm yaffs*.mod.c
146    mkdir $LINUXDIR/fs/yaffs2
147    $CPY  $PWD/Makefile.kernel $LINUXDIR/fs/yaffs2/Makefile
148    $CPY $PWD/Kconfig $LINUXDIR/fs/yaffs2
149    $CPY $PWD/*.c $PWD/*.h  $LINUXDIR/fs/yaffs2
150    rm $LINUXDIR/fs/yaffs2/yaffs_vfs*.c $LINUXDIR/fs/yaffs2/yaffs_mtdif[12]*.c
151    rm $LINUXDIR/fs/yaffs2/yportenv*.h
152    rm $LINUXDIR/fs/yaffs2/moduleconfig.h
153    $CPY $PWD/$VFS_CODE $LINUXDIR/fs/yaffs2/yaffs_vfs.c
154    $CPY $PWD/$MTD1_CODE $LINUXDIR/fs/yaffs2/yaffs_mtdif1.c
155    $CPY $PWD/$MTD2_CODE $LINUXDIR/fs/yaffs2/yaffs_mtdif2.c
156    $CPY $PWD/$YPORTENV $LINUXDIR/fs/yaffs2/yportenv.h
157 fi