Merge branch 'master' of ssh://www.aleph1.co.uk/home/aleph1/git/yaffs2
authorCharles Manning <cdhmanning@gmail.com>
Fri, 3 Sep 2010 04:11:52 +0000 (16:11 +1200)
committerCharles Manning <cdhmanning@gmail.com>
Fri, 3 Sep 2010 04:11:52 +0000 (16:11 +1200)
direct/basic-test/dtest.c
direct/basic-test/yaffsnewcfg.c
direct/yaffsfs.c
direct/yaffsfs.h
linux-tests/write_test.sh [new file with mode: 0755]
patch-ker.sh
yaffs_fs.c
yaffs_guts.c

index b9fc0eafe0fd36c3e6bbbd34a41eb357da6e37c4..3ac5604284dbd3c3a577aabc19c48d47f9685861 100644 (file)
@@ -22,6 +22,9 @@
 
 #include "yaffsfs.h"
 
+#include "yaffs_guts.h" /* Only for dumping device innards */
+
+extern int yaffs_traceMask;
 
 void dumpDir(const char *dname);
 
@@ -177,21 +180,22 @@ void create_file_of_size(const char *fn,int syze)
        int h;
        int n;
        int result;
-       
+       int iteration = 0;
        char xx[200];
-       
-       int iterations = (syze + strlen(fn) -1)/ strlen(fn);
-       
+
        h = yaffs_open(fn, O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE);
                
-       while (iterations > 0)
+       while (syze > 0)
        {
-               sprintf(xx,"%s %8d",fn,iterations);
+               sprintf(xx,"%s %8d",fn,iteration);
                n = strlen(xx);
                result = yaffs_write(h,xx,n);
-               if(result != n)
-                       printf("Wrote %d, should have been %d\n",result,n);
-               iterations--;
+               if(result != n){
+                       printf("Wrote %d, should have been %d. syze is %d\n",result,n,syze);
+                       syze = 0;
+               } else
+                       syze-=n;
+               iteration++;
        }
        yaffs_close (h);
 }
@@ -2639,7 +2643,48 @@ void big_xattr_test(const char *mountpt)
        list_xattr(name);
 
 }
+
+
+void dump_dev_stats(yaffs_Device *dev, const char * str)
+{
+       printf("%s\n",str);
+       printf( "space free %d erased %d "
+               "nand reads %d writes %d erases %d "
+               "gc all %d passive %d oldestdirty %d blocks %d copies %d \n",
+               dev->nFreeChunks, dev->nErasedBlocks * dev->param.nChunksPerBlock,
+               dev->nPageReads, dev->nPageWrites, dev->nBlockErasures,
+               dev->allGCs, dev->passiveGCs, dev->oldestDirtyGCs, dev->nGCBlocks, dev->nGCCopies);
+}
+
+void test_flash_traffic(const char *mountpt)
+{
+       char name0[100];
+       char name1[100];
+       int i;
+       yaffs_Device *dev;
+
+       yaffs_traceMask = 0;
+
+       yaffs_StartUp();
+
+       yaffs_mount(mountpt);
        
+       dev = yaffs_getdev(mountpt);
+
+       strcpy(name0,mountpt);
+       strcat(name0,"/x");
+
+       strcpy(name1,mountpt);
+       strcat(name1,"/y");
+
+       dump_dev_stats(dev,"start");
+       create_file_of_size(name0,32 * 1024 * 1024);
+       dump_dev_stats(dev,"32MB written");
+       for(i = 0; i < 20; i++)
+               create_file_of_size(name1,1024 * 1024);
+       dump_dev_stats(dev,"20x 1MB files written");
+
+}
 
 int random_seed;
 int simulate_power_failure;
@@ -2693,9 +2738,6 @@ int main(int argc, char *argv[])
        
        //link_test("/flash/flash");
        
-       
-       
-       
        // cache_bypass_bug_test();
        
         //free_space_check();
@@ -2705,7 +2747,9 @@ int main(int argc, char *argv[])
         //basic_xattr_test("/yaffs2");
         //big_xattr_test("/yaffs2");
 
-        null_name_test("yaffs2");
+        //null_name_test("yaffs2");
+
+        test_flash_traffic("yaffs2");
 
         return 0;
        
index 6ee43b78137cc454b05d342f7445742488212d93..fa993421caa4f8529c5f5d811b0092bab4f01193 100644 (file)
@@ -101,7 +101,7 @@ int yaffs_StartUp(void)
        // Stuff to configure YAFFS
        // Stuff to initialise anything special (eg lock semaphore).
        yaffsfs_LocalInitialisation();
-       yramsim_CreateRamSim("yaffs2",1,200,0,0);
+       yramsim_CreateRamSim("yaffs2",1,1000,0,0);
        yramsim_CreateRamSim("p0",0,0x400,1,0xff);
        yramsim_CreateRamSim("p1",0,0x400,1,0);
        
index b93f29534962ac909489f81cfcfd91a17532fdd1..9ac08abb15be867cd69da6e466cd54523cfbf57a 100644 (file)
@@ -1637,7 +1637,10 @@ int yaffs_mkdir(const YCHAR *path, mode_t mode)
 
        yaffsfs_Lock();
        parent = yaffsfs_FindDirectory(NULL,path,&name,0);
