#endif
+void (*ext_fatal)(void) = NULL;
+
static unsigned powerUps;
static unsigned cycleStarts;
static unsigned cycleEnds;
MakeName(fullTempMainName,prefix,"tmp-main");
}
-static void FatalError(void)
+static void FatalError(int lineNo)
+{
+ printf("Integrity error %d\n",lineNo);
+ if(ext_fatal)
+ ext_fatal();
+
+ while(1){
+ sleep(1);
+ }
+}
+void print_stat(const char *str, struct yaffs_stat *st)
{
- printf("Integrity error\n");
- while(1){}
+ printf("%s inode %d\n",str,st->st_ino);
}
static void UpdateCounter(const char *name, unsigned *val, int initialise)
x[0] + 1 != x[1]){
printf("Error reading counter %s handle %d, x[0] %u x[1] %u last error %d\n",
name, inh, x[0], x[1],yaffsfs_GetLastError());
- FatalError();
+ FatalError(__LINE__);
}
x[0]++;
FSX();
outh = yaffs_open(fullTempCounterName, O_RDWR | O_TRUNC | O_CREAT, S_IREAD | S_IWRITE);
+
if(outh >= 0){
+ struct yaffs_stat tmpstat, oldstat, tmpfstat;
FSX();
+ yaffs_fstat(outh,&tmpfstat);
+ printf("\n\n\n*** Writing file %s inode %d\n",fullTempCounterName,tmpfstat.st_ino);
nwritten = yaffs_write(outh,x,sizeof(x));
FSX();
yaffs_close(outh);
FSX();
+
+ printf("About to rename %s to %s\n",fullTempCounterName,name);
+ yaffs_stat(fullTempCounterName,&tmpstat);
+ yaffs_stat(name,&oldstat);
+ print_stat("old stat",&oldstat);
+ print_stat("new stat",&tmpstat);
+ print_stat("new fstat",&tmpfstat);
yaffs_rename(fullTempCounterName,name);
FSX();
}
if(nwritten != sizeof(x)){
printf("Error writing counter %s handle %d, x[0] %u x[1] %u\n",
name, inh, x[0], x[1]);
- FatalError();
+ FatalError(__LINE__);
}
*val = x[0];
yaffs_dirent *de;
struct yaffs_stat s;
char str[1000];
+ int error_line = 0;
d = yaffs_opendir(dname);
yaffs_lstat(str,&s);
- printf("%s inode %d obj %x length %d mode %X ",str,s.st_ino,de->d_dont_use,(int)s.st_size,s.st_mode);
+ printf("%s inode %ld %d obj %x length %d mode %X ",str, de->d_ino, s.st_ino,de->d_dont_use,(int)s.st_size,s.st_mode);\
+ if(de->d_ino != s.st_ino){
+ printf(" \n\n!!!! HEY inode mismatch\n\n");
+ error_line = __LINE__;
+ }
+
switch(s.st_mode & S_IFMT)
{
case S_IFREG: printf("data file"); break;
dump_directory_tree_worker(str,1);
if(s.st_ino > 10000)
- FatalError();
+ error_line = __LINE__;
}
+ if(error_line)
+ FatalError(error_line);
+
yaffs_closedir(d);
}
int h;
int r;
int i;
+ struct yaffs_stat st;
unsigned checksum = 0;
- printf("Writing file %s\n",fname);
FSX();
h = yaffs_open(fname,O_RDWR | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
+ yaffs_fstat(h,&st);
+ printf("\n\n\n**** Open writing file %s inode %d\n",fname, st.st_ino);
+
FSX();
if(h < 0){
FSX();
yaffs_close(h);
+ printf("File closed\n");
return 0;
WRITE_ERROR:
result = yWriteFile(fullTempMainName,sz32);
FSX();
if(result)
- FatalError();
+ FatalError(__LINE__);
+ printf("Raname file %s to %s\n",fullTempMainName,fullMainName);
yaffs_rename(fullTempMainName,fullMainName);
FSX();
}
int result;
result = yVerifyFile(fullMainName);
if(result)
- FatalError();
+ FatalError(__LINE__);
}
void NorStressTestRun(const char *prefix, int n_cycles, int do_fsx)
{
+
interleave_fsx = do_fsx;
MakeFullNames(prefix);
+ dump_directory_tree(fullPathName);
FSX_INIT(prefix);
dump_directory_tree(fullPathName);