New partial block handing to improve robustness
[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-2006 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:  kpath  : Full path to kernel sources to be patched
16 #
17 #  Somewhat "inspired by" the mtd patchin script
18 #
19 #  $Id: patch-ker.sh,v 1.5 2009-01-22 00:44:46 charles Exp $
20
21 VERSION=0
22 PATCHLEVEL=0
23 SUBLEVEL=0
24 COPYORLINK=$1
25 LINUXDIR=$2
26
27 # To be a Linux directory, it must have a Makefile
28
29
30 # Display usage of this script
31 usage () {
32         echo "usage:  $0  c/l kernelpath"
33         echo " if c/l is c, then copy. If l then link"
34         exit 1
35 }
36
37
38
39 if [ -z $LINUXDIR ]
40 then
41     usage;
42 fi
43
44 if [ $COPYORLINK = l ]; then
45    CPY="ln -s"
46 elif [ $COPYORLINK = c ]; then
47    CPY="cp"
48 else
49    echo "unknown copy or link type"
50    usage;
51 fi
52
53
54 # Check if kerneldir contains a Makefile
55 if [ ! -f $LINUXDIR/Makefile ]
56 then
57         echo "Directory $LINUXDIR does not exist or is not a kernel source directory";
58         exit 1;
59 fi
60
61 # Get kernel version
62 VERSION=`grep -s VERSION <$LINUXDIR/Makefile | head -n 1 | sed s/'VERSION = '//`
63 PATCHLEVEL=`grep -s PATCHLEVEL <$LINUXDIR/Makefile | head -n 1 | sed s/'PATCHLEVEL = '//`
64 SUBLEVEL=`grep -s SUBLEVEL <$LINUXDIR/Makefile | head -n 1 | sed s/'SUBLEVEL = '//`
65
66 # Can we handle this version?
67 if [ $VERSION -ne 2  -o $PATCHLEVEL -lt 6  ]
68 then
69         echo "Cannot patch kernel version $VERSION.$PATCHLEVEL.$SUBLEVEL, must be 2.6.x or higher"
70         exit 1;
71 fi
72
73
74 KCONFIG=$LINUXDIR/fs/Kconfig
75 KCONFIGOLD=$LINUXDIR/fs/Kconfig.pre.yaffs
76 YAFFS_PATCHED_STRING=`grep -s yaffs <$KCONFIG | head -n 1`
77
78 MAKEFILE=$LINUXDIR/fs/Makefile
79 MAKEFILEOLD=$LINUXDIR/fs/Makefile.pre.yaffs
80
81 if [ ! -z "$YAFFS_PATCHED_STRING" ]
82 then
83     YAFFS_PATCHED=0
84     echo "$KCONFIG already mentions YAFFS, so we will not change it"
85 else
86    # Change the fs/Kconfig file
87    # Save the old Kconfig
88    # Copy all stuff up to JFFS
89    # Insert some YAFFS stuff
90    # Copy all the rest of the stuff
91
92     YAFFS_PATCHED=1
93     echo "Updating $KCONFIG"
94     mv -f $KCONFIG  $KCONFIGOLD
95     sed -n -e "/[Jj][Ff][Ff][Ss]/,99999 ! p" $KCONFIGOLD >$KCONFIG
96     echo "">>$KCONFIG
97     echo "# Patched by YAFFS" >>$KCONFIG
98     echo "source \"fs/yaffs2/Kconfig\"">>$KCONFIG
99     echo "">>$KCONFIG
100     sed -n -e "/[Jj][Ff][Ff][Ss]/,99999 p" $KCONFIGOLD >>$KCONFIG
101
102    # now do fs/Makefile -- simply add the target at the end
103     echo "Updating $MAKEFILE"
104     cp -f $MAKEFILE $MAKEFILEOLD
105     echo "">>$MAKEFILE
106     echo "# Patched by YAFFS" >>$MAKEFILE
107     echo "obj-\$(CONFIG_YAFFS_FS)               += yaffs2/" >>$MAKEFILE
108
109 fi
110
111 YAFFSDIR=$LINUXDIR/fs/yaffs2
112
113 if [ -e $YAFFSDIR ]
114 then
115    echo "$YAFFSDIR exists, not patching"
116 else
117    mkdir $LINUXDIR/fs/yaffs2
118    $CPY  $PWD/Makefile.kernel $LINUXDIR/fs/yaffs2/Makefile
119    $CPY $PWD/Kconfig $LINUXDIR/fs/yaffs2
120    $CPY $PWD/*.c $PWD/*.h  $LINUXDIR/fs/yaffs2
121 fi