-       if(parent && parent->myDev->readOnly){
+       if(parent && yaffs_strnlen(name,5) == 0){
+               /* Trying to make the root itself */
+               yaffsfs_SetError(-EEXIST);
+       } else if(parent && parent->myDev->readOnly){
                yaffsfs_SetError(-EINVAL);
        } else {
                if(parent)
@@ -1660,6 +1663,14 @@ int yaffs_mkdir(const YCHAR *path, mode_t mode)
        return retVal;
 }
 
+void * yaffs_getdev(const YCHAR *path)
+{
+       yaffs_Device *dev=NULL;
+       YCHAR *dummy;
+       dev = yaffsfs_FindDevice(path,&dummy);
+       return (void *)dev;
+}
+
 int yaffs_mount2(const YCHAR *path,int readOnly)
 {
        int retVal=-1;
index 7961dff71ced4719bea2f5ed28bd9d40a0f970dd..4b2ebe94176c8c29e164a840a07bf226230710cd 100644 (file)
@@ -164,6 +164,10 @@ void yaffs_AddDevice(struct yaffs_DeviceStruct *dev);
 
 int yaffs_StartUp(void);
 
+
+/* Function only for debugging */
+void * yaffs_getdev(const YCHAR *path);
+
 #endif
 
 
diff --git a/linux-tests/write_test.sh b/linux-tests/write_test.sh
new file mode 100755 (executable)
index 0000000..7abe522
--- /dev/null
@@ -0,0 +1,22 @@
+#! /bin/bash
+
+TESTDIR=/mnt
+
+echo "start"
+echo " "
+cat /proc/yaffs
+
+for(( i=0; i < 32; i++ )); do
+dd of=$TESTDIR/$i if=/dev/urandom bs=1024 count=1024
+done
+
+echo "32 x 1MB written"
+cat /proc/yaffs
+for(( i=0; i < 32; i++ )); do
+dd of=$TESTDIR/xx if=/dev/urandom bs=1024 count=1024
+done
+
+echo "32 x 1MB overwites"
+cat /proc/yaffs
+
+
index 67e7a519487bcf891520ad9f3911990606245c82..ad92e7c4c36ae073db6f8283d8152201e03d62d5 100755 (executable)
@@ -12,7 +12,8 @@
 #
 # Patch YAFFS into the kernel
 #
-#  args:  kpath  : Full path to kernel sources to be patched
+#  args:  l/c : link or copy
+#        kpath  : Full path to kernel sources to be patched
 #
 #  Somewhat "inspired by" the mtd patchin script
 #
@@ -111,7 +112,9 @@ YAFFSDIR=$LINUXDIR/fs/yaffs2
 
 if [ -e $YAFFSDIR ]
 then
-   echo "$YAFFSDIR exists, not patching"
+   echo "$YAFFSDIR exists, not patching."
+   echo "If you want to replace what is already there then delete $YAFFSDIR"
+   echo " eg.  \"rm -rf $YAFFSDIR\" "
 else
    mkdir $LINUXDIR/fs/yaffs2
    $CPY  $PWD/Makefile.kernel $LINUXDIR/fs/yaffs2/Makefile
index 7c51041184350166bea88fbaa3628badd95103f8..ecf2bbe4d48bc458fff4396e663b8b1bc8a3e781 100644 (file)
 #define YPROC_ROOT  NULL
 #endif
 
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26))
+#define Y_INIT_TIMER(a)        init_timer(a)
+#else
+#define Y_INIT_TIMER(a)        init_timer_on_stack(a)
+#endif
+
 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
 #define WRITE_SIZE_STR "writesize"
 #define WRITE_SIZE(mtd) ((mtd)->writesize)
@@ -2358,7 +2364,7 @@ static int yaffs_BackgroundThread(void *data)
                if(time_before(expires,now))
                        expires = now + HZ;
 
-               init_timer_on_stack(&timer);
+               Y_INIT_TIMER(&timer);
                timer.expires = expires+1;
                timer.data = (unsigned long) current;
                timer.function = yaffs_background_waker;
index 389a57ca79f25efb475ef3e1311f3e6e4ab3c8b5..75eeb84cf3d5d23459d9897fa2b1fbc9e5b9c88c 100644 (file)
@@ -2435,7 +2435,16 @@ static unsigned yaffs_FindBlockForGarbageCollection(yaffs_Device *dev,
                        threshold = dev->param.nChunksPerBlock;
                        iterations = nBlocks;
                } else {
-                       int maxThreshold = dev->param.nChunksPerBlock/2;
+                       int maxThreshold;
+
+                       if(background)
+                               maxThreshold = dev->param.nChunksPerBlock/2;
+                       else
+                               maxThreshold = dev->param.nChunksPerBlock/8;
+
+                       if(maxThreshold <  YAFFS_GC_PASSIVE_THRESHOLD)
+                               maxThreshold = YAFFS_GC_PASSIVE_THRESHOLD;
+
                        threshold = background ?
                                (dev->gcNotDone + 2) * 2 : 0;
                        if(threshold <YAFFS_GC_PASSIVE_THRESHOLD)
@@ -2537,10 +2546,8 @@ static int yaffs_CheckGarbageCollection(yaffs_Device *dev, int background)
        int aggressive = 0;
        int gcOk = YAFFS_OK;
        int maxTries = 0;
-
        int minErased;
        int erasedChunks;
-
        int checkpointBlockAdjust;
 
        if(dev->param.gcControl &&
@@ -2568,6 +2575,9 @@ static int yaffs_CheckGarbageCollection(yaffs_Device *dev, int background)
                if (dev->nErasedBlocks < minErased)
                        aggressive = 1;
                else {
+                       if(!background && erasedChunks > (dev->nFreeChunks / 4))
+                               break;
+
                        if(dev->gcSkip > 20)
                                dev->gcSkip = 20;
                        if(erasedChunks < dev->nFreeChunks/2 ||