#include "yaffsfs.h"
+#include "yaffs_guts.h" /* Only for dumping device innards */
+
+extern int yaffs_traceMask;
void dumpDir(const char *dname);
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);
}
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;
//link_test("/flash/flash");
-
-
-
// cache_bypass_bug_test();
//free_space_check();
//basic_xattr_test("/yaffs2");
//big_xattr_test("/yaffs2");
- null_name_test("yaffs2");
+ //null_name_test("yaffs2");
+
+ test_flash_traffic("yaffs2");
return 0;
// 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);
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)
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;
int yaffs_StartUp(void);
+
+/* Function only for debugging */
+void * yaffs_getdev(const YCHAR *path);
+
#endif
--- /dev/null
+#! /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
+
+
#
# 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
#
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
#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)
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;
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)
int aggressive = 0;
int gcOk = YAFFS_OK;
int maxTries = 0;
-
int minErased;
int erasedChunks;
-
int checkpointBlockAdjust;
if(dev->param.gcControl &&
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 ||